Files
plparkandClaude Opus 5 9cb8915173 Fix clue leak, stop the 404 fallback, bust the proxy asset cache
세 가지를 함께 고쳤다.

러시아 편에서 고리키와 어머니의 단서가 서로의 정답을 그대로 담고 있어 두 칸이
한꺼번에 풀렸다. 양쪽 단서에서 상대 이름을 뺐다.

nginx 의 try_files 폴백을 =404 로 바꿨다. 페이지가 여럿이 된 뒤로는 없는 경로도
200 으로 셸을 내려주어, 배포가 안 됐는데도 정상으로 보이는 일이 있었다.

프록시(NPM)가 js/css 에 제 캐시 헤더를 덧붙여 원본의 no-cache 를 덮어쓴다.
이미지 빌드 때 자산 내용의 sha256 앞 열 자리를 뽑아 각 페이지의 링크를
assets/crossword.js?v=<해시> 로 바꾸는 단계를 Dockerfile 에 넣었다. 저장소의
HTML 은 해시 없는 상태로 두고, 자산이 바뀌면 URL 이 저절로 바뀐다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 17:56:43 +09:00

25 lines
1007 B
Docker

# ---- 자산 URL 에 내용 해시를 박는 단계 ----
# 프록시(NPM)가 js/css 응답에 제 캐시 헤더(Expires, max-age)를 덧붙이므로
# 원본에서 no-cache 를 줘도 브라우저가 옛 파일을 계속 쓴다. 내용이 바뀌면
# URL 도 바뀌게 해 두어야 새 배포가 제대로 반영된다.
FROM alpine:3.20 AS stamp
WORKDIR /site
COPY site/ ./
RUN set -eu; \
v=$(cat assets/crossword.css assets/crossword.js | sha256sum | cut -c1-10); \
for f in *.html; do \
sed -i -e "s|assets/crossword\.css|assets/crossword.css?v=${v}|g" \
-e "s|assets/crossword\.js|assets/crossword.js?v=${v}|g" "$f"; \
done; \
echo "asset stamp: ${v}"; \
grep -o 'assets/crossword\.[a-z]*?v=[0-9a-f]*' korean.html
FROM nginx:1.27-alpine
# 기본 서버 설정 제거 후 8080 포트용 설정 적용
RUN rm -f /etc/nginx/conf.d/default.conf
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
COPY --from=stamp /site/ /usr/share/nginx/html/
EXPOSE 8080