v1.10.1 — AIGEN GA + secrets sync + observability
Highlights
- In-app AI 세션 생성 GA: 호스트 세션 편집기 안에서 LLM(OpenAI
gpt-5.4-mini, Geminigemini-3-flash, Claude 옵션)으로 세션 회차 기록을 초안 생성 → 미리보기 편집 → 커밋하는 전체 흐름이 production에 enable됩니다. Kill switch + provider allowlist + 클럽 월 $20 cost cap이 모두 운영 가능 상태로 출시됩니다. - 운영 시크릿/설정의 단일 source-of-truth: 운영 환경변수와 시크릿 관리를 SSH 편집에서 GitHub Actions
sync-config워크플로로 이관해, 변경 이력이 Git/Actions 로그에 남고 secret 갱신·롤백 절차가 표준화됐습니다. - Observability backbone: BFF → Spring → Kafka → SMTP까지 동일한
X-Readmates-Request-Id가 흐르고 모든 컴포넌트가 JSON 로그를 출력합니다. SLO 카탈로그가 startup schema 검증으로 로드되고, Grafana dashboard 2종과 AI 생성 전용 5개 alert / 8개 panel이 함께 추가됐습니다. - Platform Admin & Design System: 클럽 생성/첫 호스트 셋업/공개 노출/도메인 준비 흐름을 호스트 앱과 분리된 platform admin 권한 경계에서 운영하고, 새 pnpm workspace 루트의
design/system패키지가 디자인 시스템 source-of-truth로 분리됐습니다.
Fixed (v1.10.0 → v1.10.1)
- db:
V31__create_ai_generation_club_defaults.sql의club_id/updated_by컬럼에CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci를 명시해clubs.id와 collation을 일치시켰습니다. 운영 schema 기본 collation이utf8mb4_unicode_ci였던 탓에 새 컬럼이unicode_ci로 생성되어 FK가 거부되던 문제를 해소합니다. - db:
V32__platform_admin_onboarding.sql의 신규invitations.invited_by_platform_admin_user_id컬럼도 동일 이유로character set utf8mb4 collate utf8mb4_0900_ai_ci를 명시해users.id와 정렬했습니다. - deploy:
sync-config워크플로가READMATES_AIGEN_KAFKA_ENABLED와READMATES_AIGEN_KAFKA_BOOTSTRAP_SERVERS환경변수를 운영.env에 전파하도록 보강.AiGenerationOrchestrator가 의존하는AiGenerationJobQueue빈의 유일한 production 구현이 Kafka adapter 이므로, AIGEN 을 켜려면 두 변수가 반드시 함께 설정되어야 합니다.
DB Migration
| Version | 설명 |
|---|---|
| V29 | correlation_request_id_columns — outbox/manual dispatch 테이블에 request_id 컬럼 추가 |
| V30 | create_ai_generation_audit_log — AI 생성 감사 로그 (provider/model/status/token/cost) |
| V31 | create_ai_generation_club_defaults — 클럽별 AI 기본 모델 + 명시적 collation |
| V32 | platform_admin_onboarding — clubs public_visibility, invitations platform-admin inviter FK + 명시적 collation |
전부 forward-only / additive. Rollback 시 schema 추가분이 남지만 v1.9.x 코드는 이를 무시합니다.
Deployment Notes
- Tag push 가
deploy-front.yml(Cloudflare Pages) 와deploy-server.yml(GHCR 빌드 + Trivy + release tag promote) 를 자동 트리거합니다. - 서버 promote 후
READMATES_SERVER_IMAGEGitHub Variable 을:v1.10.1로 bump →sync-config(restart_api=true) 실행 → compose 가 새 이미지로force-recreate. - AIGEN 운영 토글:
READMATES_AIGEN_ENABLED=true,READMATES_AIGEN_ENABLED_PROVIDERS=OPENAI,GEMINI,READMATES_AIGEN_KAFKA_ENABLED=true,READMATES_AIGEN_KAFKA_BOOTSTRAP_SERVERS=redpanda:9092가 모두 prod 변수에 설정되어 있어야 합니다. - 운영 smoke 기대값:
curl /internal/health→{"status":"UP","kind":"liveness"},GET /api/host/clubs/<club>/ai-defaults→ 401(미인증) 또는 200(호스트), 503AI_DISABLED아님, Flyway version=32.
Rollback
READMATES_SERVER_IMAGE 를 :v1.9.0 로 되돌리고 sync-config 재실행. V29~V32 schema 는 남지만 v1.9.0 코드가 이를 참조하지 않으므로 무해.
Verification
CI run 25988435608 (commit 101e0fd): 8 잡 success (Frontend 는 flake 1건, v1.10.1 main 패치로 별도 close). 로컬 ./server/gradlew integrationTest --tests "MySqlFlywayMigrationTest" pass. 운영 V31 collation dry-run pass. 운영 컨테이너 부팅 후 Flyway version=32, /internal/health UP, AIGEN 컨트롤러 401 응답으로 활성 확인.