The Claude + n8n + VPS stack I run everything on
Two VPSs, one orchestrator, one reasoning engine. The exact topology behind every automation I ship — and why I stopped trusting Zapier for anything that matters.
content/videos/video-slots.ymlThe question I get asked the most: "what's actually running under your automations?" Answer: two VPSs, one orchestrator, one reasoning engine. Nothing exotic. Everything owned.
The topology

VPS1 — production surface
- Caddy (automatic HTTPS)
- Next.js 15 (this site)
- Supabase auth proxy
- Stripe webhook receiver
VPS2 — infra + orchestration
- Caddy (for staging + n8n subdomain)
- n8n (orchestrator — cron, webhooks, fanout)
- Postgres (n8n DB + app DB for experiments)
- Uptime Kuma (self-hosted status page)
- Staging environment for every PR before prod
Both boxes run Docker Compose. Both are rebuildable from git + environment variables in under 20 minutes.
Where Claude fits
If a workflow needs to read, summarize, classify, or write — Claude. If it needs to trigger, route, schedule, or call an API — n8n.
Concretely:
The three rules I run the stack by
- Own the orchestrator. Zapier is fine until pricing or rate limits bite. n8n on my own box never does.
- One reasoning engine. Claude is the only LLM in the hot path. Others get called from n8n when specifically useful (e.g. Whisper for transcription).
- Infra as code. Every service in Docker Compose. Every secret in an env file. Nothing clicked into a dashboard that can't be redeployed from git.
What it costs
Plus metered spend on Claude, Resend, Cloudinary, and Stripe. All of it scales with actual usage, not seat counts.
Get the exact blueprintNext in this series: the Docker Compose files, verbatim.