혼자서 k3s 클러스터에 AI 사주 서비스를 올린 썰

이상한 조합이지만, 지금 이 글은 그 조합 위에서 쓰이고 있다.

명리심리상담사라는 서비스를 만들었다. 사주를 분석해주고, AI가 심리상담을 해주는 웹 서비스다. 그런데 이 서비스의 인프라가 좀 특이하다. k3s 클러스터 위에 FastAPI 백엔드와 React 프론트엔드를 올리고, 만세력 데이터는 MySQL에 저장했다. GPU 파드에서는 Ollama도 돌아가고 있다. 모두 내 방에 있는 작은 서버两台에서 굴러가고 있는 중이다.

이 글에서는 이 서비스가 어떤 구조로 만들어졌는지, 어떤 기술들이 사용되었는지, 그리고 만들면서 어떤 결정들을 내렸는지 정리해보려고 한다.

전체 구성도

서비스의 전체 흐름은 다음과 같다.

  • 사용자 → Google OAuth 로그인 → React 프론트엔드
  • 프론트엔드 → FastAPI 백엔드 (api.imjoe24.com)
  • 백엔드 → MySQL DB (만세력 73,320행 + 사용자 정보)
  • 백엔드 → Groq API (LLM 기반 심리상담)
  • 모든 트래픽은 Traefik Ingress → 각 서비스 파드로 라우팅

클러스터는 Master(192.168.35.13) 1대, Worker(192.168.35.14) 1대로 구성되어 있고, 실제 서비스 파드들은 Worker 노드에서만 실행되도록 nodeSelector를 걸어두었다. HTTPS는 Cloudflare의 와일드카드 인증서(*.imjoe24.com)로 처리하고 있다.

프론트엔드: React 19 + Vite + Chakra UI v3

프론트엔드는 React 19와 Vite로 구성했다. 상태 관리는 Redux Toolkit을 사용했고, UI는 Chakra UI v3를 선택했다. 디자인 컨셉은 19세기 상징주의 화가 Odilon Redon에서 영감을 받았다. Redon의 작품에서 느껴지는 어두운 밤(nocturne), 금빛 새벽(aurore), 몽환적인 꿈(songe), 신비로운 숲(vert)을 컬러 팔레트로 가져왔다.

처음에는 모든 페이지가 각자 Header와 Footer를 import해서 사용했는데, 유지보수가 너무 번거로워졌다. 결국 AppLayout이라는 공통 레이아웃 컴포넌트를 만들어서 모든 페이지를 감싸는 방식으로 리팩토링했다. 페이지마다 3줄이던 코드가 1줄로 줄었다.

백엔드: FastAPI + Python 3.12

처음에는 n8n으로 API 백엔드를 구성했다. n8n의 워크플로우 에디터는 직관적이지만, 복잡한 사주 계산 로직을 표현하기에는 한계가 있었다. 특히 시주(時柱) 계산과 십신(十神) 관계를 n8n의 Code 노드에서 JavaScript로 처리하는데, 테스트와 디버깅이 너무 불편했다. 결국 Python FastAPI로 전면 전환했다.

사주 계산의 핵심은 calenda_data_fixed 테이블에 있는 73,320행의 만세력 데이터다. 이 데이터에 시주 계산(시간 → 지지 → 시천간)과 십신 계산(오행 상생/상극 + 음양) 로직을 추가해서 4주를 완성한다. LLM 기반 심리상담은 Groq API를 통해 처리하고, SSE(Server-Sent Events)로 스트리밍 응답을 구현했다.

인프라: k3s 클러스터

k3s를 선택한 이유는 단순하다. 가볍고, 설치가 쉽고, ARM에서도 잘 돌아간다. 하지만 진짜 매력은 Traefik Ingress를 통한 도메인 라우팅에 있었다.

  • myeonri.imjoe24.com → 프론트엔드 (Nginx, 80번 포트)
  • api.imjoe24.com → FastAPI 백엔드 (8000번 포트)
  • n8n.imjoe24.com → n8n (대부분 FastAPI로 대체, 일부 워크플로우만 남음)
  • jenkins.imjoe24.com → Jenkins CI/CD
  • ollama.imjoe24.com → Ollama GPU 서버 (NodePort 31434)
  • imjoe24.com → 워드프레스 (이 블로그)

CI/CD는 GitHub Webhook을 통해 동작한다. push 이벤트가 발생하면 worker 노드에서 webhook.py가 실행되고, Docker build → containerd import → kubectl rollout restart로 이어진다. 처음에는 이 파이프라인이 자주 실패했는데, 빌드 캐시 문제와 containerd 이미지 import 타임아웃을 수정하면서 안정화되었다. 배포 스크립트가 완전히 자동화된 지금은 커피 한 잔 마시면 배포가 끝나 있다.

현재 상태와 앞으로

지금까지 구현된 기능은 다음과 같다.

  • ✅ 사주 계산 및 원국 분석 (4주, 십신, 12운성, 오행, 신살)
  • ✅ AI 심리상담 (8개 카테고리, SSE 스트리밍)
  • ✅ 오늘의 운세 (일진 기반, 6개 항목)
  • ✅ 만세력 달력 (월별, 일진/음력/절기)
  • ✅ 궁합 분석 (점수 + AI 해설)
  • ✅ 대운 분석 (12운성 라인 차트)
  • ✅ Google OAuth 로그인

아직 하고 싶은 일은 더 많다. 평생 분석 리포트, 이름 풀이, 택일 기능, 그리고 지금 쓰고 있는 이 워드프레스 블로그도 더 꾸며나갈 예정이다.

여기까지 읽어줘서 고맙다. 이 블로그에서는 앞으로 이런 이야기들을 계속 풀어나갈 생각이다. 궁금한 점이나 해볼 만한 아이디어가 있다면 언제든 댓글을 달아주길 바란다.


2026.05.10, 규훈

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다