• 4.4.0

    4.3.0 대비 변경사항

    수집(crawler)

    • 이미지 재시도 정리와 429 보호 — page당 최대 40번까지 겹치던 이중 재시도를 page당 한 예산(기본 요청 6회·대기 3분, jitter)으로 합쳤습니다. 이미지 429는 즉시 보호 정지하고 공용 보호 회로를 열어 다른 page도 새 요청을 멈춥니다(Retry-After 존중, 없으면 10분).
    • 이미지 sliding window — "5장 묶음 → 200ms 대기" 대신 동시 5개·시작 간격 120ms로 이어서 받습니다(순간 요청률 상한은 기존 이하). 같은 Hitomi gallery 10개(216장) A/B 표본에서 시간당 11,406장 → 20,010장(+75%), 429·503·실패 0건.
    • metadata 병렬 수집 — 이름과 달리 순차였던 범위 metadata 수집을 동시 3·간격 100ms lane과 100 ID 단위 일괄 조회로 바꿨습니다. ID 순서로 판정하고 첫 오류 뒤 결과는 버립니다. 300 ID 표본에서 ID당 182.7ms → 102.4ms, 429·503 0건.
    • 정지 원인 분류와 자동 재개 — Hitomi 정지를 사용자 중지·원본 보호·일시 오류·반복 불가 실패로 구분해 운영 화면에 표시합니다. 보호·일시 오류 정지는 보호 대기 시각(없으면 5분 → 15분 → 1시간, 하루 12회) 뒤 같은 checkpoint를 자동 재개하고, 보호 대기는 crawler 재시작 뒤에도 유지됩니다. E-Hentai는 기존처럼 관리자 재개입니다.
    • 막는 gallery 격리 — 같은 원인으로 반복 실패하는 gallery를 격리 원장에 넣고 그 ID만 미처리 gap으로 남긴 채 수집을 계속합니다. 운영 화면에서 다시 시도·해제할 수 있습니다. 일시 실패는 지금처럼 멈춥니다.
    • 업스트림 변경 오판정 방지 — 색인에 있는 ID의 404 비율 이상, 수집 시작 canary 실패, 연속 삭제 판정이 나오면 coverage 종결·삭제 표시를 보류하고 멈춥니다(자동 재개 대상).
    • 태그 관계 동기화 — 원본에서 사라진 태그 관계를 삭제합니다(원본 태그가 비어 있으면 유지). 신규 태그는 일괄 생성합니다.
    • 계측 — pHash(phash)와 썸네일 생성(thumbnail) 시간을 db_save와 분리했습니다.

    중복 검사

    • 후보 탐색 반경을 판정 반경(거리 6)에 맞춰 블록 이웃 137 → 17개로 줄였습니다. 이미지 검색은 거리 10 유지.
    • 재현율에 기여하지 않으면서 작품마다 전체 gallery를 훑던 metadata 후보 단계를 제거하고 hash 결과만 비교합니다(같은 작가·그룹은 우선 비교).
    • 대형 앨범 비교를 primal-dual 매칭과 사전 판정으로 바꿔 2,000×2,000 비교가 2.6–3.8초 → 12–93ms가 됐습니다(판정 결과 동일). 그래도 예산을 넘기면 실패 대신 시간 초과로 따로 기록합니다.

    저장소·운영

    • 원장→객체 무결성 점검 — orphan audit가 ready 원장의 객체 누락·크기 불일치도 찾고, 색인 중 누락·체크섬 불일치를 별도로 셉니다. 관리자 확인 후 손상 page를 재수집 대기로 돌리는 복구 명령을 추가했습니다.
    • 카드 썸네일 축소본 — 1페이지로 480px WebP(q75) 파생본을 만들어 카드·북마크·대시보드에 씁니다(개발 표본 원본 대비 약 23%). 원본은 바꾸지 않고, 상세 모달 표지는 원본을 씁니다. 기존 gallery는 운영 화면의 썸네일 생성 백필로 채웁니다. GC·orphan audit가 파생본을 함께 관리합니다.
    • nginx 오류 응답 캐시 차단 — /_next/static·thumbnail·viewer page의 장기 캐시 헤더를 성공 응답(200·206·304)에만 붙이고 404·502 등은 no-store로 바꿨습니다. 배포 중 오류가 Cloudflare에 캐시돼 흰 화면이 되던 문제의 재발을 막습니다.
    • 사용하지 않던 공개 추천 API(/api/recommendations/*)를 제거했습니다.

    화면(web)

    • 뷰어 — 진행률 바를 키보드로 누르면 1페이지로 이동하며 읽기 기록이 지워지던 버그 수정, 접근권 갱신이 한 번 실패해도 화면 유지·자동 재시도, 휠·트랙패드 제스처당 한 장, 드래그 스크러버·페이지 번호 입력·Space·Home/End, 완독 작품은 처음부터, 마지막 장 뒤 종료 카드(북마크·작가 검색·처음부터·닫기). 진행률 저장 실패는 최신 값만 자동 재전송하고 닫기는 막히지 않습니다. 앞쪽으로 이동해도 기록을 지우지 않습니다.
    • 홈 — 검색 결과 수 표시, 원본 게시일 정렬, 추가 로드 실패 시 재시도(완료 문구 오표시 수정), offline 배너와 복귀 시 재조회.
    • 북마크 — 제목·작가 검색과 읽기 상태(안 읽음·읽는 중·완독) 필터, 점진 렌더.
    • 대시보드 — 읽는 중·완독 보기와 기록 개별 삭제.
    • 설정 — 테마 시스템 설정 따름 선택.

    새 기능이 추가되고 기존 데이터·API 사용 방식은 유지되므로 minor 버전입니다. 환경 변수·compose.yml 변경은 없습니다.

    DB migration (backend 시작 시 자동 적용, 데이터 보존)

    • DuplicateHashCandidates — 미완료 중복 검사 항목을 hash 탐색 단계로 전환.
    • ImageLedgerIntegrity — image_integrity_issues 추가, images.storagePath를 COLLATE "C"로 변경(인덱스 재생성, 230만 행 기준 약 1초).
    • AddImageThumbnails — 빈 image_thumbnails 원장 추가.
    • CrawlGalleryQuarantine — 빈 crawl_gallery_quarantine 원장 추가.

    이미지 게시 범위

    운영 빌드 입력 지문을 4.3.0 시점 latest와 대조해 nginx·backend·crawler·web을 새로 빌드하고 4.4.0·latest를 게시했습니다(publish-images.ps1 -ChangedOnly). nginx는 nginx.conf, backend·crawler·web은 앱 코드와 공유 패키지가 바뀌었습니다. byedpi는 입력이 같아 기존 latest digest를 유지하며 4.4.0 태그를 추가하지 않았습니다. redis는 공식 redis:8.10 이미지를 그대로 씁니다.

    NAS 업데이트

    compose.yml·.env.production 변경은 없으므로 저장소 파일을 받을 필요 없이 배포 스크립트만 실행합니다.

    cd /volume1/2ex-hentai
    docker login git.2ex.dev
    sh ops/deploy-production.sh
    docker compose --env-file .env.production ps
    
    • backend 시작 시 위 migration이 자동 적용됩니다.
    • 배포 뒤 운영 관리 → 썸네일 생성에서 백필을 시작해야 기존 gallery 카드가 축소본을 받습니다(동시성 1, 저부하).
    • Cloudflare /_next/static/* Cache Rule의 Edge TTL은 "origin Cache-Control 사용"으로 두세요. 이미 오류가 캐시된 URL은 Custom Purge로 지웁니다(Cloudflare Cache Rule).
    • 이 릴리스는 변경 서비스에만 버전 태그가 있으므로 IMAGE_TAG로 전체 서비스를 일괄 지정할 수 없습니다.

    4.3.0 대비 전체 변경

    검증

    • run-integration.ps1 전체 통과(0214fee2 main 기준): crawler runtime·GC·Push·backend API·중복 검사·이미지 검색·브라우저 회귀.
    • Docker run-unit.ps1: backend 298, crawler 448(이후 crawler-guard 469), web 771 tests 통과. run-schema.ps1, run-crawler-recovery.ps1, run-duplicate-benchmark.ps1, run-search-benchmark.ps1(원본 게시일 p95 최대 27ms), run-operations.ps1 -DeploymentOnly(nginx 오류 캐시 회귀 포함), 격리 운영 UI runner 통과.
    • 실제 Hitomi: run-hitomi-network.ps1(형식 fixture·canary) 통과, 이미지 window·metadata 동시성 A/B 표본.
    • 실제 브라우저의 휠·터치, NAS 썸네일 백필 처리량, 실제 업스트림 경로 변경, NAS 배포는 실행하지 않았습니다.

    게시 확인

    • 릴리스 소스: 0214fee2dc93bde98b635546f74b1ac5463de162 (주석 태그 4.4.0).
    • nginx 4.4.0·latest: sha256:1bb060b032b1136faf467ef56169b361c9366fe0a2001ad1b40360e5911e6370
    • backend 4.4.0·latest: sha256:a56ff4df9386904646e4c66e198a151bd26e89a4c332e389a1d34347baed8971
    • crawler 4.4.0·latest: sha256:d2f3f8fc26a60f1c7ef01e1edc599e498d5202bd0ab0b40b720d9ec04b03addb
    • web 4.4.0·latest: sha256:069a58f0cff68de5f36bb9ec585824f0af66359ef6a171fd344fa3d55e402f61
    • 네 이미지 모두 OCI version 4.4.0·revision 0214fee2 확인. byedpi는 기존 latest digest(15ac60ab) 유지·4.4.0 태그 부재 확인.
    Downloads 2