목표
데스크톱 Fleet 을 "어디서든 브라우저로 쓰는" 형태로 만든다 — 단, 클라우드 인프라를 사지 않는다. 내 PC 의 Docker 컨테이너 하나에 Fleet 서버·CLI·웹터미널을 담고 Cloudflare Tunnel(+Access) / Tailscale 로 노출한다.
배경
SaaS 전환 검토가 v1(풀 클라우드 K8s+microVM) → v2(Vercel+Supabase 하이브리드) → v3(터널 셀프호스트) 로 수렴. 근거: ① 1차 목표가 "개인이 어디서든" 이므로 멀티테넌트 격리·과금이 불필요, ② 실행이 본인 머신이라 구독 CLI ToS 제약(구독 OAuth 제3자 사용 금지, Anthropic 2026-04·Google 2026-03)이 데스크톱과 같은 위치로 내려옴, ③ 코어 엔진이 Electron 비의존 순수 TS + 포트/어댑터라 공사가 전송층 하나로 좁혀짐.
설계 요약 (계획서 v3)
- 두 개의 문: ① 웹터미널(ttyd+tmux) — TUI 직접 대화, 구독제 정석 사용, 헤드리스 불요 · ② Fleet 오케스트레이션 — 헤드리스(stream-json) 유지(기계 운전에는 기계용 출력 계약이 필수, TUI 스크레이핑은 버전 취약이라 기각)
- 유일한 실질 공사 = 전송층 교체: Electron IPC → WebSocket.
ipcMain.handle→WS 요청-응답, webContents.send→WS broadcast, window.fleet 브리지 구현체 교체(renderer 무변경, src/shared/types.ts 가 계약). 어댑터 2개: SecretCrypto(safeStorage→파일 암호화)·워크스페이스 선택(다이얼로그→경로 입력)
- ApprovalGate: 로직 무변경 — WS 이벤트→승인 카드(폰 승인), 연결 클라이언트 부재 시 타임아웃=거부(fail-closed)
- CLI 이미지: 버전 태그 고정(자동 업데이트 차단), 로그인 볼륨 영속, 신 버전은 stream-json 파싱 스모크 GREEN 후 교체
- ToS 포지셔닝: 구독제 헤드리스 = "쓸 수 있는 동안 쓰는 할인". 기준은 API 키 —
LlmSession 추상화 덕에 env 하나로 전환(코드 무변경)
- 확장 경로: "PC 꺼짐" 이 아프면 v2(Supabase 계층 추가), 상용화 시 v1. 전송층 추상화·CLI 이미지는 세 버전 공통 기반 — 단 v3 WS 프로토콜 자체는 단일 사용자 전제라 승격 시 인증·테넌트 계층을 위에 추가(설계 리뷰 정정)
계획서: docs/fleet-saas-infra-plan-v3.html (본 설계) · -v2.html(Supabase 하이브리드) · .html(v1 풀 클라우드) — 등재 PR 에서 커밋.
Phase 체크리스트 (체크포인트 1 리뷰 반영판)
착수 전 실측 항목
운영 규칙
목표
데스크톱 Fleet 을 "어디서든 브라우저로 쓰는" 형태로 만든다 — 단, 클라우드 인프라를 사지 않는다. 내 PC 의 Docker 컨테이너 하나에 Fleet 서버·CLI·웹터미널을 담고 Cloudflare Tunnel(+Access) / Tailscale 로 노출한다.
배경
SaaS 전환 검토가 v1(풀 클라우드 K8s+microVM) → v2(Vercel+Supabase 하이브리드) → v3(터널 셀프호스트) 로 수렴. 근거: ① 1차 목표가 "개인이 어디서든" 이므로 멀티테넌트 격리·과금이 불필요, ② 실행이 본인 머신이라 구독 CLI ToS 제약(구독 OAuth 제3자 사용 금지, Anthropic 2026-04·Google 2026-03)이 데스크톱과 같은 위치로 내려옴, ③ 코어 엔진이 Electron 비의존 순수 TS + 포트/어댑터라 공사가 전송층 하나로 좁혀짐.
설계 요약 (계획서 v3)
ipcMain.handle→WS 요청-응답,webContents.send→WS broadcast,window.fleet브리지 구현체 교체(renderer 무변경,src/shared/types.ts가 계약). 어댑터 2개:SecretCrypto(safeStorage→파일 암호화)·워크스페이스 선택(다이얼로그→경로 입력)LlmSession추상화 덕에 env 하나로 전환(코드 무변경)계획서:
docs/fleet-saas-infra-plan-v3.html(본 설계) ·-v2.html(Supabase 하이브리드) ·.html(v1 풀 클라우드) — 등재 PR 에서 커밋.Phase 체크리스트 (체크포인트 1 리뷰 반영판)
5034801, 2026-07-02): CLI+ttyd+tmux 이미지 · compose · 실 Cloudflare 터널+Access 프로덕션 라이브(5/5). 완료 정의 전량 충족: 폰 브라우저claude대화 + tmux 세션 생존 + CLI 로그인 볼륨 동시 세션 간섭 실측 기록 + 마운트 범위 문서화 + ttyd 선택 근거B6 6-PR, 2026-07-0306): B1 run 이벤트 커서(PR feat(#197-B1): run 이벤트 커서 — FleetEvent.seq 단조 스탬프 + eventCursor 갭 감지 (코어 계약) #198) · B2 WS 프로토콜+브리지(PR feat(#197-B2): WS 프로토콜 + 채널 매니페스트 + 클라이언트 브리지 #199) · B3 서버 엔트리+32핸들러+어댑터(PR feat(#197-B3): 서버 엔트리 + 핸들러 테이블 + 어댑터 + loopback bind + 정적 서빙 #200) · B4 renderer 웹모드 배선(PR feat(#197-B4): renderer 웹모드 배선 + Electron 표면 게이팅 + 웹 스모크 #202) · B5 보안층 JWT/JWKS/nonce(PR feat(#197-B5): 보안층 — Origin·Access JWT·WS nonce·CSP·authenticated presence #211) · B6 env allowlist+컨테이너(PR feat(#197-B6): 자식 env 격리 + 소켓 exp 종료 + fleet 컨테이너 배포 (Phase B 최종) #213). 계약 테스트 5종 포함 전량 GREEN + 라이브 터널 실배포(Access 실로그인→UI·WS·세션)착수 전 실측 항목
운영 규칙
Part of #이슈사용 —Closes금지 (메타: 워크플로 GitHub 동기화 (Claude 운영 프로세스 레포 정착 + 타겟 클라우드 Action) #135 교훈: 멀티 Phase 메타 조기 종료 방지)