ADR 0012: Dokploy on Hetzner CAX11 over Vercel / Railway / DigitalOcean
ADR 0012: Dokploy on Hetzner CAX11 over Vercel / Railway / DigitalOcean
Section titled “ADR 0012: Dokploy on Hetzner CAX11 over Vercel / Railway / DigitalOcean”- Status: Accepted
- Date: 2026-04-14
- Deciders: Ideony team
Context
Section titled “Context”Ideony needs a hosting platform for the NestJS API, PostgreSQL, Redis, and later the mobile web build. Budget is constrained (bootstrapped MVP 0). Data residency in the EU is required. The team wants full control over infra without fighting PaaS limits (build timeouts, opaque pricing, vendor lock-in on DB).
Decision
Section titled “Decision”Host on Hetzner CAX11 ARM64 (€5/mo, Helsinki data centre) managed via Dokploy (self-hosted PaaS layer). Dokploy provides Docker-based deployments, environment management, and a REST API, eliminating the need for a paid PaaS. IaC via Pulumi TypeScript (Hetzner + Dokploy cloud-init). SSH key: ~/.ssh/id_ed25519_ideony-deploy.
Consequences
Section titled “Consequences”- €5/mo all-in for API + DB + Redis + storage proxy — lowest possible fixed cost.
- EU (Helsinki) data residency satisfies GDPR without add-on fees.
- Full root access: custom Docker builds, PostGIS extension, Redis config, cron jobs.
- Dokploy REST API enables zero-dashboard automation (autonomous infra ops).
- Pulumi IaC means the entire server is reproducible from code.
- Single-node: no built-in HA. CAX11 failure = downtime until snapshot restore.
- CAX11 (2 vCPU ARM64, 4 GB RAM) OOMs during on-server Docker builds → solved via registry-based CD (ADR 0020).
- Dokploy API keys are UI-only creation; must be generated manually once at setup.
Alternatives considered
Section titled “Alternatives considered”- Vercel — rejected: optimised for Next.js/edge; NestJS long-running process + PostgreSQL don’t fit serverless model; expensive at scale.
- Railway — rejected: EU region add-on cost; less control over raw Postgres config; no PostGIS guarantee.
- DigitalOcean — rejected: DO Hatch programme (startup credits) requires VC backing; standard DO pricing exceeds Hetzner for equivalent specs.
- Fly.io — rejected: per-machine pricing unpredictable; Postgres managed offering less mature than self-hosted.