• 5.10.0

    5.10.0 주요 변경사항

    북마크 · 모아보기

    • 작가·그룹 작품 탭이 모아보기로 바뀌어 북마크한 작가·그룹의 작품과 단일 갤러리 북마크를 한 목록으로 합쳐 보여줍니다(guest는 로컬 북마크 최대 500개, 로그인은 서버 북마크를 함께 조회).
    • 모아보기에 작품 탭과 같은 제목·작가 검색창과 전체/안 읽음/읽는 중/완독 필터가 생겼습니다. 검색은 서버에서 NFKC 정규화 뒤 단어 AND로 처리하고, 조건을 바꾸면 첫 page부터 다시 조회합니다. 로그인 사용자의 읽기 상태가 바뀌면(읽기 시작·완독·기록 삭제, 다른 탭 포함) 필터 결과와 개수가 갱신됩니다.

    web · 화면 수정

    • 홈 검색창의 포함 태그 pill에 + 접두가 보입니다(제외는 −).
    • 태그를 눌러 검색했을 때(또는 검색창 제안으로 넣었을 때) 고급 검색 목록의 해당 행에 + 포함·− 제외 표시가 뜨지 않던 문제를 고쳤습니다.
    • 홈 상세 modal에서 태그를 눌러 검색하면 modal 닫기의 history.back이 검색 이동을 취소해 Firefox에서 NS_BINDING_ABORTED가 나던 문제를 고쳤습니다. 닫기는 popstate까지 한 번만 처리하고 검색은 그 뒤 한 번 실행합니다.
    • 운영 관리의 이미지 색인·썸네일 생성 패널에서 버튼 아래 빈 줄을 없앴습니다.
    • 목록 카드 요약에 원본 게시 시각(uploadDate)이 포함되어 상세 modal 첫 render에 다른 행과 함께 표시됩니다.

    정리

    • 호출처 없는 코드·API·설정을 정리했습니다: backend TypeORM CLI·debug script와 미사용 devDependency, 로컬 실행 script, 소비처 없는 응답 필드(dashboard·통계·health·home-state 등), GET /api/duplicates/jobs/:id, 중복 검토의 legacy detection 필터, GC 실행 기록의 옛 deleted·includeDeleted 변환, 전역 태그 차단 단건 POST /api/blacklist/tag(일괄 POST /api/blacklist/tags로 통합, 응답 201), 카드 요약 tags[].usageCount, GC 결과 orphaned, crawler unified-status 축소.
    • crawler 운영 이미지의 dist에서 spec·fixture·test-support를 제외했습니다.
    • 항상 false이던 SYNCHRONIZE 키를 backend 설정과 compose.yml에서 지웠습니다(운영 조치 없음: 옛 이미지는 키가 없으면 false, 새 이미지는 키를 읽지 않습니다).
    • 의도한 동작 변경 두 가지: 괄호가 있는 작가·그룹 태그를 한 태그로 검색·차단하고, storage를 쓸 수 없을 때 설정 저장은 예외 없이 현재 화면 값만 유지합니다.
    • 테스트: runner 공용 helper(tests/lib/compose.ps1), web 테스트 파일을 typecheck에 포함, 중복 fixture·spec 정리.

    새 기능(모아보기 검색·필터·북마크 합치기)과 web이 더 쓰지 않는 관리자 API 제거가 섞여 minor 5.10.0으로 게시합니다. 필수 환경 키·DB migration 변경은 없습니다. compose.yml에서 backend SYNCHRONIZE 키가 빠졌지만 운영 조치는 없습니다.

    이미지 게시 범위

    • 새로 빌드(5.10.0·latest): backend·crawler·web·nginx. backend·crawler·web은 앱·shared 코드와 lockfile(devDependency 제거)이, nginx는 Dockerfile 정리로 빌드 입력 지문이 바뀌었습니다.
    • digest 재사용: byedpi(5.4.0 digest). 빌드 입력이 같아 기존 digest에 5.10.0·latest 태그만 붙였습니다.
    • 다섯 이미지 모두 5.10.0 태그가 있으므로 IMAGE_TAG=5.10.0으로 고정할 수 있습니다.

    NAS 업데이트와 주의사항

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

    • backend·web을 함께 교체해야 합니다. 옛 web과 새 backend가 섞이면 전역 태그 차단(POST /api/blacklist/tag)이 404가 나고, 새 web과 옛 backend가 섞이면 모아보기 검색·필터가 무시됩니다.
    • backend 교체 전 crawler를 정지하는 배포 절차 때문에 실행 중인 E-Hentai 수집 job은 운영 화면에서 수동 재개가 필요합니다.
    • compose.yml을 5.10.0 태그 버전으로 받습니다(SYNCHRONIZE 키 제거만 바뀌었습니다).
    • 운영이 아직 5.8.1이면 5.9.0의 주의사항(Compose 변경, migration 1건, Web Analytics 수동 snippet 전환)이 그대로 적용됩니다.
    • rollback: 5.9.3 이미지로 되돌릴 수 있습니다(DB 변경 없음).

    5.9.3 대비 전체 변경

    검증

    • 병합 main 733ce1ee에서 개발 stack 재빌드(backend·crawler·web·log-reader, 9개 컨테이너 healthy), run-integration.ps1 전체, run-crawler-recovery.ps1 전체, 이미지 검색·운영 UI 격리 검증(1440·768·390·320px), 북마크 UI 격리 검증(1440·768·390·450·320px, 모아보기 검색·필터 포함), 문서 검증이 통과했습니다. 테스트 파일만 고친 fd20e486에서 run-unit.ps1 -Workspace all(backend 80 suites·614 tests, crawler 71·923, web 139·1,739, lint·typecheck 포함)이 통과했습니다.
    • pill + 변경(0f07cecf)은 run-unit.ps1 -Workspace web과 이미지 검색·운영 UI 격리 검증(접두 기호·같은 폭 단언 추가)으로 검증했습니다.
    • 전용 검증은 브랜치 commit에서 통과했습니다: run-schema.ps1·run-operations.ps1 -DeploymentOnly·run-compose-compat.ps1(5.9.3 2ddb1529 대비 세 조합)·run-upgrade.ps1 -BuildNew(deploy-script)·검색·중복 benchmark·near-miss fixture는 03eaeeb4, 모아보기 SQL EXPLAIN ANALYZE(10만 작품 fixture, 후보 수 비례 2~90ms)는 6912001d.
    • 각 브랜치는 gpt-6.1-sol 읽기 전용 리뷰를 거쳤습니다(ui-bugs·bookmarks-feed는 수정 뒤 2라운드 승인). pill 변경은 독립 리뷰 없이 병합했습니다.
    • NOT RUN: 위 전용 runner의 main 재실행, run-crawler-recovery.ps1 -EHentaiOnly, run-passkey.ps1, 실제 Hitomi·E-Hentai 통신 runner, run-upgrade.ps1 watchtower 모드, 실브라우저(Firefox NS_BINDING_ABORTED 재현, 두 탭 읽기 신호), 운영 규모 feed 실행 계획, 운영 배포.

    게시 확인

    • 릴리스 소스: d8ad4758a927028d732badef2e5ebb686ff383d5 (annotated Git 태그 5.10.0 대상).
    • backend 5.10.0·latest: sha256:42e2378f1f3b5c1ac276be83b6c8c9d099d9be6e75aca6f56dbbc3cef6e63cf2
      • linux/amd64 manifest: sha256:72a09087218406dd608ffe856378034c1df6b49085b7bcd841ef181bdbef2ca2
      • OCI version 5.10.0·revision d8ad4758a927028d732badef2e5ebb686ff383d5
    • crawler 5.10.0·latest: sha256:f6db86d6da3cc66b88f199df24de3ec815ba1fe1989db245ddeffdc0c6ba08e2
      • linux/amd64 manifest: sha256:822a2893e030760db7331581a7f4af159023ed1889f623aec94163dfe2c57754
    • web 5.10.0·latest: sha256:4244f95ab4b99d4fd192a7dc6ddff709753fe9a79a58ea7963e3d7b72de4a24f
      • linux/amd64 manifest: sha256:b2560f42720759a64c32913f3aecd0bd778469db7e5bf6889776524636c1dd64
    • nginx 5.10.0·latest: sha256:552b18eddb10c22b7dbfaee60a6e1bacd20f8b004892c8209f3b48f508c3a780
      • linux/amd64 manifest: sha256:1daf8285e6aedac87ca3b22e41c20678414e1e92d7d994fa4bd62f30a3c009cb
    • byedpi 5.10.0·latest(5.4.0 digest 재사용): sha256:04cf2838499d67a033a3c3101913563bf983e551fee27b891dab0d2f75a4233a
    • ops/publish-images.ps1 -Version 5.10.0 -Publish는 첫 실행에서 네 버전 태그 push가 error from registry: unknown으로 실패했고(latest는 그대로 5.9.3) 같은 명령 재실행으로 완료했습니다. 다섯 서비스의 5.10.0·latest 일치를 확인했습니다(Registry tags verified for 5.10.0.).
    Downloads 2