• 5.0.0

    4.8.1 대비 변경사항

    GC와 원본 보존

    • GC를 삭제 대기 이미지(unreferenced), 블랙리스트 갤러리(blacklisted), 완료 상태 불일치(completion), 불완전한 갤러리(orphaned)의 네 분류로 통일했습니다. 불완전한 갤러리는 통계 전용이며 삭제하거나 회수 용량에 포함하지 않습니다.
    • 확인된 업스트림 404는 sourceRemovedAt으로 기록하고 기존 원본·완료 시각·개인 기록을 보존합니다. 승인된 metadata 404를 DB에 기록한 뒤 coverage를 확정하며, marker 저장 실패·정지·오류·업스트림 의심 상태에서는 확정을 보류합니다. 재시작 때 확인된 404 coverage를 다시 열지 않고 명시적 재검사와 성공 metadata의 marker 해제를 지원합니다.
    • 페이지 trim·무결성 repair의 pending 원장을 전체 갤러리 삭제 의도로 추정하지 않도록 고쳤습니다. 명확한 블랙리스트 claim은 원본이 모두 정리된 뒤에도 마지막 갤러리 삭제를 재시도합니다. 원본이 없는 deleted-only legacy tombstone은 모호한 상태로 보호하고 완료 시각과 관계없이 불완전 통계에 포함합니다.
    • 404 미완료 갤러리의 개인 기록 쓰기·병합·내보내기와 관리자 페이지 조정을 보호합니다. 완료된 404의 기존 개인 쓰기와 일반 미완료·태그 차단 정책은 유지합니다. 홈 일괄 GC의 즉시 숨김과 내부 쓰기 보호도 유지합니다.

    UI/UX와 의존성

    • GC 초기 미리보기 설명과 정상 완료의 지속 안내를 제거하고 진행·실패·중단·남은 실패 경고와 실제 미리보기 결과를 유지했습니다.
    • 썸네일 안내를 한 줄로 줄이고 저장 원본·썸네일 수와 용량을 실행 버튼 행 오른쪽 하단에 배치했습니다. 좁은 화면에서는 다음 행으로 줄바꿈합니다.
    • web의 lucide-react를 1.51.0으로 갱신했습니다.

    운영 문서

    • Cloudflare WAF·rate limit·Cache Rule·Cache Deception Armor·URL 정규화와 적용 확인·롤백 안내를 정리했습니다. 실제 zone 설정 변경이나 운영 Cloudflare 경유 검증 결과는 아닙니다.

    API 비호환과 필수 업데이트 안내

    GC stats/result/failures의 deleted 필드와 요청 includeDeleted가 제거됐으므로 기존 API 사용자는 blacklisted·includeBlacklisted로 전환해야 합니다. 이 API 비호환을 근거로 major 5.0.0을 적용합니다. 저장된 구형 실행 결과의 deleted 수·용량·실패는 blacklisted에 합쳐 반환하지만 제거된 요청/API 계약을 복원하지 않습니다. 자동 데이터 보존 migration 자체는 major 결정 이유가 아닙니다. private package/lock 버전은 유지하고 제품 버전은 Git 태그·OCI label로 관리합니다.

    backend 시작 시 UnifyGarbageGalleryCategories1791770000000 migration이 자동 적용됩니다. 기존 deleted-only 행의 원인 시각을 보존하고 ready 원본이 있는 행만 삭제 표시를 해제하며 구형 GC 통계 snapshot을 무효화합니다. gallery·image·개인 행과 완료 시각을 삭제하지 않습니다. forward-only migration으로 down을 지원하지 않고 이미지 rollback만으로 DB를 되돌릴 수 없습니다. 대량 갱신과 이미지 존재 검사에 SET LOCAL statement_timeout = 0을 쓰며 운영 규모의 실행·잠금 대기 시간은 미측정입니다.

    모호한 legacy tombstone의 전체 삭제 또는 복구는 운영자가 원래 의도를 확인하고 별도 승인된 운영 조치로 수행해야 합니다. 남은 원장만으로 완전한 자동 복원이나 이미 소실된 원본 복구를 보장하지 않습니다. DB 전환 정책을 확인합니다.

    이미지 게시 범위

    publish-images.ps1 -ChangedOnly로 production 빌드 입력이 바뀐 backend·crawler·web을 새로 빌드하고 5.0.0·latest를 게시했습니다. 각 앱 코드와 shared·root lockfile의 COPY 입력이 바뀌었고 web은 production Turnstile 빌드 인자도 지문에 포함합니다. nginx·byedpi는 Dockerfile·COPY/ignore·옵션·플랫폼 입력 지문이 같아 기존 latest digest를 유지하고 5.0.0 태그를 추가하지 않습니다. log-reader는 backend 이미지를 공유하고 PostgreSQL·Redis·Silo는 자체 이미지 게시 대상이 아닙니다.

    NAS 업데이트

    이번 작업은 이미지·Git·Forgejo 게시이며 NAS 배포나 운영 데이터 변경은 실행하지 않습니다. 4.8.1 대비 Compose·환경 키·배포 스크립트는 같지만 fresh SQL과 자동 migration이 바뀌었습니다. 운영자는 운영 반영의 릴리스 파일 준비와 배포 스크립트를 사용합니다. backend 교체 전에 crawler를 멈추는 스크립트 순서를 유지하고 새 backend migration 성공 뒤 새 crawler·web과 backend 이미지를 공유하는 log-reader를 반영합니다. 개별 web 교체만으로 이번 전환을 완료할 수 없습니다.

    마지막으로 기록된 NAS 배포는 4.6.0입니다. 이 이력은 현재 운영 버전 확인을 대신하지 않습니다. 이전 버전에서 올라오면 4.8.0 릴리스 안내와 현재 운영 가이드를 함께 확인합니다.

    알려진 주의사항

    • ChangedOnly로 일부 서비스에만 5.0.0 태그가 있으므로 전체 IMAGE_TAG=5.0.0 지정이나 일괄 rollback은 불가합니다. 운영은 기본 latest를 사용하고 rollback은 서비스별 digest·Compose·현재 DB migration 호환성을 확인합니다.
    • 운영 NAS migration 시간·잠금·부하, 모호 tombstone의 의도 확인/삭제/복구, 실제 Hitomi/E-Hentai 통신, 운영 기기·실제 Cloudflare 화면·개발 공유 화면 반영은 NOT RUN입니다. 기존 운영 검증 미확인 항목을 이번 릴리스로 해소했다고 표시하지 않습니다.

    4.8.1 대비 전체 변경

    검증

    • 최종 gc4 7767270d와 같은 입력의 인수 증거를 재사용했습니다: backend 70 suites/436 tests 및 lint/typecheck, crawler 63/685와 마지막 coverage 선택 1/9 및 lint/typecheck(중복 합산하지 않음), fresh/migration schema, 실제 PostgreSQL·MinIO 원본/개인 행 보존 통합, metadata 14 cases와 3종 fresh-process recovery.
    • web 전체 초기 실행은 125 suites/962 tests PASS와 1 test spy 실패였고, 보완 후 영향받은 GC 12 tests 및 전체 lint/typecheck PASS로 인수됐습니다. 최종 full web/all 재실행은 NOT RUN이며 단일 all PASS로 표현하지 않습니다.
    • 최종 동일 입력 production build·통합 브라우저 1440/320px와 독립 운영 UI 1440/320px PASS를 재사용했습니다. API/source/provider mock과 합성 fixture의 한계를 유지합니다. production Turnstile arg는 통합 fixture와 달라 이번 실제 게시 production build 성공을 별도로 확인했습니다.
    • 이번 완료 이력 수정의 문서 21개·로컬 링크/anchor 439개 오류 0, quiet Compose config 두 종류와 Git diff 통과를 확인했습니다. 공유 개발 stack·local 이미지 태그는 변경하지 않습니다.

    게시 확인

    • 릴리스 소스: 18a87ae2ca960824a214dedfc35c7f30c9f6d27d (annotated Git 태그 5.0.0 대상).
    • byedpi 기존 latest: sha256:15ac60ab852a92219573aa3e3795f700e9da0692022af47233590e6a78a1a40a, OCI version 3.0.5·revision 89c34755db3b5b2105a0b3124ff7f86014d9223a·입력 지문 유지와 5.0.0 태그 부재를 확인했습니다.
    • nginx 기존 latest: sha256:e40f31f88d0af2c48b739d2cd3165cefcfd83e92603510b4b0c22fe3010df7ee, OCI version 4.8.0·revision b70e66b9764958941ca663bc2e53e65b5e671573·입력 지문 유지와 5.0.0 태그 부재를 확인했습니다.
    • backend 5.0.0·latest OCI index digest: sha256:85affabef49fe42c77f144d80dbab1ac74351c571130bf7283db28daa90b07d5. linux/amd64 platform manifest: sha256:90f7b131691538943996b95e7453a2424712a4d97382b2ebf89a4c1fe65c5cb8. OCI version 5.0.0·revision 18a87ae2ca960824a214dedfc35c7f30c9f6d27d·입력 지문 f0c803d38211c5cac15ed538bc5f42c40918f277f02487780d57b36ddb75dc4a 일치를 확인했습니다.
    • crawler 5.0.0·latest OCI index digest: sha256:23b843708095fdeb3ce6ae1c1fa55d0d4d5538ae88c57dced1d478e80225937c. linux/amd64 platform manifest: sha256:e53059a560c0ce51ff24592dcdbbc160c4c164822917ebb499c70ef297708c7c. OCI version 5.0.0·revision 18a87ae2ca960824a214dedfc35c7f30c9f6d27d·입력 지문 6baa627b9554fd7d9b605f0d21feada8198fa1b6e63a2ca788b0a81ac6d7d1a1 일치를 확인했습니다.
    • web 5.0.0·latest OCI index digest: sha256:ec86a242f7546a471f414b4af6eeda85eee93ca9d83d9c4cf0b211e830d2165e. linux/amd64 platform manifest: sha256:44e6f36f69480d38f44f4e5789552c6f9917b1508576d89778956e41d3c4a803. OCI version 5.0.0·revision 18a87ae2ca960824a214dedfc35c7f30c9f6d27d·입력 지문 2a009cd7567951b500d0b5ff035b3c2d9f62d1d888f71fdc0208e6bd8931cea7 일치를 확인했습니다.
    • 첫 version push는 세 서비스의 registry unknown 오류로 exit 1, latest 미승격 상태에서 중단했습니다. 원격 version 태그 부재와 latest 불변을 확인한 뒤 coordinator 승인으로 자식 프로세스에만 COMPOSE_PARALLEL_LIMIT=1을 적용한 controlled retry 한 번이 exit 0으로 성공했습니다. 서버 오류 원인은 미확정이며 동시성이 원인이었다고 단정하지 않습니다. 캐시를 사용했고 no-cache·ForceRebuild·auth/daemon 설정 변경은 없었습니다.
    Downloads 2