BibleCardAI를 로컬 PC에서 Hetzner 클라우드로 이전하면서
BibleCardAI를 로컬 PC에서 Hetzner 클라우드로 이전하면서
BibleCardAI는 성경 구절을 입력하면 AI가 어울리는 이미지를 생성해서 말씀카드를 만들어주는 서비스다. 로컬 서버에서 호스팅하고 있었는데, 과열과 혹사로 SSD가 사망해서 읽기만 가능한 상태로 변해버렸다.
더 좋은 PC를 사서 서빙할까도 생각했지만, 금액, 안정성, 해외 접속을 고려하면 저렴한 클라우드를 쓰는 게 낫다는 판단이었다.
이전 구성
| 항목 | 이전 | 이후 |
|---|---|---|
| 서버 | 로컬 PC (Linux) | Hetzner CX33 (Helsinki) |
| 비용 | 전기세 | €6/월 |
| 가동 | 불안정 (24시간 보장 불가) | 24/7 안정 |
기술 스택
- 서버: Hetzner CX33 (4 vCPU x86_64, 8GB RAM, 80GB SSD)
- k3s: 경량 Kubernetes (단일 노드)
- Helm: 서비스 배포 관리
- Traefik: 리버스 프록시 + Let’s Encrypt 자동 SSL
- Cloudflare: DNS + Proxy (IP 숨김, DDoS 방어)
- 이미지 빌드: 서버에서 직접 Docker 빌드 →
k3s ctr images import(외부 레지스트리 불필요)
삽질 기록
이전 과정에서 겪은 문제들:
- ARM vs x86: 처음에 Hetzner ARM 서버를 골랐다가, 기존 Docker 이미지가 전부 amd64라 안 돌아감. x86으로 재생성
- SSH 포트 변경: 보안 하드닝으로 포트를 22→2222로 바꿨는데, 이후 모든 scp/rsync 명령어에 포트 옵션을 빼먹어서 삽질
- NetworkPolicy: k3s의 NetworkPolicy가 Traefik→서비스 트래픽을 차단해서 502 에러. 임시 비활성화
- cert-manager zone ID: Cloudflare API 토큰에 Zone Read 권한이 없어서 와일드카드 인증서 발급 실패. Traefik 자체 ACME로 우회
- 이미지 이름 불일치: Docker 빌드 이름(
backend_auth-route)과 Helm 템플릿 이름(backend_auth_route)이 달라서 ErrImageNeverPull - secrets namespace: 시크릿 파일에
namespace: blessflow-prod로 되어있는데 실제 namespace는prod. 한참 찾음 - Google OAuth PKCE: 최신
google-auth-oauthlib라이브러리가 자동으로 PKCE를 활성화해서 토큰 교환 실패. 수동 URL 생성으로 우회 - DB 스키마 불일치: payment 서비스 코드는 v2(BCT 시스템)인데 DB 테이블은 v1 스키마. 테이블 드롭 후 자동 재생성
다음 단계
멀티에이전트 시스템이 다음 작업들을 자동으로 생성하고 분배하는 모습
인프라는 해결했으니, 이제 서비스 자체를 개선할 차례다. 자세한 업데이트 방향은 다음 글에서.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.