• 5.9.0

    5.9.0 주요 변경사항

    web · 보안 헤더(CSP)

    • 강제 CSP를 web이 소유합니다. proxy.ts가 HTML 문서 요청마다 nonce를 만들고 script-src에 'nonce-…' 'strict-dynamic'을 보내므로 'unsafe-inline'이 빠졌습니다. 존재하지 않는 경로의 404 HTML에도 CSP가 정확히 하나 붙습니다.
    • Nginx는 문서 CSP를 떼고 /api/* 응답에만 default-src 'none' CSP를 붙입니다. 위반 수집(report-to)은 두지 않습니다.
    • Cloudflare Web Analytics는 edge 자동 주입 대신 nonce를 붙인 수동 beacon으로 넣습니다. 선택 환경 키 CLOUDFLARE_WEB_ANALYTICS_TOKEN(runtime)이 비어 있으면 beacon을 넣지 않습니다.

    web · 화면 정리

    • 다른 탭·역할에서만 보이는 컨트롤을 위해 예약하던 빈 공간을 없앴습니다. 북마크 작가·그룹 탭 위 약 150px, 좁은 화면 홈 검색 줄 아래 약 70px, 고급 검색 포함·제외 태그 영역의 고정 높이 공백이 사라졌습니다.
    • 정렬 버튼·숨긴 북마크·숨긴 기록 버튼, 설정의 select·segmented를 내용 폭으로 줄였습니다.
    • 운영 관리 상태 badge를 내용 폭으로 바꾸고 보조 문구와 한 줄에 두어 모든 section 제목 줄이 같은 높이입니다(좁은 화면 포함). 좁은 화면 북마크에서 세 탭이 모두 보입니다.
    • 홈 마지막 검색 조건 저장 형식에 version: 2를 둡니다. 옛 형식은 계속 읽습니다.

    crawler

    • SIGTERM·SIGINT에서 새 요청을 받지 않고 진행 중인 요청을 최대 15초 마친 뒤 수집은 user stop과 같은 안전 위치에서, GC는 현재 삭제 단위를 끝낸 뒤 멈추고 종료합니다(전체 예산 50초). 종료 중 다시 받은 신호는 무시합니다. 재시작 뒤 복구 판정(재개 대기)은 기존과 같습니다.
    • 루트 GET /status와 GET garbage-collection/orphan-audit를 지웠습니다(backend는 5.8.0부터 호출하지 않습니다).

    backend · DB

    • 이어 읽기 조회 GET /api/reading-progress/continue를 지웠습니다(web은 5.8.1부터 호출하지 않습니다).
    • 운영 scan이 0회인 idx_images_page_number(32MB)를 DropImagesPageNumberIndex migration이 DROP INDEX CONCURRENTLY로 지웁니다.

    기타

    • 기반 이미지 node:24-alpine·nginx:alpine digest를 갱신했습니다.
    • 운영 가이드에서 5.3.0 rollback 안내를 지웠습니다. backend·crawler rollback 하한은 5.4.0입니다.

    API 제거·migration·CSP 소유 이동이 있지만 현재 web·backend는 지운 경로를 쓰지 않고 필수 환경 키·데이터 재설정이 없어 minor 5.9.0으로 게시합니다.

    이미지 게시 범위

    • 새로 빌드(5.9.0·latest): backend·crawler·web(코드·기반 이미지), nginx(CSP 소유 이동·기반 이미지).
    • digest 재사용: byedpi(5.4.0 digest). 빌드 입력이 같아 기존 digest에 5.9.0·latest 태그만 붙였습니다.
    • 다섯 이미지 모두 5.9.0 태그가 있으므로 IMAGE_TAG=5.9.0으로 고정할 수 있습니다.

    NAS 업데이트와 주의사항

    운영은 운영 반영을 따릅니다.

    • Compose 변경: crawler stop_grace_period: 60s, web CLOUDFLARE_WEB_ANALYTICS_TOKEN(선택). 5.9.0 태그의 compose.yml·.env.example을 받아 배포합니다.
    • DB migration 1건: DropImagesPageNumberIndex(transaction 밖 DROP INDEX CONCURRENTLY, 쓰기 차단 없음).
    • crawler 교체: backend migration 때문에 crawler가 멈추므로 실행 중인 수집 job은 재개 대기가 되며 운영 화면에서 재개합니다.
    • Web Analytics: 배포 직후 edge 자동 주입 beacon은 nonce가 없어 CSP에 막힙니다. 계속 쓰려면 Cloudflare 대시보드를 JS snippet 수동 설치로 바꾸고 .env.production에 CLOUDFLARE_WEB_ANALYTICS_TOKEN을 넣습니다(Cloudflare 설정).
    • rollback: 5.8.1로 되돌릴 수 있습니다(지운 index는 down migration 없이도 이전 이미지가 쓰지 않습니다).

    5.8.1 대비 전체 변경

    검증

    • b2313612(Release 직전 main)에서 개발 stack 재빌드, run-unit.ps1 -Workspace all(backend 611·crawler 926·web 1,703 tests), run-operations.ps1 -DeploymentOnly, run-integration.ps1 전체, run-compose-compat.ps1(5.8.1과 3조합), run-upgrade.ps1(5.8.1 → 5.9.0, deploy-script·watchtower 모두 PASS, 1초 넘는 lock 대기 0)이 통과했습니다.
    • run-schema.ps1, run-crawler-recovery.ps1(중복 SIGTERM·GC 삭제 단위 중 SIGTERM 포함), run-search-benchmark.ps1, 이미지 검색·운영 UI와 북마크 UI 격리 좌표 검사는 같은 코드의 작업 브랜치에서 통과했습니다.
    • 운영 DB 읽기 전용 측정(2026-10-17)으로 index 제거를 판정했습니다. 실제 Hitomi·E-Hentai 통신, 운영 Cloudflare edge·Web Analytics, 실기기·Safari 확인, 운영 배포는 NOT RUN입니다. web UI 정리는 독립 리뷰 없이 병합했습니다.

    게시 확인

    • 릴리스 소스: 5fea7c20aa2f310030e08d64c167a857b512e4c9 (annotated Git 태그 5.9.0 대상).
    • web 5.9.0·latest: sha256:bb56382ac86e2df9b64465bcebf74678ab27ad1ae5dac7d4000fa5e83446d54d
      • linux/amd64 manifest: sha256:bd8fccf42ddaa920619f8e0073f41871f2f7263546cc509ecb703e9ad40c90ba
    • backend 5.9.0·latest: sha256:bb958cb7eb484cc02cb6ceceb45611a8e130ce0733ad446d40c54239a83d56b7
      • linux/amd64 manifest: sha256:832435a26f007562a2be21fcab31f6c01cfe69e7425a48139807e2b965f113de
    • crawler 5.9.0·latest: sha256:766a65a10e5f315cdb80e8a6ceeb648afb64310844887a2a2b83f208d65741b4
      • linux/amd64 manifest: sha256:353f25e027769e38933eb501449c5150226b8604d2cbe5e4379904e0e97df6cb
    • nginx 5.9.0·latest: sha256:57ffc6290032122447f91d8d0c78641443eb283b7a1d5888175dec4a5a4dd837
      • linux/amd64 manifest: sha256:4a4223e37f77747547fb5ddb87165d8589c76d68306c87a4777d709efdd0aff5
    • byedpi 5.9.0·latest(5.4.0 digest 재사용): sha256:04cf2838499d67a033a3c3101913563bf983e551fee27b891dab0d2f75a4233a
    • ops/publish-images.ps1 -Version 5.9.0 -Publish를 재시도 없이 완료했고 다섯 서비스의 5.9.0·latest 일치를 확인했습니다(Registry tags verified for 5.9.0.).
    Downloads 2