Skip to content

v1.4.0

Choose a tag to compare

@beyondwin beyondwin released this 30 Apr 13:42
· 2075 commits to main since this release

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를 dedicated READMATES_BFF_SECRET 하나로 고정합니다.
  • Compose Caddy와 legacy rollback Caddy 문서 기준을 request URI와 Authorization, Cookie, X-Readmates-Bff-Secret request 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.sh

Verification

  • pnpm --dir front lint
  • pnpm --dir front test - 49 files, 636 tests passed
  • pnpm --dir front build
  • READMATES_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 bootJar
  • git diff --check -- <changed-docs>
  • ./scripts/build-public-release-candidate.sh
  • ./scripts/public-release-check.sh .tmp/public-release-candidate