User / AI Agent GKE (control plane) Cloudflare (data plane)
────────────── ─────────────────── ───────────────────────
vibehost deploy ./site ────────► API pod ──────────────────────────► Workers (per app)
├── Postgres (StatefulSet) R2 (static assets)
vibehost deploy ────────► Builder pod (K8s Job) KV (ISR cache)
--build=server │ gVisor sandbox Workers Domains (DNS)
│ GCS build cache
│
├── Dashboard (Next.js 16)
├── Redis (Deployment)
└── Previewer (Playwright)
CLI ◄─────────────────────────── WebSocket logs ◄──── Worker health
VibeHost 是 vibe coding 的 hosting layer。使用者用 AI 產生的專案,一個指令就能部署上線分享。靜態優先,Next.js SSR 作為進階 runtime。CLI-first,每個命令都支援 --json,讓 AI agent 可以直接驅動。
Client 打包 .tar.gz POST 上去。Content-addressed chunked blob 自動去重。不走 git,不走 docker push。
stablePreview deploys 是命名的 channel(production、dark-mode、pr-42),不是 git branch。Server 不知道 git 的存在。
stableDeployment 就是 source of truth。有權限的人可以 pull 一個部署、編輯、重新部署。不需要 clone repo。
stableR2 REST API 遇到特殊檔名(如含 .. 的 chunk hash)會被 WAF 擋,自動 fallback 到 wrangler assets deploy(~13s)。
vibehost deploy --build=server 讓 server 來跑 build,適合沒裝 Node.js 的環境(AI agent、手機、CI)。CLI 上傳原始碼後 polling 等待 Builder Job 完成。
| 元件 | 在哪裡 | 做什麼 |
|---|---|---|
--build=auto|server|client | CLI | auto 自動判斷(有 Node.js 且有 lockfile → client,否則 server) |
?build=server | API endpoint | 接收 source tarball,啟動 Builder Job |
| Builder Job | K8s Jobvibehost-builds ns | gVisor sandbox、2 vCPU / 4GB、15 min timeout |
| GCS Build Cache | GCS bucket | key = cache/nextjs/<appId>/<channel>/<lockfileHash>快取 node_modules + .next/cache |
| Log Streaming | Builder → API | Per-deployment HMAC token,batch POST build logs |
Builder pod 跑在 gVisor (runsc) 上,使用者程式碼的 syscall 不碰 host kernel。
每個 build 用 HMAC 產生獨立 token,防止跨 deployment 的 log injection。
Builder 的 .npmrc 預設封鎖 postinstall scripts,阻止供應鏈攻擊。
每個 app 是一個獨立的 Cloudflare Worker(獨立 V8 isolate)。沒有共用 process、沒有 container escape 面。
| App 類型 | Worker 內容 | Backing Store |
|---|---|---|
| Static | Inline proxy Worker → R2 | R2 bucket |
| Next.js SSR | OpenNext Worker (server function + image optimizer) | R2 (assets) + KV (ISR cache) |
Production channel 部署為 vh-{team}-{app},preview channel 部署為 vh-{team}-{app}-ch-{channel}。部署 preview 絕不影響 production Worker。
非 public 的 app 在 Worker 裡嵌入 auth guard,fetch 前先呼叫 API 的 /authz/check。Password gate + share link 疊加在 visibility 之上(AND 邏輯,不 short-circuit)。
| 元件 | 類型 | 說明 |
|---|---|---|
| API | Deployment | Express + Drizzle,處理 deploy、auth、grants、channels |
| Dashboard | Deployment | Next.js 16 + shadcn/ui,Cookie-based session |
| Postgres | StatefulSet + PVC | Schema migrations = raw SQL(drizzle-kit 不在 prod image) |
| Redis | Deployment | BullMQ job queue(previewer screenshots) |
| Previewer | Deployment | Playwright Chromium,截圖 → R2 |
| Builder | K8s Job (on-demand) | gVisor sandbox,GCS cache,15 min TTL |
GKE Gateway API 處理 control plane routing。vibehost.com(dashboard + OAuth + install.sh),api.vibehost.com(API,Bearer token only,CORS *)。Gateway health check 預設打 GET /,需要 HealthCheckPolicy CRD 指向 /healthz。
Billing / admin boundary。Owner / Admin / Member 角色。可設 Google email domain auto-join。
Teams 擁有 apps。一個 workspace 底下多個 teams。
Viewer / Deployer / Admin 三種角色,可以給 team 或個別 email。
Public / Workspace / Private 三層。Password gate + share link 疊加上去(AND 邏輯)。
Per-app 環境變數,AES-256-GCM 加密儲存(key = sha256("vh:env:v1:" + AUTH_SECRET))。分為 build-time(注入 Builder Job)和 runtime(注入 Worker)。透過 vibehost env set/get/list/rm 管理。
| 路徑 | 內容 |
|---|---|
apps/api | HTTP handlers、auth、deploy orchestration、Cloudflare deploy |
apps/cli | Commander CLI、tarball packing、chunked upload |
apps/dashboard | Next.js 16 + shadcn/ui(host-side :4100) |
apps/previewer | BullMQ + Playwright 截圖 |
apps/extension | Chrome MV3 — AI Canvas deploy(Gemini/ChatGPT/Claude/v0) |
apps/trailer | Remotion 產品影片 + Vite landing page |
packages/database | Drizzle schema + migrations + query helpers |
packages/shared | Zod DTO schemas、error codes、constants |
packages/tarball | Pack/unpack + 安全驗證 |
infra/pulumi | Pulumi IaC(GKE、Gateway、node pools) |
目前 DNS 驗證通了但 routing 還在 Traefik。要遷移到 Workers Domains API。
plannedStorage / bandwidth / deploy count 目前沒有限制。需要配額系統。
planned舊 deploy 的 R2 objects 會累積。需要 TTL / keep-last-N sweeper。
planned目前 rotation 會 break 所有 token + 所有加密的 env vars。需要 dual-key window。
planned