-
hanyul released this
2026-10-15 12:11:28 +09:00 LINKS 1.0.10
이 릴리스는 이전 릴리스 1.0.9(
53f517cd1e) 위에 터치 가상 패드, 공유 링크 게스트 표지, 지원 브라우저 안내를 얹었습니다. 최종 소스는6a9d016126, 루트 패키지는 1.0.10, ARCA pin은 exact 0.1.19(1.0.9와 같음)입니다. schema 변경이 없어 migration이 없습니다.업그레이드: 1.0.9 → 1.0.10은
sh update.sh만 실행합니다- 갱신 방법: 배포 디렉터리에서
sh update.sh만 실행합니다.reset.sh는 실행하지 않습니다. - schema 변경 없음: DB schema는 1.0.9와 같습니다(
f7fe92f3…).update.sh는Pending migrations:줄을 출력하지 않습니다(대기 migration 0개). - 배포 파일 변경 없음:
update.sh가 받는 5개 파일(compose.yaml,infra/docker/Caddyfile,update.sh,reset.sh,ops/runtime-package-coordinator.sh)은 1.0.9와 byte 단위로 같습니다. 그래서 아무 파일도 설치하지 않고 image만 바뀝니다..env.example도 바뀌지 않아.env.production에 할 일이 없습니다. - 되돌리기: schema가 같으므로 문제가 생기면 1.0.9 image로 고정해 되돌릴 수 있습니다(
update.sh가 실패할 때 출력하는Rollback: LINKS_REGISTRY_TAG=…@sha256:…).
cd /volume1/docker/links sh update.sh성공하면 단계 표시 6줄 뒤에
Updated to 1.0.10 (catalog 6e511b7ea214), runtime.package ready.가 출력됩니다.postgres정의가 1.0.9와 같아 격리 gate에서postgrescontainer는 다시 만들어지지 않았습니다(DB 중단 0초). 원본 game library는 읽기 전용으로 유지합니다. 이번 게시 작업에서 개발·운영 DB 초기화나 NAS 배포는 실행하지 않았습니다.변경 내용
터치 가상 패드(VX/VX Ace)
- 터치가 주 입력인 기기(휴대폰·태블릿)에서 RGSS(VX/VX Ace, ARCA) 게임 화면 위에 반투명 on-screen 패드가 나옵니다. 방향 D-pad(손가락을 떼지 않고 방향 전환, 모서리는 대각선),
확인,취소(메뉴),대시, 오른쪽 위숨기기/패드토글이 있습니다. - ARCA 0.1.19의 공개
player.input(setButton·releaseAll)에 연결합니다. 여러 손가락이 같은 버튼을 누르면 마지막 손가락을 뗄 때만 뗍니다. 재시작이 진행되는 동안에는 패드를 멈추고(흐리게 표시) 끝나면 로컬과 SDK의 누름 상태를 함께 비운 뒤 다시 받습니다. 탭 숨김·종료·실패에서도 누름을 해제합니다. - 주 pointer가 fine인 기기(데스크톱, 터치 노트북)에는 나오지 않습니다. 물리 키보드·게임패드는 함께 쓸 수 있습니다.
- MV/MZ에는 패드를 그리지 않습니다. 엔진이 터치를 직접 처리합니다(한 손가락 tap = 결정, 두 손가락 = 취소).
- 로그인 실행과 공유 링크 게스트 실행 모두에 적용됩니다.
공유 링크 게스트 표지
- 공유 링크 게스트 화면의 링크 확인 중·게임 불러오는 중·실행·실패·종료 화면에 그 게임의 표지가 나옵니다. 표지가 없거나 받지 못하면 로그인 실행 화면과 같은 placeholder(
▶)를 보입니다. - 새 API
GET /api/v1/play-links/:token/cover(선택?variant=w320|w640)는 링크 token 권한으로 그 링크의 설치본 현재 표지만 돌려줍니다. 경로에 asset ID가 없어 다른 설치본이나 다른 asset을 고를 수 없습니다.Cache-Control: private, no-store, 끈 링크는 410입니다.
지원 브라우저 안내
- 실행 실패가 브라우저 능력 결함일 때만(
RUNTIME_WORKER_FAILED, SDKENVIRONMENT_UNSUPPORTED, cross-origin isolation이 필요한 session에서crossOriginIsolated·SharedArrayBuffer없음) 실패 화면에 "지원 브라우저: Chrome·Edge·Firefox(데스크톱·Android). iOS Safari와 Arc 등 일부 모바일 브라우저는 지원하지 않습니다." 한 줄을 덧붙입니다. user agent로 추정하지 않으며 저장·세션 실패에는 붙이지 않습니다. - 문서에 iOS Safari 등 WebKit(opaque-origin sandbox frame의
blob:Worker를 COEPrequire-corp아래에서 거부해 VX/VX Ace가RUNTIME_WORKER_FAILED로 멈춤; Worker 생성은 ARCA 소유라 LINKS는 우회하지 않고 ARCA 요청 후보로 둠)와 Arc(모바일)(큰 artifact를 받기 전에 멈춤, 원인 미확인)를NOT SUPPORTED로 기록했습니다.
호환
- 공유 링크 조회 API의 기본 응답은 1.0.9와 같습니다.
GET /api/v1/play-links/:token은 여전히 정확히 네 key(installationId·title·engine·ready)를 돌려주고, 새 web만?include=cover를 보내cover({width, height, variants}또는null)를 함께 받습니다. 그래서 갱신 중 열려 있던 1.0.9 게스트 페이지도 그대로 동작합니다. 반대로 새 web이 1.0.9 API를 만나면cover없는 응답을 표지 없음으로 받습니다. - 바뀐 점: 조회 API는 이제 모르는 query와
include의 다른 값을 400으로 거부합니다(1.0.9는 무시). 1.0.9 web은 query를 보내지 않으므로 영향이 없습니다. - 1.0.9에서 만든 공유 링크는 1.0.10에서 그대로 쓰입니다(격리 gate에서 확인).
검증과 남은 범위
- PASS: 브랜치 gate(최종 1.0.10 소스, 고유 Compose project)
- static(Prettier·ESLint·typecheck·docs-static), 전체 unit 152 files·1,241 tests, 문서 검사,
git diff --check. - schema gate 33 files·231 tests(빈 DB fresh 적용과 1.0 기준 schema +
0001+0002적용 결과의 구조 등가, 사슬, 공유 링크 표지·기본 응답 네 key 포함). - deploy 기록기 96·reset 기록기 30 synthetic case, Compose config 3조합(19·19·30 services)과 Watchtower label, foundation.
- 터치 패드 gate
run-player-touch-pad: Chromium(모바일 emulation, CDP touch 탭만으로 합성 VX Ace 진행·재시작 중 누름 거부)·Firefox PASS. 고 DPR gaterun-player-dpr: Chromium·Firefox PASS. - browser acceptance
mz-chromium: 12개 단언(MZ frame에 패드 없음, 지원 브라우저 안내 없음 포함)과 공유 링크 게스트 28개 단언(표지 확인 중·로드 뒤·게임 불러오는 중·실패 fallback·좁은 화면·종료 화면, 기본 조회 호환 포함) PASS.
- static(Prettier·ESLint·typecheck·docs-static), 전체 unit 152 files·1,241 tests, 문서 검사,
- PASS: 릴리스 gate(Compose v2.20.1, NAS 조건)
- 환경: 격리
docker:24.0.2-dind, 공식 Docker Compose v2.20.1 binary(게시 checksum 일치), stager 1026:100,./databind store, library 최상위0:0 000+ 1026 ACL. 합성 HTTPS release 서버와 합성 TLS registry에 게시된 1.0.9 image와 이 릴리스의 1.0.10 image를 넣었습니다. - 1.0.9 설치 →
reset.sh→update.sh, 합성 MZ ready build, 로그인 사용자 세이브, 표지 asset, 관리자 공유 링크 1개. - 설치된 1.0.9
sh update.sh→ 1.0.10: exit 0(52초),Pending migrations:줄 없음(대기 0, schemacurrentf7fe92f3…, migration 이력 변화 없음), 5개 배포 파일이 1.0.9와 같아 설치 0·크기·mtime 불변,.tmp0. 12개 service network 불일치 0·unhealthy 0·모두 Watchtower 제외, readiness PASS, catalog·Player 1.0.10.postgrescontainer 재생성 없음(DB 중단 0초). 세이브 ETag·bytes·Player save 파일 목록 불변, MZ ready 유지, row count 불변. - 1.0.9에서 만든 공유 링크를 세션 없이: 조회 200·정확히 네 key,
?include=cover200·cover포함,?include=other400,/cover200image/png(seed한 표지와 bytes 동일,private, no-store),/play/<token>200, 목록 API 401, 게스트 PlaySession·Player launch 200, Player/saveGET·POST 403. 끈 뒤 조회·표지 410. - 재-update: exit 0(13초), 배포 파일 변경 없음, 위 확인 모두 반복 PASS.
- 환경: 격리
- 리뷰: R59·R59b(터치 패드, R59 P2 재시작 경합 → R59b 해소), R60·R60b(게스트 표지, R60 P1 1.0.9 web 호환 → R60b 해소) 최종 '병합 가능'.
- 알려진 제한·NOT RUN: 실제 iOS·Android 기기에서의 패드 조작과 실제 VX Ace 게임의 패드 조작, Firefox의 touch 탭 흐름(CDP touch 없음; 표시 판정과 mouse 입력만 확인), Arc 모바일 실패 원인(미상), 실제 NAS 갱신, 실제 Cloudflare 경유, live provider, browser matrix의
mv-chromium·mz-firefox·mv-firefox.
배포 이미지와 파일
- Git annotated tag는 1.0.10이고 최종 소스는
6a9d016126입니다(branchrelease-1.0.10). - 단일 linux/amd64 이미지:
git.2ex.dev/hanyul/links:1.0.10=git.2ex.dev/hanyul/links:latest - 원격 digest:
sha256:6e511b7ea21427edb58644eba41ded437ade45bf5a49eac8c673c277d2d448e7 - release asset은 없습니다.
update.sh가 tag1.0.10의 5개 배포 파일을 HTTPS로 받습니다(1.0.9와 같은 내용). 대응은update.sh=ops/deploy-registry.sh,reset.sh=ops/reset-registry.sh이고, 나머지는compose.yaml·infra/docker/Caddyfile·ops/runtime-package-coordinator.sh입니다.
Downloads 2
-
Source code (zip)
0
2026-10-15 12:11:28 +09:00 -
Source code (tar.gz)
0
2026-10-15 12:11:28 +09:00
- 갱신 방법: 배포 디렉터리에서