[결론] 이 기능은 이미 코드에 엔드투엔드로 존재합니다 — 버튼도(bridge.tsx의 #rst-btn), 엔드포인트도(settings/routes.tsx), 상태조회도, 데몬 핸들러도 다 있습니다. 변우석님이 새로 붙일 필요는 없고, lax-dtb.pages.dev/settings/bridge에 이미 떠 있을 가능성이 높습니다(이 브랜치가 배포됐다면). 다만 데몬 측에 LAX 비호환 결함이 하나 있어 그걸 고쳐 커밋했습니다.
[무엇을 바꿨나]
daemon/daemon.js의 restart-graceful 핸들러를 수정. 기존엔 Wikicomu 전용 restart-daemon.ps1(없는 WikicomuDaemon 스케줄러 + 자체 start-hidden.vbs 재기동)을 spawn → LAX의 run.bat 슈퍼바이저 루프와 충돌. 이제는 .shutdown 플래그만 떨구고 메인 루프가 진행 태스크 마치고 exit → run.bat이 새 코드로 단일 인스턴스 재기동.
- 커밋:
fc7dbed(daemon.js 1파일, +14/-11). 다른 jigeup 작업물은 손대지 않음.
[왜]
LAX 런처 체인 확정: start-hidden.vbs → cmd /c run.bat(숨김 무한루프). Jason의 모델이 정확합니다. 기존 ps1 경로는 run.bat 재기동 + ps1의 별도 재기동이 겹쳐 중복 슈퍼바이저 루프가 30초마다 락 뒤에서 헛도는 결함이 있었습니다(싱글톤 락은 이중 폴링만 차단).
[검증]
node --check daemon/daemon.js→ 통과(구문). 커밋에 daemon.js만 포함 확인.- ❗라이브 미검증: 실제 버튼→재시작 1건은 아직 안 봤습니다. 이유는 5번(부트스트랩) — 돌고 있는 데몬 프로세스가 메모리에 옛 코드를 들고 있어, 새 핸들러를 타려면 먼저 1회 재시작이 필요합니다. 그래서 DONE이라 하지 않습니다. 부트스트랩 재시작 후 라이브 1건 확인이 남았습니다.
[롤백]
git revert fc7dbed 한 번. (또는 데몬은 이 워킹카피에서 직접 실행되므로, 파일 원복 후 1회 재시작이면 원상복구)
변우석님께 — 정확한 계약 (이미 구현됨)
1) 재시작 트리거
POST /settings/bridge/restart-graceful
(요청 바디 없음)
→ 200 { "ok": true }
→ 403 (관리자 아님) / 503 (KV 미설정)
내부동작: KV BRIDGE_SECRETS에 daemon:jason-pc:command = "restart-graceful" (TTL 120s) 기록. D1 아님 — 권장하신 D1 플래그 대신 이미 KV가 배선돼 있고, KV가 더 맞습니다(저지연 + TTL 자동만료 + poll에서 delete로 소비-1회). D1 신설 불필요.
2) 상태 조회 (요청됨→재시작중→완료 표시용, 이미 폴링 구현돼 있음)
GET /settings/bridge/status
→ 200 { "last_seen": <unix초>, "online": <bool> } // 120초 이내
bridge.tsx의 기존 스크립트가 이미 이 패턴으로 처리: 전송→online=false 관측(재시작중)→다시 online=true(완료). 추가 작업 불필요.
3) (참고) 즉시/하드 재시작: POST /settings/bridge/restart 도 존재(진행 태스크 중단·즉시). 버튼은 graceful 쪽만 쓰면 됩니다.
5개 질문 답
- 엔드포인트 스펙: 위. 메서드/경로/응답 그대로. D1 대신 KV 사용 권장.
- daemon poll→graceful→재부팅: 구현 완료(fc7dbed).
.shutdown→drain→exit→run.bat 재기동. - 중복/연타 안전성:
- 싱글톤 락(
.daemon.lock, PID 기반·stale 자동정리)이 이중 라이브 데몬 폴링을 차단(기존). - 연타: KV 같은 키 덮어쓰기 + poll 시
delete로 소비-1회 → 여러 클릭이 하나의.shutdown/단일 exit으로 수렴. UI도 전송 중 버튼 disable. 멱등. - 이번 수정으로 ps1발 중복 run.bat 루프 위험 제거.
- 싱글톤 락(
- 보안:
/settings/*는 CF Access 뒤(페이지가 명시하듯 Bypass는/bridge/*만). 추가로 라우트가user.email !== ADMIN_EMAIL → 403앱레벨 검사. 데몬 명령채널/bridge/poll은 CF Access Bypass + bridge HMAC 서명(verifyBridgeSignature) 보호. 별도 인증 추가 불필요. - 부트스트랩: 맞습니다. 단, 데몬은 이 로컬 워킹카피에서 직접 실행되므로 새 코드는 이미 디스크에 반영됨(git 배포 불필요). 돌고 있는 프로세스만 옛 코드라, 수동 1회 재시작으로 fc7dbed를 로드하면 그 다음부터 버튼이 깨끗한 경로(.shutdown drop)를 탑니다. 그 1회 부트스트랩 재시작 후, 제가 라이브 1건 검증을 마무리하겠습니다.
다음 액션(제안): ① 변우석님은 lax-dtb.pages.dev/settings/bridge에 버튼이 이미 떠 있는지 먼저 확인(이 브랜치 배포 여부) → 없으면 배포. ② jason-pc에서 데몬 수동 1회 재시작(부트스트랩). ③ 그 후 버튼→재시작 라이브 1건을 제가 확인해 최종 보고.