← Back to blog
self-hostedinfrastructurehetznerawsgdprcoolify

Self-Hosted Infrastructure in 2026: Hetzner vs AWS Cost Breakdown

Published on 7 min read

Cloud costs are a real problem at early-stage startups. Not because AWS is evil — it's a solid platform — but because the defaults are expensive, and most teams don't optimise until the bill already hurts.

This is a breakdown of what a comparable production setup actually costs on AWS versus Hetzner in 2026, what you get with self-hosted tooling like Coolify, and when each approach makes sense.

The AWS Default Setup

A modest production environment on AWS — one EC2 instance for the app, managed Postgres, a load balancer — looks roughly like this:

ComponentMonthly cost
EC2 t3.medium (2 vCPU, 4GB)~$33
RDS db.t3.micro (Postgres)~$15
Application Load Balancer~$16
S3 (10GB + requests)~$3
Data transfer (10GB out)~$9
Total~$76–120

That's before you add a staging environment. Before CloudWatch logs. Before Route 53. Before you wonder why your bill jumped $40 because of an accidental NAT Gateway.

It's not outrageous for a funded startup. But for a pre-revenue product with 200 users? It's non-trivial — and that's the optimistic version where someone actually went through and removed the defaults.

What the Same Setup Costs on Hetzner

Hetzner is a German cloud provider with data centres in Nuremberg, Falkenstein, Helsinki, and Ashburn (US). For EU workloads, the first three are relevant.

ComponentMonthly cost
CX31 (2 vCPU, 8GB RAM)€9.01
Hetzner Managed Postgres (starter)€15
Object Storage (250GB)€4.99
Hetzner Load Balancer (optional)€5.83
Total (with LB)~€35
Total (without LB)~€29

For the simplest setups — single server, Coolify handling the reverse proxy — you skip the load balancer entirely. €29/month for a production-grade stack.

The gap is 60–75% cheaper for early-stage workloads. On a 12-month horizon, that's roughly $700–$1,000 saved before the first euro of revenue.

What Coolify and Dokploy Actually Give You

The part that made self-hosting painful in 2018 was ops overhead. You had a VPS, a repo, and you SSH'd in to deploy. Rollbacks were a prayer.

That problem is mostly solved now.

Coolify and Dokploy are Docker-based PaaS tools you run on your own server. Think Heroku or Render — but on hardware you control.

What you get:

  • Git push deploys — connect a repo, push to main, it builds and deploys
  • SSL termination — Traefik handles HTTPS automatically via Let's Encrypt
  • Reverse proxy — multiple services on one server, each on its own subdomain
  • Env management — secrets stored server-side, injected at runtime
  • Rollbacks — one click in the UI
  • Preview environments — optional, but available

The setup time for a fresh Hetzner server + Coolify is under 30 minutes. After that, deploying a new service is the same workflow as pushing to Vercel.

Dokploy is the leaner alternative if you want less UI and more control. I use Coolify for most client setups — the UI is polished enough that non-technical co-founders can read what's deployed without calling me.

The GDPR Angle

For DACH startups serving EU users, where your data lives is a compliance question, not a preference.

AWS eu-central-1 (Frankfurt) is geographically in the EU. But AWS Inc. is a US company, and the legal situation around US government access to AWS data — even data stored in Europe — has been murky since Schrems II. The EU-US Data Privacy Framework (2023) improved things, but the underlying tension remains. Your DPA with AWS lists sub-processors. Those sub-processors have their own sub-processors.

On Hetzner, data stays on hardware in Germany or Finland, operated by a German GmbH. The DPA is straightforward. You're not signing agreements with 12 entities you've never heard of.

For products that handle personal data — which is most SaaS — this removes a compliance conversation entirely. You can tell your users their data never leaves the EU, backed by something enforceable.

My Standard Self-Hosted Setup

This is the stack I deploy for most early-stage clients who want self-hosted infrastructure:

Hetzner CX31 (€9.01/mo)
└── Coolify
    ├── App container (Next.js / whatever the stack is)
    ├── PostgreSQL (initially on same server)
    └── Uptime Kuma (monitoring)

Hetzner Object Storage (€4.99/mo)
└── S3-compatible — used for file uploads, backups

Plausible Analytics (€9/mo managed, or self-hosted)

Total: ~€25–35/month depending on whether Plausible is managed or self-hosted.

For database backups, pg_dump to Object Storage on a cron job. For uptime monitoring, Uptime Kuma sends a Telegram notification when something goes down. Both take about an hour to set up.

When the app grows and the single server becomes a constraint — traffic spikes, Postgres needs more IOPS, the team wants staging parity — you migrate specific services. Postgres moves to Hetzner Managed Postgres or Neon. The app might move to Vercel. Each migration happens when the pain justifies the cost, not on day one.

When Self-Hosted Makes Sense

  • Predictable workloads. If you roughly know your traffic patterns, you don't need elastic scaling. A CX31 handles several hundred concurrent users without breaking a sweat.
  • Cost-sensitive early stage. Pre-revenue, every €100/month matters. Saving €60–80 on infrastructure is real money.
  • EU data residency requirements. Regulated industries, health-adjacent products, anything touching GDPR in a serious way.
  • Basic Linux ops comfort. You don't need to be a sysadmin. You need to know what df -h does and not panic when a cron job fails.

When AWS or GCP Still Wins

Self-hosted isn't the right answer everywhere.

  • Global CDN requirements. CloudFront, GCP's CDN, or even Cloudflare are better for global latency than anything you'll set up on a single Hetzner server.
  • Managed ML services. If you need SageMaker, Vertex AI, or GPU instances with managed tooling — AWS/GCP have an enormous head start. Hetzner has GPU servers, but the managed layer doesn't exist yet.
  • Zero ops capacity. If the founding team has never touched a Linux server and has no interest in learning, managed platforms save you from yourself. Vercel + Neon + a managed queue is a legitimate production stack.
  • Instant horizontal scale. If your product can genuinely go from 100 to 100,000 users overnight — Product Hunt launch, press hit — elastic scaling matters. Auto Scaling Groups are worth the complexity.

The Honest Caveat

Self-hosted means you own the ops. Not "you have someone to call." You.

Disk fills up — you fix it. Postgres needs a vacuum — you deal with it. SSL cert renewal fails because Let's Encrypt rate-limits — you debug it at 11pm.

Budget 1–2 hours per month for maintenance. That's realistic for a well-configured setup. If that's not time you have, or not time you want to spend, factor in the cost of someone who will — or stay on managed infrastructure and pay the premium.

The economics work because the tooling has matured. Coolify handles the operational surface area that used to require real DevOps work. But it doesn't handle everything. Know what you're signing up for before you migrate.

The Migration Path

Starting self-hosted doesn't mean staying self-hosted forever. It's not a permanent commitment.

A sensible progression:

  1. Months 0–12: Single Hetzner server, Coolify, Postgres on the same machine. Focus on the product.
  2. Months 12–24: App traffic grows → move Postgres to Hetzner Managed or Neon. Add a second server for staging.
  3. As needed: Individual services move to best-fit providers. App on Vercel if the team prefers it. Storage on Cloudflare R2 if you need global edge. Postgres stays wherever it performs best.

The goal at the start isn't to build perfect infrastructure. It's to build something that works, costs almost nothing, and doesn't create compliance problems — so you can focus on the product.