• 5.11.0

    5.11.0 주요 변경사항

    인증 · 세션

    • 세션 토큰의 auth_time claim이 필수가 되었습니다. auth_time이 없거나 유효하지 않은 토큰(5.4.0 이전에 발급된 토큰)은 첫 요청에서 세션 만료로 거절되고 해당 session이 삭제되므로, 그 사용자는 배포 뒤 한 번 다시 로그인해야 합니다. 정상 auth_time 토큰은 영향이 없습니다.
    • session metadata가 Redis eviction으로 비어 있어도 인증은 유지됩니다. 세션 목록에서는 현재 session의 createdAt을 토큰의 auth_time으로 보여주고, metadata가 없는 다른 session은 createdAt·lastUsedAt을 null로 돌려줍니다. 옛 session의 createdAt을 touch·renewal 때 다시 채우던 보정은 제거했습니다.

    web · 화면 수정

    • 운영 관리 이미지 색인 패널 상단의 "기존 이미지 등록 · 지문 생성 누적" 문장을 두 줄로 고정해, 누적 수가 길어져도 버튼 줄과 통계 칸이 밀리지 않습니다(390px에서 재현되던 20px 밀림).
    • 중복 검토 그룹의 판정 라벨은 저장된 detection 값으로만 정합니다. 값이 없거나 알 수 없는 그룹은 검사 방식 미기록으로 표시하고 더는 파일 목록 일치로 추정하지 않습니다.
    • 홈 마지막 검색 조건 저장값의 옛 useAdvancedSearch 읽기 변환을 제거했습니다. 저장값은 version과 관계없이 검색어·태그·정렬을 함께 읽습니다.

    테스트

    • 이미지 검색·운영 UI 격리 검증에 운영 패널 숫자가 바뀌어도(999→1,000→12,345, 진행률 0→100%) heading·버튼 줄·통계 칸 좌표가 유지되는지 1440·768·390·320px에서 검사하는 시나리오를 더했습니다.
    • 요청 제한(request budget) integration 검증이 고정 시각으로 창 경계를 검사해 호스트 부하에 따른 flake를 없앴습니다. 운영 코드는 Redis 시각을 그대로 씁니다.
    • session integration 검사가 auth_time 필수·metadata 없는 session 계약과 renewal 뒤 createdAt 미복원을 고정합니다.

    5.10.0 대비 새 기능은 없지만 5.4.0 이전 토큰의 지원을 끝내는 호환 범위 변경이 섞여 있어 minor 5.11.0으로 게시합니다(5.9.0·5.10.0의 호출처 없는 API 제거를 minor로 본 전례를 따릅니다). 필수 환경 키·DB migration·compose.yml 변경은 없습니다.

    이미지 게시 범위

    • 새로 빌드(5.11.0·latest): backend·web. backend는 auth 모듈·request budget service, web은 운영 패널·중복 검토·홈 검색 저장값 코드가 바뀌었습니다. shared·lockfile·Dockerfile은 바뀌지 않았습니다.
    • digest 재사용: crawler·nginx(5.10.0 digest), byedpi(5.4.0 digest). 빌드 입력이 같아 기존 digest에 5.11.0·latest 태그만 붙였습니다.
    • 다섯 이미지 모두 5.11.0 태그가 있으므로 IMAGE_TAG=5.11.0으로 고정할 수 있습니다.

    NAS 업데이트와 주의사항

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

    • backend 배포 뒤 auth_time이 없는 5.4.0 이전 발급 토큰 사용자는 한 번 다시 로그인해야 합니다. 인증 장애가 아니라 의도된 세션 만료입니다.
    • backend 교체 전 crawler를 정지하는 배포 절차 때문에 실행 중인 E-Hentai 수집 job은 운영 화면에서 수동 재개가 필요합니다.
    • compose.yml·.env.example·sql/init-db.sql은 5.10.0과 같습니다. 운영이 이미 5.10.0 Compose라면 이미지만 바뀝니다.
    • rollback: 5.10.0 이미지로 되돌릴 수 있습니다(DB 변경 없음).

    5.10.0 대비 전체 변경

    검증

    • 병합 main 5cbbab47(앱 코드는 릴리스 commit과 같음)에서 개발 stack 재빌드(backend·web·log-reader, 9개 컨테이너 healthy, /api/health/ready 200), run-unit.ps1 -Workspace all(backend 80 suites·614 tests, crawler 71·923, web 140·1,738, lint·typecheck 포함), run-integration.ps1 전체, run-passkey.ps1, 이미지 검색·운영 UI 격리 검증(1440·768·390·320px, 숫자 변동 시나리오 포함), 북마크 UI 격리 검증(1440·768·390·450·320px), 문서 검증(개발·운영 Compose config, git diff --check, Markdown 링크·anchor 23개 파일 0건)이 통과했습니다.
    • 릴리스 commit에서 run-compose-compat.ps1(5.10.0 d8ad4758 대비 세 조합)이 통과했습니다(new-image-old-compose·new-image-new-compose·old-image-new-compose).
    • 세 브랜치(budget-flake·auth-compat·web-compat)는 각각 gpt-6.1-sol 읽기 전용 리뷰를 거쳤고, 리뷰 P2 2건(운영 가이드의 옛 토큰 재로그인 안내, detection 누락 그룹의 라벨)은 수정 뒤 코디네이터 판정으로 병합했습니다.
    • NOT RUN: run-crawler-recovery.ps1(crawler 코드 변경 없음)과 그 밖의 전용 runner, 실제 Hitomi·E-Hentai 통신 runner, 실브라우저 확인(320px에서 다섯 자리 페이지 번호의 진행 label 줄바꿈 후보), 운영 배포.

    게시 확인

    • 릴리스 소스: 7e9f1e7e (annotated Git 태그 5.11.0 대상, 앱 코드는 5cbbab47과 같음).
    • backend 5.11.0·latest(새 빌드): sha256:4909f241bb8dcf3841558362d7e71e937e77b70b96c5f7ba7fe949679a0cbd87
      • linux/amd64 manifest: sha256:a38aa8f2e232bc39d08c40e872bb0c803a4b0d8c957b289a30abcad3219aee78
    • web 5.11.0·latest(새 빌드): sha256:ba76de419b39c4580a4f1f09031d6aa88132c9c9c9c06e263a945dac4d6856e7
      • linux/amd64 manifest: sha256:bb93e0db02e0b16de4a78f6c0554a3877b8da99df85474cf72a94a56573d094f
    • crawler 5.11.0·latest(5.10.0 digest 재사용): sha256:f6db86d6da3cc66b88f199df24de3ec815ba1fe1989db245ddeffdc0c6ba08e2
    • nginx 5.11.0·latest(5.10.0 digest 재사용): sha256:552b18eddb10c22b7dbfaee60a6e1bacd20f8b004892c8209f3b48f508c3a780
    • byedpi 5.11.0·latest(5.4.0 digest 재사용): sha256:04cf2838499d67a033a3c3101913563bf983e551fee27b891dab0d2f75a4233a
    • ops/publish-images.ps1 -Version 5.11.0 -Publish가 첫 실행에서 완료됐고 다섯 서비스의 5.11.0·latest 일치를 확인했습니다(Registry tags verified for 5.11.0.).
    Downloads 2