• 4.1.4 — 게스트 읽기 기록 보호, 상단 메뉴 반응형 수정과 전체 정리

    4.1.3 대비 변경사항

    수정

    • 보안: 게스트 읽기 기록 노출 차단 — 로그인하지 않은 요청의 GET /api/galleries/:id/reading-progress·/api/galleries/stats가 사용자 조건 없이 조회되어 다른 사용자의 읽기 기록을 돌려줄 수 있던 문제를 막았습니다. 게스트는 null과 0 통계를 받습니다.
    • 상단 메뉴 줄바꿈 — 창 폭이 좁을 때 관리자 메뉴 글자가 두 줄이 되던 문제를 고쳤습니다. 832px 이하는 햄버거 메뉴, 833px부터 데스크톱 메뉴로 전환합니다.
    • 시스템 다크 테마 — 저장값이 시스템일 때 첫 테마 전환 클릭이 반응하지 않던 문제를 고쳤습니다.
    • 서버 상태 메뉴 — 아이콘 대신 서버 상태 텍스트로 표시하고 외부 링크 표시는 유지했습니다.
    • 인기 태그 — GET /api/tags/popular의 limit을 1~100으로 제한합니다. 잘못된 값은 기본 50으로 처리합니다(이전에는 400).
    • Hitomi 수집 재개 — checkpoint의 구형 필드와 실행 중 호환 추론을 정리하고, 누락된 배치 플래그(batchReady)를 데이터 보존 migration(NormalizeHitomiBatchReady)으로 채웁니다. 기존 큐와 cursor는 보존하며 손상된 플래그의 재개는 차단합니다.
    • 운영 스크립트 — production-audit.sh의 PostgreSQL 설정 검사가 항상 CRITICAL로 판정되던 회귀를 고치고 log-reader 검사를 추가했습니다. backup-production.sh가 셸에 MINIO_BUCKET이 없으면 manifest 단계에서 중단되던 문제를 고쳤습니다. restore-drill.sh 기본 PostgreSQL 이미지를 운영과 같은 18.6으로 맞췄습니다.
    • Nginx — POST /api/crawler/garbage-collection/orphan-audit에 1시간 proxy timeout을 적용했습니다.

    빌드·배포

    • MinIO 자체 이미지 — 공개 이미지 다운로드 차단과 mc 누락 문제로 MinIO를 아카이브 소스에서 빌드한 git.2ex.dev/archive/minio:source-7aac2a2c5b7c(mc 포함)로 전환했습니다. compose.yml·백업·복구 스크립트가 이 이미지를 사용합니다.
    • 변경 서비스만 게시 — ops/publish-images.ps1 -ChangedOnly를 추가했습니다. 이번 릴리스도 이 옵션으로 게시했습니다.

    정리

    • 사용하지 않는 코드와 하위호환 잔재를 정리했습니다: backend·crawler의 미사용 Swagger 데코레이터와 @nestjs/swagger 의존성, 쓰이지 않는 Nest provider export·shared export·web module export, web src/store 별칭과 미사용 CSS, 루트의 중복 개발 의존성.
    • 구현만 따라가던 테스트 assertion을 정리하고, main에서도 실패하던 Hitomi 재개 테스트 fixture를 현재 계약에 맞췄습니다.

    문서

    • README를 소개 중심으로 새로 썼고, 아키텍처·운영 가이드·API 계약·DB 정책·크롤러 복구·테스트 안내·작업 규칙을 현재 코드와 대조해 정정·축약했습니다(약 350KB → 224KB).

    API 응답 형태·DB 스키마 구조·환경 변수 변경은 없습니다. 자동 데이터 보존 migration 1건이 포함되어 있으며 호환되는 수정이므로 patch 버전입니다.

    이미지 게시 범위

    운영 빌드 입력 지문을 4.1.3 시점 latest와 대조해 nginx·backend·crawler·web만 새로 빌드하고 4.1.4·latest를 게시했습니다. byedpi·redis는 입력이 같아 기존 latest digest를 유지하며 4.1.4 태그를 추가하지 않았습니다. log-reader는 backend 이미지를 사용합니다. 전체 stack에는 기본 latest를 사용하세요.

    NAS 업데이트

    compose.yml(MinIO 이미지)과 운영 스크립트가 바뀌었으므로 저장소를 먼저 갱신한 뒤 배포 스크립트를 실행합니다. 백업 후 진행하세요.

    cd /volume1/2ex-hentai
    git pull
    docker login git.2ex.dev
    sh ops/deploy-production.sh
    docker compose --env-file .env.production ps
    

    deploy-production.sh는 전체 pull을 먼저 마친 뒤 digest·설정이 바뀐 서비스(minio·log-reader·backend·crawler·web·nginx)만 순서대로 교체합니다. backend가 시작하면서 NormalizeHitomiBatchReady migration이 자동 적용됩니다. 이미지 rollback은 migration을 되돌리지 않으며, 이 릴리스는 변경 서비스에만 버전 태그가 있으므로 IMAGE_TAG로 전체 서비스를 일괄 지정할 수 없습니다.

    4.1.3 대비 전체 변경

    검증

    • Docker run-unit.ps1 -Workspace all 통과(shared lint·build, backend 59 suites·284 tests, crawler 48·367, web 98·674). 이후 Swagger 정리·버그 수정 뒤 backend 60 suites·286 tests 재확인.
    • run-operations.ps1 -DeploymentOnly 통과(shell-check·deploy-check·release-check, -ChangedOnly 시나리오 4건 포함), shellcheck·nginx -t 통과.
    • 개발 stack 재빌드 후 backend·crawler·log-reader 재시작 0회, /api/health/live·ready 200. Nginx 경유 게스트·일반·관리자 Navigation(832·833·900·1024·1440px) 브라우저 확인 통과(일반·관리자 권한은 응답 대체 fixture). 게스트 진행률 null·통계 0, popular limit 100000→100·abc→50 확인.
    • 추적 Markdown 21개 로컬 링크·anchor 오류 0건.
    • 전체 integration은 기존 1440px 갤러리 중앙정렬 실패로 PARTIAL 상태이며 재통과하지 않았습니다. schema·crawler recovery runner와 NAS 배포는 이번에 실행하지 않았습니다. npm ci가 기존 의존성 감사 항목(moderate 4·high 3)을 보고했으며 이번 릴리스에서 갱신하지 않았습니다.

    게시 확인

    • 릴리스 소스: d52d7712255b4783a8f59992929499bc4d17895b (주석 태그 4.1.4).
    • 4.1.4·latest digest
      • nginx sha256:96dbf538f715d8d8e8dcbee5a931f576d2e64ad80ea9940e6f73c59b2feed5a9
      • backend sha256:b8ca9c459c0e8cece9d182bda8cedc4a40d1f75325a13595d9fa6d1aec625418
      • crawler sha256:1815959aef7e505524037bd65e979d87f4c634e12d7d89964d4048f1a40f6e4a
      • web sha256:a8fab4ab2121ea8706ca318475f702bc004a0f73ce210041a9a1ed090358d36c
    • 이미지 OCI version 4.1.4·revision d52d7712·입력 지문 label 확인. byedpi·redis는 기존 latest digest 유지·4.1.4 태그 부재 확인.
    • 게시 스크립트의 병렬 push가 레지스트리 업로드 연결 종료로 두 번 실패해(latest 승격 전 중단) 같은 이미지를 서비스별로 순차 push한 뒤 latest를 승격했습니다.
    Downloads 2