Skip to main content

인프라

배포 구성

항목
클러스터K3s (1 master + 4 workers)
네임스페이스lumie-backend
Replica3
메모리2Gi per pod (requests = limits)
이미지 레지스트리Zot (zot.lumie-infra.com)

Ingress (Traefik)

K3s 내장 Traefik이 모든 HTTP/HTTPS 트래픽을 처리합니다.

Client → Traefik (워커 노드 80/443)
├── /api/auth → lumie-backend:8080
├── /api/tenant → lumie-backend:8080 (StripPrefix)
├── /api/students → lumie-backend:8080 (StripPrefix)
├── /api/exam → lumie-backend:8080 (StripPrefix)
├── /internal/** → lumie-backend:8080 (HMAC 인증 전용)
├── ...
└── / → lumie-frontend:3000
  • StripPrefix 미들웨어: /api/tenant/v1/tenants/v1/tenants로 path 변환
  • TLS: cert-manager + Let's Encrypt 자동 발급
  • CORS: Spring Boot CorsConfig에서 처리 (Traefik은 라우팅만)
  • JWT 검증: Spring Security JwtAuthenticationFilter에서 처리
  • 내부 엔드포인트: /internal/** 는 HMAC-SHA256 서명 검증(InternalHmacAuthFilter) 후 ROLE_INTERNAL 부여

CI/CD (Tekton)

  • 단일 파이프라인: lumie-springboot-build-deploy (모든 백엔드 변경에 1번 실행)
  • 트리거: lumie-backend 레포 main 브랜치 push
  • 빌드: Kaniko (Dockerfile → ./gradlew :app:bootJar)
  • 배포: ArgoCD GitOps (image tag 자동 업데이트)

데이터베이스

  • PostgreSQL: CNPG (CloudNative-PG) 운영, lumie-db 네임스페이스
  • 커넥션 풀: CNPG Pooler (PgBouncer), 트랜잭션 풀 모드
  • 런타임 롤: lumie_app (NOSUPERUSER NOBYPASSRLS) — 앱 런타임용
  • 마이그레이션 롤: postgres — Flyway 전용. spring.flyway.user/password 분리 설정
  • 멀티테넌시: RLS 기반 행 단위 격리 (단일 public 스키마)
  • 마이그레이션: Flyway (app/src/main/resources/db/migration/)
    • public/ — 플랫폼 테이블 (tenants, users, billing, ...)
    • Flyway 적용 후 마이그레이션 파일 편집 금지 (checksum 불일치 → 부트 실패)

외부 의존성

서비스네임스페이스용도
PostgreSQL (CNPG)lumie-db메인 데이터베이스
Redis Sentinellumie-cacheJWT 블랙리스트, 세션
RabbitMQlumie-eventOMR 채점 비동기 이벤트
MinIOminio파일/이미지 스토리지
Vaultvault시크릿 관리
chatbot-svclumie-workerAI 챗봇 (HTTP SSE, ai 모듈)
grading-svclumie-workerOMR 채점 (HTTP, exam 모듈)
report-svclumie-worker성적표 생성 (HTTP, exam 모듈)

시크릿 관리

Vault → VaultStaticSecret → Kubernetes Secret 패턴:

vaultStaticSecrets:
- name: lumie-backend-db-vss
path: infrastructure/postgresql
destination:
name: lumie-backend-db-secrets
transformation:
templates:
username: "{{ .Secrets.POSTGRES_USER }}"
password: "{{ .Secrets.POSTGRES_PASSWORD }}"

주요 시크릿:

  • lumie-backend-db-secrets — PostgreSQL 자격증명 (lumie_app 런타임 롤)
  • lumie-backend-redis-secrets — Redis 비밀번호
  • lumie-backend-rabbitmq-secrets — RabbitMQ 비밀번호
  • lumie-backend-jwt-secrets — JWT 서명 키, 만료 시간
  • lumie-backend-oauth-secrets — Google/Kakao OAuth 자격증명
  • lumie-backend-minio-secrets — MinIO 접근 키
  • lumie-backend-internal-secrets — HMAC 공유 시크릿 (/internal/** 게이트)

주의: 운영자가 자동 생성하는 시크릿(CNPG *-superuser 등)은 Vault에 미러링하지 않습니다. Vault는 운영자가 생성하지 않는 시크릿(JWT, OAuth, MinIO, lumie_app 비밀번호 등)만 관리합니다.