• LINKS 1.0.9 — 게스트 공유 링크·ARCA 0.1.19 모바일 배율·backup 기능 제거

    LINKS 1.0.9

    이 릴리스는 이전 릴리스 1.0.8(9f4ada7c6c) 위에 게스트 공유 링크, ARCA 0.1.19 모바일 배율 수정, backup 기능 제거를 얹었습니다. 최종 소스는 53f517cd1e, 루트 패키지는 1.0.9, ARCA pin은 exact 0.1.19(1.0.8은 0.1.18)입니다. schema migration 2개(0001_guest_play_links, 0002_remove_backup)가 적용됩니다.

    업그레이드 주의: 1.0.8 → 1.0.9는 sh update.sh만 실행합니다. migration이 적용된 뒤에는 1.0.8 image로 되돌릴 수 없습니다

    1. 갱신 방법: 배포 디렉터리에서 sh update.sh만 실행합니다. reset.sh는 실행하지 않습니다. update.sh가 Pending migrations: 2를 출력하고 up 때 migration이 두 migration과 schema 버전 갱신을 한 transaction으로 적용합니다(schema 14481d17… → b5dd04a0… → f7fe92f3…).
    2. 되돌릴 수 없음: migration이 적용된 DB는 1.0.8 image의 사슬 밖이라 1.0.8로 기동하지 않습니다. backup 기능이 제거되어 rollback snapshot이 없습니다. migration이 반영된 뒤 실패하면 이전 image로 되돌리지 말고 원인을 고쳐 다시 갱신합니다.
    3. 갱신 뒤 정리: 새 update.sh가 설치 단계에서 NAS의 backup.sh와 ops/backup-verify.compose.yaml(남은 .tmp 포함)을 자동으로 지웁니다. .env.production의 LINKS_BACKUP_* 키와 data/backups 디렉터리는 LINKS가 더 이상 쓰지 않으므로 운영자가 지웁니다.
    4. 호환 stub: 설치된 1.0.8 update.sh는 자기 7개 파일 목록을 새 tag에서 모두 받은 뒤 새 update.sh로 넘어가므로, 저장소의 ops/backup-registry.sh·ops/backup-verify.compose.yaml 경로에 다운로드 호환 stub 2개를 남겼습니다(실행하지 않음, 1.0.9 update.sh는 받지도 설치하지도 않음). 모든 설치가 1.0.9 이상이 되면 제거할 예정입니다.
    cd /volume1/docker/links
    sh update.sh
    

    성공하면 단계 표시 6줄과 Pending migrations: 2 뒤에 Updated to 1.0.9 (catalog 9148653250cf), runtime.package ready.가 출력됩니다. compose.yaml의 postgres 정의는 1.0.8과 같아 격리 gate에서 postgres container는 다시 만들어지지 않았습니다(DB 중단 0초). 원본 game library는 읽기 전용으로 유지합니다. 이번 게시 작업에서 개발·운영 DB 초기화나 NAS 배포는 실행하지 않았습니다.

    변경 내용

    게스트 공유 링크

    • 관리자는 ready build가 있는 설치본에 대해 관리 화면에서 <catalog origin>/play/<token> 공유 링크를 만들고 끌 수 있습니다. 링크 주소(token)는 만들 때 한 번만 보이며 DB에는 token의 SHA-256 hash(play_share_links)만 저장됩니다.
    • 세션이 없는 게스트는 그 링크로만 게임을 실행합니다. 홈은 로그인 안내를 보여 주고 목록 API는 401입니다. 게스트 PlaySession은 사용자 대신 공유 링크를 principal로 가집니다(migration 0001_guest_play_links).
    • 게스트 세이브는 그 브라우저의 IndexedDB에만 남습니다. Player의 서버 세이브(/save)는 게스트에게 403입니다.
    • 링크를 끄면 실행 중인 게스트 게임은 약 60초 안에 멈추고, 꺼진 링크는 사용이 중지된 공유 링크입니다로 거부됩니다.

    ARCA 0.1.19 모바일 배율

    • @rgss23/arca exact pin을 0.1.19로 올렸습니다. 고 DPR(모바일) 화면에서 RGSS 게임 배율이 어긋나던 문제를 고친 release입니다(backing store의 DPR 동기화, logicalWidth·logicalHeight 통지, RetroArch presentation geometry).
    • Player frame은 canvas backing 대신 ARCA가 통지한 논리 해상도를 화면 크기로 보고합니다. 고 DPR gate tests/run-player-dpr.*가 Chromium·Firefox에서 DPR 1·2·3과 회전·주소창·resize_screen·100% 배율을 확인합니다.
    • release identity가 바뀌므로 기존 VX/VX Ace active build는 다음 실행 준비에서 새 generation을 만듭니다. 이미지 갱신 외의 운영자 작업은 없습니다.

    backup 기능 제거

    backup 기능 제거: backup.sh·복구 drill·LINKS_BACKUP_* 설정·backup evidence 테이블 삭제(migration 0002). runtime GC는 더 이상 backup 검증을 기다리지 않고 유예·세션·hold만으로 퇴역 build를 삭제한다. 1.0.9부터 migration 릴리즈는 rollback snapshot 없이 진행된다. 기존 data/backups 디렉터리는 LINKS가 쓰지 않으므로 운영자가 삭제한다. 1.0.8에서의 sh update.sh는 그대로 동작하며(release에 남긴 호환 stub), 갱신 뒤 NAS의 backup.sh·ops/backup-verify.compose.yaml은 자동으로 지워진다.

    • backup Compose service와 .env.example의 LINKS_BACKUP_SOURCE도 지웠습니다. update.sh가 받는 배포 파일은 7개에서 5개(compose.yaml, infra/docker/Caddyfile, update.sh, reset.sh, ops/runtime-package-coordinator.sh)로 줄었습니다.
    • 그대로인 것: 1.0.8의 postgres TCP+select 1 healthcheck와 모든 service의 Watchtower 제외 label.

    운영자 주의

    • 공유 링크는 관리 화면의 설치본 대화상자에서 만들고 끕니다. 쓰지 않는 링크는 끕니다.
    • 게스트의 세이브는 게스트 브라우저에만 남으며 서버에서 복구·이전할 수 없습니다.

    검증과 남은 범위

    • PASS: 브랜치 gate(최종 1.0.9 소스, 고유 Compose project)
      • static(Prettier·ESLint·typecheck·docs-static), 전체 unit 149 files·1,222 tests, 문서 검사, git diff --check.
      • schema gate 33 files·230 tests: 빈 DB fresh 적용과 1.0.8 기준 schema + 0001+0002 migration 적용 결과의 구조 등가, 사슬 base → 기준 schema, GC 5 tests.
      • deploy 기록기 96·reset 기록기 30 synthetic case, Compose config 3조합(19·19·30 services)과 Watchtower label, foundation, postgres-init-race 1회, runtime-workers(evidence 없이 grace가 지난 첫 build GC 완료).
      • browser acceptance mz-chromium: 입력·CSP·Bearer·sandbox 격리·서버 세이브 복원·retained build와 공유 링크 게스트 단계 21개 단언(게스트 홈·목록 401, 브라우저 세이브·reload 복원, Player save 요청 0, 링크 끄기 뒤 실행 중·실패 화면 게임 종료 약 60초, 모르는·준비 안 된 링크 거부).
      • 고 DPR gate: Chromium·Firefox 각 42 측정 PASS.
    • PASS: 릴리스 gate(Compose v2.20.1, NAS 조건)
      • 환경: 격리 docker:24.0.2-dind, 공식 Docker Compose v2.20.1 binary(게시 checksum 일치), stager 1026:100, ./data bind store, library 최상위 0:0 000 + 1026 ACL. 합성 HTTPS release 서버와 합성 TLS registry에 게시된 1.0.8 image와 이 릴리스의 1.0.9 image를 넣었습니다.
      • 1.0.8 설치 → reset.sh → update.sh, 합성 MZ ready build, 로그인 사용자 세이브(ETag 기록), sh backup.sh 1회(backup run·released pin·evidence 행 생성).
      • 설치된 1.0.8 sh update.sh → 1.0.9: exit 0(47초), Pending migrations: 2, 5개 파일 설치·release와 동일, 구 backup.sh·ops/backup-verify.compose.yaml 삭제, .tmp 0. schema current(이력 0001 → 0002), backup table 없음·pin 종류 play-session만. 12개 service network 불일치 0·unhealthy 0·모두 Watchtower 제외, readiness PASS, catalog·Player 1.0.9. postgres container 재생성 없음. 세이브 ETag·bytes·Player save 파일 목록 불변, MZ ready 유지, row count 불변.
      • 공유 링크: 관리자 API로 생성 201 → 세션 없이 /play/<token> 200(no-store), 링크 조회 ready, 목록 API 401, 게스트 PlaySession·Player launch 200, Player /save GET·POST 403 → 끈 뒤 조회 410.
      • 재-update: exit 0(13초), 배포 파일 변경 없음.
    • 리뷰: R46c(게스트 공유 링크 보안 3라운드), R50b(ARCA 0.1.19 pin 2라운드), R57(backup 제거) 모두 '병합 가능'.
    • 알려진 제한·NOT RUN: 실제 NAS 갱신, 실제 모바일 기기와 실제 VX/VX Ace 게임의 고 DPR 표시, 실제 Cloudflare 경유 확인, live provider. PostgreSQL·Player 컨테이너 재시작 뒤 데이터 지속성 전용 gate가 없습니다(backup-restore runner 삭제로 생긴 공백, R57-01, 개발 계획 후속). ARCA 0.1.19의 resize_screen letterbox 바깥 잔상은 ARCA 후속 항목입니다.

    배포 이미지와 파일

    • Git annotated tag는 1.0.9이고 최종 소스는 53f517cd1e입니다(branch release-1.0.9).
    • 단일 linux/amd64 이미지: git.2ex.dev/hanyul/links:1.0.9 = git.2ex.dev/hanyul/links:latest
    • 원격 digest: sha256:9148653250cf303f046ead45d826cc55d8d069fb581443fc624d49c7e3da2131
    • release asset은 없습니다. update.sh가 tag 1.0.9의 5개 배포 파일을 HTTPS로 받습니다. 대응은 update.sh=ops/deploy-registry.sh, reset.sh=ops/reset-registry.sh이고, 나머지는 compose.yaml·infra/docker/Caddyfile·ops/runtime-package-coordinator.sh입니다.
    Downloads 2