세 가지를 함께 고쳤다. 러시아 편에서 고리키와 어머니의 단서가 서로의 정답을 그대로 담고 있어 두 칸이 한꺼번에 풀렸다. 양쪽 단서에서 상대 이름을 뺐다. 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>
25 lines
1007 B
Docker
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
|