• 5.5.0

    5.4.0 대비 변경사항

    수집·crawler 복구

    • crawler가 강제 종료(kill·OOM·컨테이너 재시작)된 뒤 다시 뜨면, 이 crawler가 소유했던 running 수집 job을 stopped(summary.recovery='interrupted')로 정리합니다. 그래서 metadata 재확인과 배경 작업이 실행 중 신호에 막히지 않고, 운영 화면도 수집 중으로 보이지 않습니다. 재개는 기존 자동 재개(Hitomi 보호 cooldown 뒤, 20:00 예약)와 수동 재개가 맡습니다.
    • 기동 복구가 끝나기 전에는 예약 실행·자동 재개·수동 시작을 받지 않습니다. 복구는 pipeline 잠금 안에서 상태를 다시 읽고, 그 사이 다시 시작된 작업은 건드리지 않습니다.
    • crawler 재시작이 이미 끝난 Hitomi 작업을 실행 중으로 되살리던 문제를 고쳤습니다.
    • 운영 5.4.0 기준으로 옛 checkpoint 형식 수용을 정리했습니다.
      • E-Hentai의 실행 시작 시각(historyBeforeAt)이 없는 checkpoint와 Hitomi retry mode checkpoint는 자동 보정하지 않고 복구 오류로 남깁니다.
      • 원장 대조 카운터가 없는 저장소 점검 checkpoint는 새 점검으로 시작합니다.
      • 2026-10-12 운영 DB 점검에서 세 형식 모두 0행이었습니다. 작업 이력의 retry 표시는 유지합니다.

    홈·화면

    • 홈 화면의 이어 읽기 줄을 없앴습니다.
    • 대시보드 요약 카드를 컴팩트하게 바꾸고, 기간·전체·읽는 중·완독 선택을 읽기 기록 제목 줄로 옮겼습니다.
    • 홈 이미지 검색 결과는 공유 링크와 같은 경로로 엽니다.
    • 홈 guest 읽기 탭이 저장된 완료 여부로 거르지 못하던 문제를 고쳤습니다.
    • 홈 일괄 GC와 상세 화면의 갤러리·작가 차단 뒤 전역 차단 목록이 바로 갱신됩니다.
    • 오류·결과 상태 표시를 공용 컴포넌트로 통일했습니다.

    데이터·번역

    • 2026-10-11 누락 태그 146개 검토 결과를 번역 사전에 반영했습니다.
    • 새 설치의 기본 전역 블랙리스트를 2026-10-11 운영 내보내기 147개와 맞췄습니다. 기존 설치의 차단 목록은 바뀌지 않습니다.
    • DB migration DropUnusedCounterColumns1792090000000가 읽지 않는 컬럼을 지웁니다. 대상은 crawling_states 카운터 5개와 duplicate_scan_settings.common_revision입니다.

    API·보안

    • 보안 헤더는 Nginx만 붙입니다. 브라우저가 받는 값은 원래도 Nginx 값이었으므로 바뀌지 않습니다.
    • 다음 API를 제거했습니다. 운영 중인 5.4.0 web은 이 경로를 호출하지 않습니다.
      • GET /api/auth/profile → GET /api/auth/check
      • DELETE /api/blacklist/galleries/:galleryId → DELETE /api/blacklist/:id
      • 관리자 GET /api/health 루트 → 버전 확인은 GET /api/health/detailed
      • 관리자 GET /api/tags(전체 사전)와 GET /api/tags/popular의 namespace 파라미터
      • GET /api/image-search/status
      • GET /api/health/dependencies/report
      • backend의 crawler health·status·logs/tail·garbage-collection/orphan-audit(GET) 프록시
    • POST /api/bookmarks는 이제 galleryId만 받습니다. 옛 category·priority·note를 보내면 400입니다(5.4.0 web은 보내지 않음).
    • 중복 해결 요청의 잘못된 ID는 500 대신 400입니다. 갤러리 404 응답은 내부 context 없이 문자열 message를 돌려줍니다.
    • MinIO 실패를 의존성 상태 전체 판정에 반영해 readiness와 맞췄습니다.

    운영 도구·문서

    • 운영 DB의 호환 상태를 읽기 전용으로 점검하는 ops/compat-state-audit.sql을 추가했습니다.
    • ops/production-soak.sh가 배포 서비스 전체의 재시작·OOM을 표본으로 수집합니다.
    • 문서를 현재 코드에 맞춰 정리했습니다.
      • README를 소개·첫 실행 중심으로 재구성했습니다.
      • Cloudflare 설정을 docs/Cloudflare_설정.md로, 태그 번역 출처를 docs/태그_번역_검토_근거.md로 분리했습니다.
      • 운영 가이드·아키텍처·DB 정책을 압축했습니다.

    필수 환경 변수·compose.yml 변경·수동 전환·데이터 재설정이 없습니다. 5.4.0 이미지·Compose와 새 버전의 교차 조합도 동작합니다. 제거한 API는 운영 5.4.0 web이 호출하지 않으므로 이전 minor 릴리스와 같은 기준으로 minor 5.5.0을 적용합니다. 제품 버전은 Git 태그·OCI label·문서로 관리하며, private package와 lockfile의 버전은 유지합니다.

    이미지 게시 범위

    • 새로 빌드(5.5.0·latest): backend·crawler·web. 소스와 shared가 바뀌어 production 빌드 입력 지문이 기존 latest와 달랐습니다.
    • digest 재사용: byedpi·nginx. 빌드 입력이 5.4.0과 같아 기존 digest에 5.5.0·latest 태그만 붙였습니다. 두 이미지의 OCI version·revision label은 5.4.0 빌드 값(c6c0fbb9)으로 남습니다.
    • 모든 자체 이미지에 5.5.0 태그가 있으므로 IMAGE_TAG=5.5.0을 지정할 수 있습니다.

    NAS 업데이트와 주의사항

    운영자는 운영 반영을 따릅니다.

    • Compose·환경 파일: 5.4.0 이후 compose.yml과 .env.example이 바뀌지 않았습니다. Watchtower의 이미지 교체만으로 반영됩니다. ops/deploy-production.sh는 안내 문구만 바뀌었습니다.
    • DB migration 1개: DropUnusedCounterColumns1792090000000가 backend 시작 때 자동 적용됩니다. DROP COLUMN IF EXISTS라 실행이 짧습니다.
      • 5.4.0 backend·crawler는 두 컬럼을 참조하지 않습니다. 그래서 Watchtower가 backend를 먼저 교체해도 실행 중인 5.4.0 crawler가 깨지지 않습니다.
      • run-upgrade.ps1 결과: deploy-script·watchtower 두 모드 모두 PASS, 1초 넘는 잠금 대기 없음.
    • rollback 제한: migration은 forward-only입니다. 적용 뒤에는 backend·crawler를 5.4.0 미만으로 되돌릴 수 없습니다. 레지스트리에는 5.2.0 이하 이미지 태그가 이미 없습니다.
    • 열려 있는 옛 탭: 5.4.0 이전 web을 연 채로 둔 브라우저에서 북마크를 추가하면 400이 납니다. 새로고침하면 해결됩니다.
    • crawler 재시작: 배포로 crawler가 재시작되면 실행 중이던 수집 job은 새 기동 복구 규칙에 따라 stopped(중단)로 정리됩니다. 재개는 기존 자동·수동 재개 경로를 따릅니다.
    • 로그인 cookie는 그대로 유효하며 다시 로그인할 필요가 없습니다.

    NAS 배포·운영 데이터 변경은 이번 게시에서 실행하지 않았습니다. 다만 latest를 승격했으므로 Watchtower가 켜진 운영 서버는 스스로 5.5.0으로 교체할 수 있습니다.

    5.4.0 대비 전체 변경

    검증

    • 앱 코드 main 93232eb4
      • 개발 stack 재빌드: 전 서비스 healthy, 개발 DB에 새 migration 적용
      • run-integration.ps1, run-passkey.ps1(viewer·admin 등록·인증·로그아웃 폐기), run-operations.ps1 -DeploymentOnly 통과
    • 같은 트리 8bf946fa
      • run-unit.ps1 -Workspace all 통과(backend 589·crawler 890·web 1,661 tests)
      • run-schema.ps1, run-crawler-recovery.ps1(전체·-EHentaiOnly) 통과
      • run-upgrade.ps1 -BuildNew(5.4.0→HEAD) 통과: deploy-script·watchtower PASS
    • 문서 정리 뒤 source 4388bae9(앱 코드 동일)
      • run-compose-compat.ps1 -OldRef c6c0fbb9(5.4.0과 3조합) 통과
      • run-duplicate-benchmark.ps1, run-search-benchmark.ps1, run-translation-coverage.ps1 통과
      • 문서 검증 통과: 로컬 링크 536개 중 깨짐 0, Compose config 2종
    • 각 변경은 병합 전에 읽기 전용 리뷰를 거쳤습니다.
    • 실제 Hitomi·E-Hentai 통신 runner, 운영 DB 재측정, NAS 배포는 NOT RUN입니다.

    게시 확인

    • 릴리스 소스: b0063316d176d290117002a82718e4de44bd7d9d (annotated Git 태그 5.5.0 대상).
    • backend 5.5.0·latest: sha256:270604e67f36928d1a3036470dc16e41a6b6892c1ef795d1a048a817ae660c78
      • linux/amd64 manifest: sha256:3fd8643f4e8e9f6c96807829febcab773efc54eb9a86cae50d09756064e96422
      • OCI version 5.5.0·revision b0063316d176d290117002a82718e4de44bd7d9d
      • 입력 지문 1fcbeb026e5d1ff788369ab7f27a9d950ba032611ea097f6d7437dce29845264
    • crawler 5.5.0·latest: sha256:ea13440ccf2bb1b2674b4b4d884dba6fb3ab87ffb501df7bcc052c8db4f75047
      • linux/amd64 manifest: sha256:4bc2a1d738d56f6bfb52e7aaaf2f9f9fb28e551e9b3e52840e8236a9ce120590
      • 입력 지문 ea64685dd86503279158b2e959ba040c1643a9ad4721aed4f4eddb8da747b0cd
    • web 5.5.0·latest: sha256:4e28146ef95cd75dad8c747b2d4c57873f8d3d40a71d2921ef5c4cab60e21e5b
      • linux/amd64 manifest: sha256:daf3183ed9ffe1e4ccba94b93403da4f0994fac4983d880d6388c5ffc25ad79d
      • 입력 지문 179ef4ad7914c779abdb8085c14bd57a408d668584942993347a3a439f8da943
    • byedpi 5.5.0·latest(5.4.0 digest 재사용): sha256:04cf2838499d67a033a3c3101913563bf983e551fee27b891dab0d2f75a4233a
      • linux/amd64 manifest: sha256:93ea65f6266dc78f928678edb9940720f62d218a7d93cf8e97f03ab3bdb4f670
    • nginx 5.5.0·latest(5.4.0 digest 재사용): sha256:fb3a63eb7be971660a5b8e4936d42d9ce6454e726a121383c060789b10583b40
      • linux/amd64 manifest: sha256:8a09d389b1a8396f2c4620b192694b63537c85b3ca1e31d06806af1461195f19
    • 게시 과정: ops/publish-images.ps1 -Version 5.5.0 -Publish의 첫 실행은 backend·crawler·web 버전 태그 push가 레지스트리 error from registry: unknown으로 실패해 latest를 승격하지 않고 멈췄습니다. 같은 명령으로 다시 실행해 세 서비스를 게시했습니다. 버전 태그 게시 뒤 같은 digest로 latest를 승격했고, 다섯 서비스의 5.5.0·latest 일치를 최종 검증했습니다(Registry tags verified for 5.5.0.).
    Downloads 2