VibeHost Architecture

GKE Control Plane + Cloudflare Workers Data Plane
Internal · 2026-04-28
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
Staging: *.vibehost.tech / Production: *.vibehost.space

VibeHost 是什麼

VibeHost 是 vibe coding 的 hosting layer。使用者用 AI 產生的專案,一個指令就能部署上線分享。靜態優先,Next.js SSR 作為進階 runtime。CLI-first,每個命令都支援 --json,讓 AI agent 可以直接驅動。

📦

Tarball Deploy

Client 打包 .tar.gz POST 上去。Content-addressed chunked blob 自動去重。不走 git,不走 docker push。

stable
🔀

Channels

Preview deploys 是命名的 channel(production、dark-mode、pr-42),不是 git branch。Server 不知道 git 的存在。

stable
⬇️

vibehost pull

Deployment 就是 source of truth。有權限的人可以 pull 一個部署、編輯、重新部署。不需要 clone repo。

stable

兩條部署路徑

Static(預設,~5 秒)

CLI
pack tarball
API
extract + R2 upload
Cloudflare
inline Worker
~5s

R2 REST API 遇到特殊檔名(如含 .. 的 chunk hash)會被 WAF 擋,自動 fallback 到 wrangler assets deploy(~13s)。

Next.js SSR — Client Build(~22 秒)

CLI
opennextjs-cloudflare build
CLI
rewrite abs paths
API
wrangler deploy
~22s

Next.js SSR — Server Build NEW(~2-3 分鐘)

CLI
pack source
(exclude node_modules)
API
spawn Builder Job
Builder Pod
install + build
API
wrangler deploy
~2-3min

vibehost deploy --build=server 讓 server 來跑 build,適合沒裝 Node.js 的環境(AI agent、手機、CI)。CLI 上傳原始碼後 polling 等待 Builder Job 完成。

Server Build 架構 NEW

元件在哪裡做什麼
--build=auto|server|clientCLIauto 自動判斷(有 Node.js 且有 lockfile → client,否則 server)
?build=serverAPI endpoint接收 source tarball,啟動 Builder Job
Builder JobK8s Job
vibehost-builds ns
gVisor sandbox、2 vCPU / 4GB、15 min timeout
GCS Build CacheGCS bucketkey = cache/nextjs/<appId>/<channel>/<lockfileHash>
快取 node_modules + .next/cache
Log StreamingBuilder → APIPer-deployment HMAC token,batch POST build logs

安全模型

🛡️

gVisor Sandbox

Builder pod 跑在 gVisor (runsc) 上,使用者程式碼的 syscall 不碰 host kernel。

🔑

Per-deployment Token

每個 build 用 HMAC 產生獨立 token,防止跨 deployment 的 log injection。

🚫

Restricted npm

Builder 的 .npmrc 預設封鎖 postinstall scripts,阻止供應鏈攻擊。

Cloudflare Workers Data Plane

每個 app 是一個獨立的 Cloudflare Worker(獨立 V8 isolate)。沒有共用 process、沒有 container escape 面。

App 類型Worker 內容Backing Store
StaticInline proxy Worker → R2R2 bucket
Next.js SSROpenNext Worker (server function + image optimizer)R2 (assets) + KV (ISR cache)

Channel 隔離

Production channel 部署為 vh-{team}-{app},preview channel 部署為 vh-{team}-{app}-ch-{channel}。部署 preview 絕不影響 production Worker。

Visibility 管控

非 public 的 app 在 Worker 裡嵌入 auth guard,fetch 前先呼叫 API 的 /authz/check。Password gate + share link 疊加在 visibility 之上(AND 邏輯,不 short-circuit)。

GKE Control Plane

元件類型說明
APIDeploymentExpress + Drizzle,處理 deploy、auth、grants、channels
DashboardDeploymentNext.js 16 + shadcn/ui,Cookie-based session
PostgresStatefulSet + PVCSchema migrations = raw SQL(drizzle-kit 不在 prod image)
RedisDeploymentBullMQ job queue(previewer screenshots)
PreviewerDeploymentPlaywright Chromium,截圖 → R2
BuilderK8s Job (on-demand)gVisor sandbox,GCS cache,15 min TTL

Routing

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

存取控制

Workspaces

Billing / admin boundary。Owner / Admin / Member 角色。可設 Google email domain auto-join。

Teams

Teams 擁有 apps。一個 workspace 底下多個 teams。

Per-app Grants

Viewer / Deployer / Admin 三種角色,可以給 team 或個別 email。

Visibility + Gates

Public / Workspace / Private 三層。Password gate + share link 疊加上去(AND 邏輯)。

Environment Variables NEW

Per-app 環境變數,AES-256-GCM 加密儲存(key = sha256("vh:env:v1:" + AUTH_SECRET))。分為 build-time(注入 Builder Job)和 runtime(注入 Worker)。透過 vibehost env set/get/list/rm 管理。

近期改動

Server-side Build 完整閉環
CLI --build=server → API spawn K8s Job → GCS cache → wrangler deploy。整條路徑通了。
#51 #52 #53 #55 #56 #57 #62 #63 #64
Per-app Build/Runtime Env Vars
AES-GCM 加密,build-time 注入 Builder、runtime 注入 Worker。
#53 #60
GCS Build Cache
node_modules + .next/cache 用 lockfile hash 做 key,GCS 做 backing store。二次 build 快很多。
#57
Control Plane Pool 擴容
min/max nodes 從 1/2 升到 2/4,因應 Builder Job 和 production traffic。
#58
Auto-detect Package Manager
Builder 自動偵測 pnpm/yarn/npm,處理缺少 lockfile 的情況。
#56
Claude Code Review Workflow
CI 新增 AI code review,PR 自動跑 review。
#47
CLI Artifacts 搬到 R2
install.sh 和 CLI tarball 從 VM 搬到 R2,pod restart 不再遺失。
#40 #49

Monorepo 結構

路徑內容
apps/apiHTTP handlers、auth、deploy orchestration、Cloudflare deploy
apps/cliCommander CLI、tarball packing、chunked upload
apps/dashboardNext.js 16 + shadcn/ui(host-side :4100)
apps/previewerBullMQ + Playwright 截圖
apps/extensionChrome MV3 — AI Canvas deploy(Gemini/ChatGPT/Claude/v0)
apps/trailerRemotion 產品影片 + Vite landing page
packages/databaseDrizzle schema + migrations + query helpers
packages/sharedZod DTO schemas、error codes、constants
packages/tarballPack/unpack + 安全驗證
infra/pulumiPulumi IaC(GKE、Gateway、node pools)

接下來

🌐

Custom Domains on CF

目前 DNS 驗證通了但 routing 還在 Traefik。要遷移到 Workers Domains API。

planned
📊

Quotas & Usage

Storage / bandwidth / deploy count 目前沒有限制。需要配額系統。

planned
🧹

R2 Object GC

舊 deploy 的 R2 objects 會累積。需要 TTL / keep-last-N sweeper。

planned
🔄

AUTH_SECRET Rotation

目前 rotation 會 break 所有 token + 所有加密的 env vars。需要 dual-key window。

planned