---
name: cloud-hosting-expert
description: "Expert guide for deploying SaaS applications with multiple entry points on modern edge and serverless platforms like Vercel and Cloudflare / Panduan ahli untuk mendeploy aplikasi SaaS dengan multiple entry points di platform edge dan serverless modern seperti Vercel dan Cloudflare."
author: "Roedy Rustam"
version: "4.4.2"
---
# Cloud Hosting Expert (2026 Edition)
[English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
---
## English
### Orchestration & Integration
- **Upstream & Orchestration**: `zero-to-prod-orchestrator` (Phase 7 deployment), `brainstorming`, `session-memory-manager`.
- **CI/CD & Container Pipelines**: `ci-cd-devops-architect` (deployment automation), `github-actions-expert` (cloud actions & OIDC), `docker-container-expert` (container images for Railway/Fly).
- **Edge Compute & Serverless**: `cloudflare-workers-expert` (Cloudflare Workers, D1, KV, R2), `api-gateway-proxy-expert` (edge routing & proxies).
- **Monitoring & Auto-Remediation**: `proactive-background-watcher` (deployment health checks), `self-healing-cloud-orchestrator` (production crash hotfixing).
### Description
Expert guide for deploying SaaS applications and their multiple entry points (landing page, app, super admin subdomain) on modern edge and serverless platforms. Covers Vercel, Cloudflare Workers & Pages, Railway, Fly.io, and **Cloudflare Workers AI** for AI-powered edge workloads.
### Trigger Conditions
- Deploying a Next.js, Hono, or Astro application to Vercel, Cloudflare, or Railway.
- Configuring custom domains and subdomain routing (e.g., `app.domain.com`, `admin.domain.com`).
- Setting up Edge Middleware for multi-tenant tenant identification.
- Deploying AI inference workloads to **Cloudflare Workers AI**.
- Deploying long-running backend services to **Railway** or **Fly.io**.
- Implementing CDN caching strategies for SaaS applications.
### Platform Selection Guide (2026)
| Platform | Best For | Free Tier | Cold Start |
|---|---|---|---|
| **Vercel** | Next.js, static, serverless functions | ✅ | ~200ms |
| **Cloudflare Workers** | Ultra-low latency APIs, edge logic | ✅ (100k req/day) | ~0ms |
| **Cloudflare Pages** | Static + full-stack (via Workers) | ✅ | ~0ms |
| **Railway** | Node.js/Go/Python long-running services, Bun | ✅ (5$/mo credit) | None |
| **Fly.io** | Docker containers, global distribution | ✅ (3 shared VMs) | ~500ms |
| **Render** | Node.js/Go/Python persistent services | ✅ (spins down) | ~30s |
### Multi-Entry Point Deployment Architecture
For SaaS applications, separate deployments for each entry point:
```
myapp.com → Vercel (Marketing/Landing — Next.js static)
app.myapp.com → Vercel (SaaS App — Next.js dynamic)
admin.myapp.com → Vercel (Super Admin — Next.js, restricted access)
api.myapp.com → Railway/Fly.io (Backend API — long-running)
cdn.myapp.com → Cloudflare R2 (Static assets & user uploads)
```
### Vercel — Next.js Deployment
#### Multi-Domain Configuration
```json
// vercel.json
{
"rewrites": [
{ "source": "/(.*)", "destination": "/$1" }
],
"headers": [
{
"source": "/(.*)",
"headers": [
{ "key": "X-Content-Type-Options", "value": "nosniff" },
{ "key": "X-Frame-Options", "value": "DENY" },
{ "key": "Strict-Transport-Security", "value": "max-age=63072000; includeSubDomains; preload" }
]
}
]
}
```
#### Edge Middleware for Tenant Routing
```typescript
// middleware.ts — runs at the edge before every request
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const hostname = request.headers.get('host') ?? '';
const subdomain = hostname.split('.')[0];
// Route admin subdomain — enforce strict auth check
if (subdomain === 'admin') {
const adminToken = request.cookies.get('admin-session')?.value;
if (!adminToken) {
return NextResponse.redirect(new URL('/login', request.url));
}
}
// Identify tenant from subdomain for multi-tenant apps
if (subdomain !== 'www' && subdomain !== 'app' && subdomain !== 'admin') {
const response = NextResponse.next();
response.headers.set('x-tenant-slug', subdomain);
return response;
}
return NextResponse.next();
}
export const config = {
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
};
```
### Cloudflare Workers — Edge APIs
#### Hono on Cloudflare Workers
```typescript
// src/index.ts
import { Hono } from 'hono';
import { cors } from 'hono/cors';
import { rateLimit } from '@/middleware/rateLimit';
const app = new Hono<{ Bindings: Env }>();
app.use('*', cors({ origin: ['https://app.myapp.com'] }));
app.use('/api/*', rateLimit(100)); // 100 req/min via KV
app.get('/api/health', (c) => c.json({ status: 'ok', region: c.env.CF_REGION }));
app.get('/api/data', async (c) => {
// Access Cloudflare D1 (SQLite at edge)
const result = await c.env.DB.prepare('SELECT * FROM items LIMIT 20').all();
return c.json(result.results);
});
export default app;
```
#### Cloudflare Workers AI (On-Device Edge Inference)
Run AI models directly at Cloudflare's edge — no external API calls needed:
```typescript
export default {
async fetch(request: Request, env: Env) {
const { text } = await request.json() as { text: string };
// Run Llama 3 or Mistral at the edge
const response = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
messages: [
{ role: 'system', content: 'You are a helpful assistant.' },
{ role: 'user', content: text }
],
stream: true,
});
return new Response(response, {
headers: { 'Content-Type': 'text/event-stream' }
});
}
};
```
Available models on Workers AI:
- `@cf/meta/llama-3.1-8b-instruct` — Fast general-purpose chat
- `@cf/mistral/mistral-7b-instruct-v0.2` — Fast instruction model
- `@cf/baai/bge-small-en-v1.5` — Text embedding (for RAG)
- `@cf/stabilityai/stable-diffusion-xl-base-1.0` — Image generation
### Railway — Bun / Node.js Long-Running Services
```dockerfile
# Dockerfile for Railway (Bun runtime)
FROM oven/bun:1.2-alpine
WORKDIR /app
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile
COPY . .
EXPOSE 3000
CMD ["bun", "run", "src/server.ts"]
```
```toml
# railway.toml
[build]
builder = "DOCKERFILE"
[deploy]
startCommand = "bun run src/server.ts"
healthcheckPath = "/health"
healthcheckTimeout = 10
restartPolicyType = "ON_FAILURE"
```
### Environment Variables & Secrets Management
- **Vercel**: Use Vercel's built-in secrets panel — supports preview/production scoping.
- **Cloudflare**: Use `wrangler secret put SECRET_NAME` or the dashboard.
- **Railway**: Use Railway's variable groups for shared secrets across services.
- **Never** commit `.env` files — use `.env.example` as documentation only.
### Caching Strategy
```typescript
// Vercel: Cache API responses at the edge
export async function GET() {
const data = await fetchData();
return Response.json(data, {
headers: {
'Cache-Control': 'public, s-maxage=60, stale-while-revalidate=300',
}
});
}
// Cloudflare: Use Cache API
const cache = caches.default;
const cached = await cache.match(request);
if (cached) return cached;
```
### Sovereign Execution, Token Efficiency & Invariants
| Dimension | Sovereign Mandate & Deterministic Contract |
| :--- | :--- |
| **Frontier Model Cascade** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) |
| **Availability Fallback** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Zero unhandled missing-model errors) |
| **KV-Cache & Token Protocol** | Pin static instructions & schemas at prompt prefix (`kv-cache-prefix-optimizer`); pass surgical `CONTEXT_MAP.md` slices (<250 tokens/call) during Swarm Fan-Out |
| **SaaT CLI & MCP Dispatch** | CLI: `vibes skill exec cloud-hosting-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` |
| **NFR & Anti-Slop Invariants** | P99 API Gateway Latency < 85ms, OpenAPI 3.1 / TypeSpec strict schema parity, RFC 9457 Problem Details error contracts, Idempotency-Key enforcement; 100% complete zero-placeholder output verified via `node scripts/check-anti-slop.js --strict` |
---
---
## Bahasa Indonesia
### Integrasi Orkestrasi
- **Hulu & Orkestrasi**: `zero-to-prod-orchestrator` (Deployment Fase 7), `brainstorming`, `session-memory-manager`.
- **Pipeline CI/CD & Kontainer**: `ci-cd-devops-architect` (otomasi deployment), `github-actions-expert` (aksi cloud & OIDC), `docker-container-expert` (image kontainer Railway/Fly).
- **Komputasi Edge & Serverless**: `cloudflare-workers-expert` (Cloudflare Workers, D1, KV, R2), `api-gateway-proxy-expert` (routing edge & proxy).
- **Pemantauan & Auto-Remediasi**: `proactive-background-watcher` (pemeriksaan kesehatan deployment), `self-healing-cloud-orchestrator` (perbaikan otomatis crash produksi).
### Deskripsi
Panduan ahli untuk men-deploy aplikasi SaaS dan multiple entry points-nya (landing page, aplikasi, subdomain super admin) di platform edge dan serverless modern. Mencakup Vercel, Cloudflare Workers & Pages, Railway, Fly.io, dan **Cloudflare Workers AI** untuk workload AI di edge.
### Kondisi Pemicu
- Men-deploy aplikasi Next.js, Hono, atau Astro ke Vercel, Cloudflare, atau Railway.
- Mengonfigurasi domain kustom dan routing subdomain (`app.domain.com`, `admin.domain.com`).
- Menyiapkan Edge Middleware untuk identifikasi tenant multi-tenant.
- Men-deploy workload inferensi AI ke **Cloudflare Workers AI**.
- Men-deploy layanan backend long-running ke **Railway** atau **Fly.io**.
---
### Panduan Pemilihan Platform (2026)
| Platform | Pilihan Terbaik Untuk | Tier Gratis | Cold Start |
|---|---|---|---|
| **Vercel** | Next.js, situs statis, serverless functions | ✅ | ~200ms |
| **Cloudflare Workers** | API latensi ultra-rendah, logika edge | ✅ (100k req/hari) | ~0ms |
| **Cloudflare Pages** | Statis + full-stack (via Workers) | ✅ | ~0ms |
| **Railway** | Layanan Node.js/Bun/Go/Python long-running | ✅ ($5 kredit/bln) | Nol |
| **Fly.io** | Kontainer Docker terdistribusi global | ✅ (3 shared VM) | ~500ms |
---
### Implementasi Pola Kunci (TypeScript)
#### 1. Edge Middleware untuk Routing Subdomain & Tenant (Next.js 15)
```typescript
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const hostname = request.headers.get('host') ?? '';
const subdomain = hostname.split('.')[0];
// Rute subdomain admin — tegakkan pemeriksaan otentikasi ketat
if (subdomain === 'admin') {
const sesiAdmin = request.cookies.get('admin-session')?.value;
if (!sesiAdmin) {
return NextResponse.redirect(new URL('/masuk', request.url));
}
}
// Identifikasi tenant dari subdomain pada aplikasi multi-tenant
if (subdomain !== 'www' && subdomain !== 'app' && subdomain !== 'admin') {
const response = NextResponse.next();
response.headers.set('x-tenant-slug', subdomain);
return response;
}
return NextResponse.next();
}
export const config = {
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
};
```
#### 2. Cloudflare Workers AI (Inferensi AI di Edge)
```typescript
export default {
async fetch(request: Request, env: Env) {
const { teks } = (await request.json()) as { teks: string };
// Jalankan inferensi Llama 3.1 langsung di edge tanpa server eksternal
const response = await env.AI.run('@cf/meta/llama-3.1-8b-instruct', {
messages: [
{ role: 'system', content: 'Anda adalah asisten AI yang akurat.' },
{ role: 'user', content: teks },
],
stream: true,
});
return new Response(response, {
headers: { 'Content-Type': 'text/event-stream' },
});
},
};
```
#### 3. Railway Dockerfile untuk Runtime Bun Berkecepatan Tinggi
```dockerfile
FROM oven/bun:1.2-alpine
WORKDIR /app
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile
COPY . .
EXPOSE 3000
CMD ["bun", "run", "src/server.ts"]
```
### Matriks Eksekusi Berdaulat, Efisiensi Token & Invarian
| Dimensi | Mandat Berdaulat & Kontrak Deterministik |
| :--- | :--- |
| **Kaskade Model Frontier** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) |
| **Invarian Fallback Ketersediaan** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Bebas gagal saat model belum tersedia/kuota penuh) |
| **Protokol Hemat Token & KV-Cache** | Kunci instruksi & skema statis di prefix awal (`kv-cache-prefix-optimizer`); kirim potongan `CONTEXT_MAP.md` (<250 token/panggilan) saat Fan-Out |
| **Eksekusi SaaT CLI & MCP** | CLI: `vibes skill exec cloud-hosting-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` |
| **Invarian NFR & Anti-Slop** | Latensi P99 API < 85ms, paritas skema ketat OpenAPI 3.1 / TypeSpec, kontrak error RFC 9457 Problem Details, penegakan Idempotency-Key; kode 100% tuntas tanpa placeholder diverifikasi melalui `node scripts/check-anti-slop.js --strict` |