Skip to content

feat(v3): Fleet 터널 셀프호스트 — 컨테이너 하나 + 터널로 어디서든 브라우저 (메타) #193

Description

@pdw96

목표

데스크톱 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 리뷰 반영판)

착수 전 실측 항목

운영 규칙

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions