인프라
배포 구성
| 항목 | 값 |
|---|---|
| 클러스터 | K3s (1 master + 4 workers) |
| 네임스페이스 | lumie-backend |
| Replica | 3 |
| 메모리 | 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 Sentinel | lumie-cache | JWT 블랙리스트, 세션 |
| RabbitMQ | lumie-event | OMR 채점 비동기 이벤트 |
| MinIO | minio | 파일/이미지 스토리지 |
| Vault | vault | 시크릿 관리 |
| chatbot-svc | lumie-worker | AI 챗봇 (HTTP SSE, ai 모듈) |
| grading-svc | lumie-worker | OMR 채점 (HTTP, exam 모듈) |
| report-svc | lumie-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 비밀번호 등)만 관리합니다.