Hetzner Cloud Migration Plan — 2026-03-13¶
Status: Research complete, pending decision¶
Context¶
Current VPS is Vultr ($6/mo, 1 vCPU, 1 GB RAM, 25 GB disk, 2 TB traffic). Running 11 containers with 737M/954M RAM used. Planning to upgrade to 2 GB for changedetection + playwright, which would cost ~$12/mo on Vultr. Hetzner offers significantly better specs per dollar.
Pricing Comparison¶
Current Workload Requirements¶
- 11 containers (headscale, caddy, DERP, pihole, adguard, unbound, uptime-kuma, ntfy, changedetection, playwright, headscale-backup)
- ~750M RAM baseline + playwright spikes
- 2 GB minimum, 4 GB comfortable
- Low disk usage (~9 GB of 30 GB)
- Low traffic (<1 TB/mo)
Plan Comparison¶
| Vultr (current) | Vultr 2GB | Hetzner CX22 (EU) | Hetzner CAX11 ARM (EU) | Hetzner CX32 (EU) | |
|---|---|---|---|---|---|
| Price | $6/mo | ~$12/mo | ~$4.10/mo | ~$4.10/mo | ~$6.80/mo | | vCPUs | 1 | 1 | 2 | 2 (ARM) | 4 | | RAM | 1 GB | 2 GB | 4 GB | 4 GB | 8 GB | | Disk | 25 GB | 50 GB | 40 GB | 40 GB | 80 GB | | Traffic | 2 TB | 3 TB | 20 TB | 20 TB | 20 TB |
Best value: CX22 at ~$4/mo gives 4 GB RAM (4x current) for less than current Vultr bill. CX32 at ~$6.80/mo gives 8 GB for half the Vultr 2 GB upgrade price.
Additional Costs¶
- Backups: 20% of server price (~$0.82/mo for CX22)
- Snapshots: per GB/mo (minimal)
- Floating IPs: ~$1/mo for IPv4
- Firewalls: free
Features¶
Datacenter Locations¶
| Location | Region | Traffic | Pricing |
|---|---|---|---|
| Nuremberg (NBG1) | Germany | 20 TB | Base price | | Falkenstein (FSN1) | Germany | 20 TB | Base price | | Helsinki (HEL1) | Finland | 20 TB | Base price | | Ashburn (ASH) | Virginia, US | 1 TB | +20% | | Hillsboro (HIL) | Oregon, US | 1 TB | +20% | | Singapore (SIN) | Asia | 0.5 TB | +20% |
Note: No South America datacenter. Vultr has Sao Paulo/Buenos Aires. EU→Paraguay latency ~200-250ms, but Tailscale peer-to-peer connections bypass the VPS for most traffic. Only DERP relay and headscale control plane are affected.
Infrastructure¶
- NVMe SSDs in RAID10
- Block storage volumes up to 10 TB (attachable/detachable)
- IPv4 + /64 IPv6 included
- Floating IPs (reassignable within datacenter)
- Private networks (free)
- Stateful firewalls (free)
- Managed load balancers
ARM Option (CAX series)¶
Ampere Altra processors, same price as x86. Good for Docker workloads but requires arm64 container images. Most of our images support arm64:
- headscale, caddy, pihole, adguard, unbound, uptime-kuma, ntfy, changedetection — all have arm64
- playwright (sockpuppetbrowser) — needs verification, likely x86 only
Recommendation: Stick with x86 (CX series) to avoid compatibility issues unless playwright arm64 support is confirmed.
Developer Tools¶
- REST API,
hcloudCLI - Official Terraform provider (
hetznercloud/hcloud) - Official Ansible collection
- Packer builder for custom images
- Go and Python SDKs
Benefits Over Vultr¶
- 2-4x better specs/dollar in EU locations
- 20 TB included traffic vs 2-3 TB at Vultr
- Free firewalls (managed, stateful)
- Mature IaC ecosystem (Terraform, Ansible, Packer)
- ARM option at same price (CAX series)
- Stronger privacy — German company, GDPR-native (see below)
Limitations¶
- No South America datacenter — ~200-250ms from Paraguay (acceptable for Tailscale control plane)
- US locations cost 20% more with only 1 TB traffic
- No managed object storage (Vultr has S3-compatible)
- Strict abuse policy — automated reports can cause fast suspensions
- Support reportedly slower for complex issues
Privacy Comparison¶
| Hetzner (Germany) | Vultr (US) | |
|---|---|---|
| Jurisdiction | GDPR-native | GDPR as overlay | | Data Protection Officer | Published, dedicated | Generic email | | Sub-processors | Mostly EU-based, transparent list | US-based, opaque | | Ad data sharing | None | Shares with advertising partners | | Analytics | Self-hosted Matomo | Third-party tracking | | Data residency | EU emphasis, documented exceptions | No guarantees | | Payment processing | German processor (Computop), no CC stored | Standard |
Hetzner is meaningfully stronger on privacy: GDPR-native jurisdiction, no ad data sharing, EU sub-processors, transparent practices.
Payment Methods¶
| Method | Details |
|---|---|
| Credit Card | Visa, Mastercard, Amex, UnionPay (auto-charged, except UnionPay) | | SEPA Direct Debit | EUR accounts only, auto-charged | | PayPal | Available for active accounts | | Bank/Wire Transfer | Manual payment |
For Paraguay: Visa/Mastercard credit card is the straightforward option.
Migration Plan¶
Pre-migration (remote)¶
- Verify all container images have x86_64 builds (or arm64 if choosing CAX)
- Create Hetzner account, provision CX22 in Falkenstein (FSN1)
- Set low TTL on public DNS records pointing to current Vultr IP
- Prepare new server: install Docker, clone homelab repo, set up SSH keys
Migration (15-30 min downtime)¶
- Stop VPS containers on Vultr
- Export headscale SQLite DB + noise keys + config
- Export uptime-kuma data, changedetection data, ntfy config
- Transfer to Hetzner server (rsync or scp)
- Recreate
.envfiles from KeePassXC - Create Docker networks (
headscale-net,monitoring-net,adguard-net,scraping-net) - Deploy stacks in order: networking → monitoring → scraping
- Update public DNS A records to new Hetzner IP
- Update
hs.cronova.dev/etc/hostsentries on Docker VM and NAS - Verify headscale, all Tailscale nodes reconnect
- Verify Caddy certs (Let's Encrypt will auto-provision)
- Update Ansible inventory with new IP
Post-migration¶
- Verify all services accessible via
*.cronova.dev - Test DERP relay connectivity
- Monitor for 48h
- Destroy Vultr instance
- Update memory and documentation
Rollback¶
Keep Vultr instance running for 48h after migration. If issues arise, revert DNS records and restart Vultr containers.
Recommendation¶
Hetzner CX22 (Falkenstein) at ~$4.10/mo:
- 2 vCPU, 4 GB RAM, 40 GB disk, 20 TB traffic
- Saves ~$8/mo vs Vultr 2 GB upgrade ($12/mo)
- 4x the RAM, 2x the CPU, 10x the bandwidth
- Stronger privacy posture (German GDPR-native)
- Only trade-off: ~80ms more latency for DERP relay (acceptable)