v1.4.0
Highlights
ReadMates v1.4.0은 운영 배포 경로를 OCI Docker Compose stack 기준으로 정리하고, 멤버가 받는 이메일 알림을 plain text fallback이 있는 HTML 템플릿으로 개선한 릴리즈입니다. 로그인 필요 화면에서 로그인 후 원래 앱 경로로 돌아오는 흐름도 safe returnTo 기준으로 정리했습니다.
Added
- OCI backend Docker Compose stack 전환 보고서를 추가해 Caddy/Spring/Redis/Redpanda cutover, BFF secret 불일치 원인, 검증 명령, 후속 운영 과제를 공개-safe placeholder 기준으로 기록했습니다.
- 알림 이메일 subject/plain/HTML copy를 함께 렌더링하는 서버 템플릿 helper와 SMTP MIME 발송 경로를 추가했습니다.
- Docker 기반 OCI compose backend runtime과 versioned server image 배포 절차를 추가했습니다.
- 제품 릴리즈 버전 source of truth, server/frontend 공통 tag 기준, OCI server image tag 기준을 정리한 버저닝 문서를 추가했습니다.
Changed
- 현재 운영 runbook과 README 링크를 v1.3.0 이후 기준에 맞춰 Cloudflare Pages + OCI Compose stack 중심으로 정리했습니다. Legacy Spring Boot JAR 배포는 compose cutover 검증과 rollback 경로로만 문서화합니다.
- 로그인 guard, loader, API 401, dev-login, OAuth 시작 흐름이 안전한 relative
returnTo만 보존하도록 정리했습니다. - 호스트 테스트 메일은 redesigned template path를 사용하고, 실제 알림 이메일은 HTML body와 plain text fallback을 함께 발송합니다.
- Cloudflare Pages Functions의 BFF/OAuth proxy helper가 upstream origin, trusted forwarding header, internal response header stripping을 일관되게 처리하도록 정리했습니다.
- 릴리즈 배포 시 서버 image tag를 제품 tag와 맞춰
readmates-server:vMAJOR.MINOR.PATCH로 지정하는 기준을 문서화했습니다.
Fixed
- Cloudflare Pages Functions는
READMATES_API_BASE_URL의 query string/fragment를 upstream origin으로 전달하지 않고, BFF secret source를 dedicatedREADMATES_BFF_SECRET하나로 고정합니다. - Compose Caddy와 legacy rollback Caddy 문서 기준을 request URI와
Authorization,Cookie,X-Readmates-Bff-Secretrequest header 미기록으로 맞췄습니다. - 호스트 알림 상세 API가 raw plain/HTML 이메일 본문을 노출하지 않도록 문서화된 privacy boundary를 맞췄습니다.
- Kafka notification publisher adapter autowiring 경계를 정리해 Kafka flag가 꺼진 환경에서 불필요한 publisher bean 요구를 피합니다.
Deployment Notes
이 릴리즈는 서버 코드, Cloudflare Pages Functions, 프론트엔드 route/auth 흐름, OCI backend compose 배포 스크립트를 함께 포함합니다. 권장 순서는 서버 compose stack을 READMATES_SERVER_IMAGE=readmates-server:v1.4.0으로 먼저 배포한 뒤 v1.4.0 tag push로 Cloudflare Pages frontend와 Pages Functions를 배포하는 방식입니다.
v1.3.0 이후 새 Flyway migration 파일은 없습니다. 운영 DB는 기존 V22 / note_count_query_indexes까지 성공한 상태면 추가 schema migration 없이 앱을 시작할 수 있습니다. 그래도 서버 배포 전에는 기존 운영 백업 기준을 따르고, 배포 후 /internal/health, Cloudflare BFF auth smoke, OAuth start smoke를 확인합니다.
Frontend production 배포는 v1.4.0 tag push가 .github/workflows/deploy-front.yml을 실행하면서 시작됩니다. main push만으로는 Cloudflare Pages production 배포가 시작되지 않습니다.
권장 배포 명령:
./server/gradlew -p server clean test
./server/gradlew -p server bootJar
READMATES_SERVER_IMAGE=readmates-server:v1.4.0 VM_PUBLIC_IP='<vm-public-ip>' CADDY_SITE=api.example.com ./deploy/oci/05-deploy-compose-stack.sh
git tag -a v1.4.0 -m "ReadMates v1.4.0"
git push origin main
git push origin v1.4.0운영 smoke:
CLUB_SLUG='{club-slug}'
curl -sS -o /dev/null -w '%{http_code}\n' https://readmates.pages.dev/app
curl -sS https://readmates.pages.dev/api/bff/api/auth/me
curl -sS -o /dev/null -w '%{http_code} %{redirect_url}\n' https://readmates.pages.dev/oauth2/authorization/google
curl -sS "https://readmates.pages.dev/api/bff/api/public/clubs/${CLUB_SLUG}"
READMATES_SMOKE_BASE_URL=https://readmates.pages.dev \
READMATES_SMOKE_AUTH_BASE_URL=https://readmates.pages.dev \
./scripts/smoke-production-integrations.shVerification
pnpm --dir front lintpnpm --dir front test- 49 files, 636 tests passedpnpm --dir front buildREADMATES_E2E_DB_NAME=readmates_e2e_codex_shortname5 pnpm --dir front test:e2e- 22 tests passed./server/gradlew -p server clean test./server/gradlew -p server bootJargit diff --check -- <changed-docs>./scripts/build-public-release-candidate.sh./scripts/public-release-check.sh .tmp/public-release-candidate