diff --git a/README.md b/README.md index e879d7a..f1162bd 100644 --- a/README.md +++ b/README.md @@ -152,12 +152,13 @@ Caddy의 runtime logger는 reverse proxy 오류에도 요청 정보를 남길 ## 프런트엔드 캐시 정책 -Gateway와 profile frontend의 Vite build는 `/gateway/assets/`, -`//assets/` 아래 파일명에 8자리 content hash를 붙입니다. 내부 Caddy는 -이 형식을 만족하는 JS, CSS, source map과 기타 build asset에 +Gateway frontend의 Vite build는 `/gateway/assets/`, profile 공용 Vite build는 +`/gateway/profile-assets//assets/` 아래 파일명에 8자리 content +hash를 붙입니다. 내부 Caddy는 이 형식을 만족하는 JS, CSS, source map과 기타 build asset에 `Cache-Control: public, max-age=31536000, immutable`을 적용합니다. 새 build는 내용이 달라지면 URL도 달라지므로 배포와 rollback 뒤에도 기존 URL의 장기 cache를 -재사용할 수 있습니다. +재사용할 수 있습니다. 같은 commit을 쓰는 일곱 profile은 같은 공용 URL을 사용하므로 +브라우저가 profile을 옮겨도 이미 받은 JS, CSS와 source map을 다시 전송하지 않습니다. `index.html`, router fallback, `terms.*.html`처럼 URL이 고정된 HTML은 이 정책에 포함하지 않습니다. Caddy는 이 응답에 `Cache-Control: no-cache`를 적용하여 @@ -168,13 +169,20 @@ content-hashed URL로 옮겨야 합니다. ## 정적 frontend와 격리 builder -운영 frontend는 `vite preview`로 제공하지 않습니다. Gateway와 profile build는 -`frontend-artifacts` named volume의 commit/digest 기반 불변 디렉터리에 복사되고, +운영 frontend는 `vite preview`로 제공하지 않습니다. Gateway build와 profile 공용 +build는 `frontend-artifacts` named volume의 commit/digest 기반 불변 디렉터리에 복사되고, runtime은 검증된 release의 `current` 심볼릭 링크만 원자적으로 교체합니다. Caddy는 이 volume을 read-only로 mount하여 직접 제공합니다. 첫 전환과 명시적 개발 모드를 위한 preview reverse-proxy fallback은 남아 있지만 운영 PM2에는 Vite process가 없습니다. +Profile Vite bundle은 commit과 공개 환경이 같으면 한 번만 생성되어 +`game-assets/releases/`에 게시됩니다. 각 profile의 `current`에는 +profile base path, API/SSE URL과 Gateway URL을 담은 JSON `