Skip to content

v1.10.1 — AIGEN GA + secrets sync + observability

Choose a tag to compare

@beyondwin beyondwin released this 17 May 11:18
· 478 commits to main since this release

Highlights

  • In-app AI 세션 생성 GA: 호스트 세션 편집기 안에서 LLM(OpenAI gpt-5.4-mini, Gemini gemini-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.sqlclub_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_ENABLEDREADMATES_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_IMAGE GitHub 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(호스트), 503 AI_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 응답으로 활성 확인.