-
hanyul released this
2026-10-09 04:08:03 +09:00 5.2.0 대비 변경사항
계정·보안
- 관리자 보안 키(
ADMIN_SECURITY_KEY)로는 관리자에게 활성 passkey가 하나도 없을 때만 passkey를 등록할 수 있습니다. 이미 passkey가 있으면 틀린 키와 구분되지 않는 응답으로 거절합니다. - 정규화 뒤 일반 아이디 규칙(
^[a-z0-9_-]{3,32}$)을 통과하는 형식의 보안 키는 비활성화되고 backend 로그에admin_security_key_disabled오류가 남습니다. 키를 쓰려면 33자 이상의 무작위 값으로 바꿔야 합니다. - passkey를 모두 잃었을 때를 위한 서버 셸 전용 복구 명령
node apps/backend/dist/cli/revoke-admin-passkeys.js를 추가했습니다. 관리자 passkey를 비활성화하고 session을 끊습니다. 복구 절차는 운영 가이드의 관리자 보안 키 절에 있습니다.
개인화
- 비로그인 읽기 기록을 로그인 계정에 병합할 때 한 건씩 저장하던 방식을 일괄 SQL로 바꿨습니다. 결과는 같고, 요청 비용(query weight)은 100건당 1(최대 5)입니다.
- 북마크의 쓰지 않던
category·priority·note컬럼과 관련 조회 옵션(category필터,sortBy=priority)을 제거했습니다. 계정 내보내기에서도 빠집니다. 배포 전에 열려 있던 탭·PWA가 보내는 이 필드는 받은 뒤 무시합니다.
수집·중복 검사
- Hitomi checkpoint는 지원하는 schema 버전(1)만 재개합니다. 버전이 없거나 다르면 원본을 그대로 두고, 새 작업이 덮어쓰지 못하게 하며, 운영 화면에 "재개할 수 없습니다. 폐기한 뒤 새로 수집하세요" 안내와 폐기 버튼을 표시합니다(상태 응답에
canDiscard추가). - 중복 검사의 공통 페이지(50작품 이상이 공유하는 지문) 집계를 바꿨습니다. 먼저 지문 행 수로 후보를 걸러 임계값 미만 지문의 images·galleries 읽기를 줄입니다. 판정 결과와 비교 signature는 그대로입니다. 공통 페이지 임계값·지문 algorithm·색인 대상 category는 shared 상수 하나에서 TypeScript 질의와 trigger SQL을 만듭니다.
crawling_states의 쓰지 않던 카운터를 crawler가 더 이상 기록하지 않습니다. 컬럼은 다음 릴리스에서 제거합니다.
DB·운영
- 다른 unique 제약이나 index와 중복된 index 7개를
DROP INDEX CONCURRENTLY로 제거합니다(DropDuplicateIndexes1791942400000). 중단돼도 다음 기동 때 invalid index를 복구해 이어서 완료합니다. - schema 검사는 entity에 선언된 index가 DB에 없거나 정의가 다르면 실패하고, fresh
mark_duplicate_hash_neighbors정의를 migration 전에 shared 정책과 대조합니다. ops/duplicate-scan-cost.sql은 새 질의를 측정하고,-v compare=1이면 이전 질의도 함께 측정합니다. 사전 필터 통과 분포도 출력합니다.- npm 의존성(Next 16.4.0·TypeORM 1.1.2 등)과 기반 이미지(byedpi alpine 3.24, Playwright 1.64.0)를 최신화했습니다. 감사(audit) 결과는 0건입니다.
새 운영 CLI와 상태 필드가 추가됐고, 제거한 북마크 필드는 자사 web이 저장·표시에 쓰지 않아 기존 client와 호환되므로 minor 5.3.0을 적용합니다. 제품 버전은 Git 태그·OCI label·문서로 관리하며 private package와 lockfile의 기존 버전은 유지합니다.
이미지 게시 범위
production 빌드 입력 지문 대조 결과 backend·crawler·web·byedpi가 바뀌어 네 이미지를 새로 빌드해 5.3.0·latest로 게시했습니다. nginx는 기존 latest digest에 5.3.0 태그만 붙였습니다. 모든 자체 이미지에 5.3.0 태그가 있어
IMAGE_TAG=5.3.0을 지정할 수 있습니다. 다만 아래 migration 때문에 5.3.0 적용 뒤에는 5.2.0 이하 backend로 rollback할 수 없습니다.NAS 업데이트와 주의사항
운영자는 운영 반영에 따라 5.3.0의 Compose와 릴리스 파일(
ops/duplicate-scan-cost.sql포함)을 갱신합니다.- DB migration 2개(
DropUnusedBookmarkColumns1791856000000,DropDuplicateIndexes1791942400000)가 backend 시작 때 자동 적용됩니다. 둘 다 forward-only이므로 적용 뒤 이전 backend 이미지로 되돌릴 수 없습니다. 배포 전 백업을 확인하세요.ops/deploy-production.sh는 backend 이미지가 바뀌면 migration 전에 crawler를 멈춥니다. - index 제거는
CONCURRENTLY로 실행되므로 오래 열린 transaction이 있으면 기다립니다. backend가 오래 시작하지 못하면 운영 가이드의 "migration으로 backend가 시작하지 못할 때" 절을 따르세요. ADMIN_SECURITY_KEY가 아이디처럼 보이는 형식이면 배포 뒤 키가 비활성화됩니다. 서비스는 정상 동작하며, 키를 쓰려면 33자 이상의 무작위 값으로 바꿉니다.- 배포 뒤
ops/duplicate-scan-cost.sql(필요하면-v compare=1)로 공통 페이지 집계 비용을 다시 측정할 수 있습니다.
NAS 배포·운영 데이터 변경은 이번 게시에서 실행하지 않았습니다.
검증
- 병합 main
9619668f에서run-unit.ps1 -Workspace all(backend 74 suites·467 tests, crawler 64·726, web 127·1,500),run-schema.ps1,run-integration.ps1,run-crawler-recovery.ps1,run-duplicate-benchmark.ps1,run-operations.ps1 -DeploymentOnly가 통과했습니다. - 중복 검사 benchmark(합성 55,000작품, warm p95): 공통 페이지가 없는 일반 입력은 15.29→4.05ms로 빨라졌습니다. 모든 작품이 공유하는 지문이 섞인 합성 최악 입력은 278.60→396.48ms로 느려졌고, 운영에서 가장 많이 공유된 지문은 90작품입니다. 사전 필터와 기존 집계의 결과가 같다는 것은 실제 PostgreSQL 경계 fixture로 확인했습니다.
- 새 migration은 schema runner에서 재적용, 행 보존, invalid index 복구, 다른 정의 거부를 확인했습니다. backend·crawler·web을 같은 코드로 재빌드해 개발 stack 기동과 migration 적용을 확인했습니다.
- 각 변경은 병합 전에 읽기 전용 리뷰를 거쳤습니다. 전체 WebAuthn runner(
run-passkey.ps1), 실제 Hitomi·E-Hentai 통신, 운영 DB 재측정, NAS 배포는 NOT RUN입니다.
게시 확인
- 릴리스 소스:
02857e6c455958c3e6a290bd2ce2d44c66855f0d(annotated Git 태그5.3.0대상). - backend
5.3.0·latest:sha256:2fd9e69bc5fab7130d73975dc02cf1f8f04b33ba211c6fcb98e9841791c5ceea. linux/amd64 manifest:sha256:6153e18771572b39283a444570e51140f16ec86bb3bfbeb5e4f388876f19f889. OCI version5.3.0·revision02857e6c…·입력 지문a3b1674ff69b2ae17db0e9aa65faca8f6a299e9139b42c4e6021e314a9e3b00d. - crawler
5.3.0·latest:sha256:904ab880b9950574cbd309a02d6acc0b46d5b5cb4c5792d3213f66721c397673. linux/amd64 manifest:sha256:842cf466ca0f7ffbc1a208387ee1187d3a963e5f2af2f4f9395ba3486f342f6b. 입력 지문1c97e22b914f6f8a895ff938b927a2f1049521f2eb6abb3dc35eb62ef6b0ad1d. - web
5.3.0·latest:sha256:9fb1ccabf564f0a944df88f84f6e9045da0787643b84108bbf8c32716b9881f0. linux/amd64 manifest:sha256:c4fe0ecc1f393f4de014b4f6adfe88ba32e23370655031c82fc7afd4b0d9b2aa. 입력 지문f7837d144137546f627cde58abeb7dd02f50ef6f14c8fd6e968b65d2548ff797. - byedpi
5.3.0·latest:sha256:8ffd2e496e2073e8dd7fa523fc3741eb9290f6973192c3b19d81262662dd9efe. linux/amd64 manifest:sha256:28cbfeead016413c34b0c99898ed79e55bc435d6a3a830514e733bc27ee281df. 입력 지문c6bc597c5528f9f45fb32ec7f46b1111913163b5702d0e91f2329e7c5ea4149f. - nginx
5.3.0·latest(기존 digest 재사용):sha256:0ed33b91538effe5864676f21e16edbbdd33f11251bd180adc97f4eb7a16467d. COMPOSE_PARALLEL_LIMIT=1로 push를 직렬화해 첫 실행에 exit 0으로 완료했습니다. 재시도·no-cache·ForceRebuild·직접 docker push·인증 변경은 없었습니다.
Downloads 2
-
Source code (zip)
0
2026-10-09 04:08:03 +09:00 -
Source code (tar.gz)
0
2026-10-09 04:08:03 +09:00
- 관리자 보안 키(