-
hanyul released this
2026-10-02 20:13:54 +09:00 4.5.0 대비 변경사항
수집(crawler)
- 정지·재개가 더 똑똑해졌습니다 — 색인 404 이상 판정은 같은 batch의 정상 응답이나 최신 gallery 확인으로 통과하면 삭제로 닫아 영구 정지하지 않습니다. 원본 삭제 판정이 연속 상한에 걸리면 자동·예약 재개를 멈추고 관리자 확인을 기다립니다(같은 gallery를 하루 12번 헛재시도하던 문제 해소). permanent 첫 실패는 gallery마다 1회 1시간 뒤 다시 시도하고, 페이지 수 변경은 일시 실패(
source_changed)로 분류합니다. - 차단 신호 보강 — Hitomi 403(30분)·이미지 503(5분)도 공용 보호 회로를 엽니다. 수집 중 삭제·차단된 gallery는 저장 오류로 job을 멈추지 않고 건너뜁니다.
- 체크포인트 폐기 분리 —
jobs/discard를 새로 두고, 유휴 상태의jobs/stop은 체크포인트를 지우지 않습니다. - 처리량·고정비 — E-Hentai detail HTML 중복 요청 제거, 전역 blacklist 잠금 반복 축소, gallery 종료 저장을 한 transaction으로(완료 gallery당 DB 왕복 16→8회), 범위 계획을 checkpoint마다 저장하지 않고 한 번만, 작은 covered 구간 병합, nozomi 후보 우선 처리, 원본 다운로드·decode를 storage lock 밖으로, HTTP 응답 크기 상한.
- 판정·관측 — 한국어 tag 판정을
korean정확 일치로 좁혔고(수집 정책 version 유지), E-Hentai 계측·병렬 실행 중 로그 buffer 보호, 19시 예약 계획 실패를 상태에 기록합니다.
중복 검사·색인·저장소
- 중복 검사 — 전체 검사는 변경된 작품만 다시 탐색하고(정책·algorithm 변경은 자동 감지), 색인 대기 항목은 back-off로 다시 확인합니다(색인이 덜 된 동안 worker가 쉬지 않고 돌던 문제 해소). 비교 signature에서 revision을 빼 불필요한 무효화를 줄이고, 판정 불가 후보를 미리 거르며, 작업 이력은 30일 보관합니다. 검토 목록 정렬과 읽기 전용 정확도 보고(
ops/duplicate-accuracy.sql)를 추가했습니다. - GC — gallery 단위 일괄 삭제(DeleteObjects, 미지원 시 단건 대체)와 비동기 실행(시작 수락 + 상태 조회)으로 바꿨습니다.
- 썸네일 — 축소본이 없으면 원본으로 대체하고 다시 만듭니다. 운영 화면의 썸네일 생성 상태 조회가 전수 집계를 기다리지 않고 즉시 응답합니다(합성 5.4만 gallery 기준 집계 3,020→63ms, 조회 항상 약 5ms).
- 이미지 색인·검색 — 색인 처리 묶음 장벽 제거, 수집 중 자동 감속, 검색 결과를 작품별로 묶고 단색·빈 업로드는 거절합니다. 운영 작업 상태는 현재 오류만 원인 범주(예:
DB 연결 실패(57P01))·시각과 함께 보여 줍니다.
backend·인프라
- 운영 화면 전용이던 crawler 상태 API(
unified-status·jobs/ehentai/status)를 관리자 전용으로, 공개/api/health/ready는{status}만 반환합니다(200/503 의미 유지). - DB pool 획득 timeout, 태그·작가 검색 cache, 잘못된 ID는 400, Push 처리량·timeout, 블랙리스트 재계산 N+1 제거, 개인 차단 조건 개선(100개 page query 66→12ms).
- 배포 중 502 감소: backend SIGTERM 정리(최대 20초), nginx upstream keepalive, backend 교체 중
/api는503 UPSTREAM_UNAVAILABLEJSON. crawler proxy timeout 정합. - 링크 미리보기 embed 조회 2초 제한, 배포 직후 열린 탭의 이전 chunk 로드 실패는 한 번만 새로고침.
- 강화한 CSP를 Report-Only로 추가. HSTS는 Cloudflare 설정 안내.
- 실제 client IP 복원은
NGINX_REAL_IP_FROM(기본 빈 값 = 현재 동작)으로 운영 검증 뒤에만 켤 수 있습니다. 로그인 사용자 썸네일 한도는 계정 단위입니다. Redis 사용률·축출 수를 관리자 상태에 표시합니다.
화면(web)
- 홈 — 상단
이어 읽기줄, 같은 탭에서 viewer를 닫고 돌아오면 목록·스크롤 위치 복원, 다른 탭의 진행률·북마크 반영, guest 완료·미완료 탭이 목록을 끝없이 조회하던 문제 수정(5 page 뒤더 찾아보기), 번역 사전을 공용 chunk에서 분리(viewer gzip 270→97KB). - viewer·상세 — 상세 modal에 읽기 진행과
이어 읽기·처음부터,?page=진입, Webtoon 지나간 page 해제와 원장 크기 기반 높이 예약(먼 page 이동 시 위치 유지), 네트워크 복구 후 이미지 재요청, 모바일 두 손가락 확대, page 맞춤·Webtoon 폭 설정, RTL scrubber 방향, 프리로드 개선, Push 알림 클릭 처리. - 운영 화면 — 원본 전수 점검 시작·이어서·처음부터, 요청 지표·의존성 진단 섹션, 중복 관리 상태 배지와 동시 실행 경고 보강, 격리 gallery의 원본 링크, GC·저장 용량 표시.
새 기능이 추가되고 기존 데이터·사용 방식은 유지되므로 minor 버전입니다. 관리자 전용으로 바꾼 API와 비동기로 바꾼 GC는 함께 배포되는 web만 사용합니다.
DB migration (backend 시작 시 자동 적용, 데이터 보존)
DuplicateIncrementalScan— 중복 검사 이력 보존·대기 back-off 컬럼, 실제 변경에만 반응하는 trigger, 썸네일 원장skipped·failed상태, 부적격 gallery의 미색인 대기 행 정리(파생 대기열, 다시 적격이 되면 trigger가 재등록). transaction 안에서만 statement timeout 해제.AddThumbnailTargetIndex— 썸네일 통계용 부분 index를CREATE INDEX CONCURRENTLY로 생성(쓰기 잠금 없음, timeout 해제 후 복원).
이미지 게시 범위
빌드 입력 지문을 4.5.0 시점
latest와 대조해 nginx·backend·crawler·web을 새로 빌드하고4.6.0·latest를 게시했습니다(publish-images.ps1 -ChangedOnly). nginx는 설정(upstream keepalive·client IP 복원 entrypoint·CSP Report-Only)과 Dockerfile, backend·crawler·web은 앱 코드·공유 패키지가 바뀌었습니다. byedpi는 입력이 같아 기존latestdigest를 유지하며4.6.0태그를 추가하지 않았습니다.NAS 업데이트
compose.yml에 backend·web의init: true·stop_grace_period: 30s와 nginx의NGINX_REAL_IP_FROM(기본 빈 값)이 추가됐습니다. 배포 중 502를 줄이려면 compose를 먼저 받습니다(저장소가 공개라 로그인 없이 받아집니다).cd /volume1/2ex-hentai curl -fsSL https://git.2ex.dev/hanyul/2Ex-Hentai/raw/tag/4.6.0/compose.yml -o compose.yml docker login git.2ex.dev sh ops/deploy-production.sh docker compose --env-file .env.production ps.env.production은 바꾸지 않아도 됩니다.NGINX_REAL_IP_FROM이 없으면 지금과 같이 동작합니다. 켜기 전 검증 절차는 운영 가이드에 있습니다.- backend가 시작하며 위 migration 2개를 적용합니다. index는 잠금 없이 만들어지지만 NAS에서 수 분 걸릴 수 있습니다.
- 운영 화면 이미지 색인에 남아 있던 지난 오류 경고는 배포 뒤 첫 주기에 지워집니다.
- 이 릴리스는 변경 서비스에만 버전 태그가 있으므로
IMAGE_TAG로 전체 서비스를 일괄 지정할 수 없습니다.
검증
- 게시 소스 main에서
run-unit.ps1 -Workspace all(backend 347·crawler 543·web 856),run-schema.ps1,run-integration.ps1전체 통과. 직전 2차 개선 기준(26c75bef)에서run-crawler-recovery.ps1,run-operations.ps1 -DeploymentOnly,run-search-benchmark.ps1통과(benchmark 연속 3회 포함). - 실제 Hitomi·E-Hentai 통신(
run-hitomi-network·run-ehentai-network), 격리 브라우저 화면 캡처와 수치 측정(웹툰 page 위치, 홈 스크롤 복원, 썸네일 통계 시간)으로 화면·전송 변경을 확인했습니다. - 개발 서버를 이 소스로 재빌드해 healthy를 확인했습니다. 실제 기기·Firefox·Safari 확인, NAS 실측(썸네일 통계·index 생성 시간), 실제 client IP 판정 켜기, NAS 배포는 실행하지 않았습니다.
게시 확인
- 릴리스 소스:
0de3cf8ef56a01cb8761798249f597f12ff4fe94(주석 태그4.6.0). - nginx
4.6.0·latest:sha256:d43e596d023703648cb936b2afb48951c9f6db816ba952c952859f2e501ec8ec - backend
4.6.0·latest:sha256:ab055ca11b0f1c7b72edfa39fc31069b05f0eba326d6d497bfb970f73df55604 - crawler
4.6.0·latest:sha256:edd9523595f8b204b64e3e1ac76ec469597f6fc5e1760e960bcc5a387d851afd - web
4.6.0·latest:sha256:f5a25edd4bea602d14370c650d06f7586f1babb3e57d9e72a3f1c72e1ff7b5c2 - 네 이미지 모두 OCI version
4.6.0·revision0de3cf8e확인. byedpi(15ac60ab)는 기존latest유지·4.6.0태그 부재 확인.
Downloads 2
-
Source code (zip)
0
2026-10-02 20:13:54 +09:00 -
Source code (tar.gz)
0
2026-10-02 20:13:54 +09:00
- 정지·재개가 더 똑똑해졌습니다 — 색인 404 이상 판정은 같은 batch의 정상 응답이나 최신 gallery 확인으로 통과하면 삭제로 닫아 영구 정지하지 않습니다. 원본 삭제 판정이 연속 상한에 걸리면 자동·예약 재개를 멈추고 관리자 확인을 기다립니다(같은 gallery를 하루 12번 헛재시도하던 문제 해소). permanent 첫 실패는 gallery마다 1회 1시간 뒤 다시 시도하고, 페이지 수 변경은 일시 실패(