PORTLANEDocs

Hosting and sizing

Recommended OS, Hetzner Cloud instance types, and indicative monthly costs for Portlane

Portlane runs as Docker Compose on a single Linux VM (or bare metal): six engines, two Postgres databases, observability (Grafana, Loki, Prometheus), plus an optional GitHub Actions self-hosted runner for portlane-pipelines CI.

Performance depends more on RAM, NVMe disk, and network than on distro tweaks. Pick a mainstream LTS and size the machine for Postgres + containers.

ChoiceRecommendation
Ubuntu 24.04 LTSDefault — Docker Engine, Python 3.12 for the runner, wide Hetzner image support
Ubuntu 22.04 LTSAcceptable if tooling requires it; prefer 24.04 for new installs
Debian 12Valid minimal alternative if your team already standardises on Debian

Avoid exotic host OS images unless you have a strong reason. Portlane is tested around Docker on Ubuntu/Debian.

Hetzner Console: select Ubuntu 24.04, NVMe local disk (not volume-only for Postgres), region Germany (Nuremberg/Falkenstein) or Finland for EU latency and GDPR.

Hetzner Cloud — indicative sizing (2026)

Prices below are monthly caps, excl. VAT, for CPX (shared AMD vCPU, good price/performance) in Germany / Finland, per Hetzner’s June 2026 price list. Add ~€0.50/month if you attach a public IPv4 (IPv6-only is cheaper). Verify live prices on hetzner.com/cloud before ordering.

ProfileHetzner planvCPURAMDisk (typ.)~€/monthUse case
Dev / labCPX3248 GB80 GB NVMe~35Solo dev, few flows, light traffic
Dev comfortableCPX42816 GB160 GB NVMe~70Recommended dev + runner + LGTM stack headroom
Prod (light)CPX42816 GB160 GB NVMe~70Low/medium message volume, single tenant
Prod (comfortable)CPX521632 GB240 GB NVMe~100Higher throughput, retention, peak load

Two environments (dev + prod) = two servers (or two CPX instances). Do not share one runner label between dev and prod. Budget roughly €70 + €70 (CPX42 × 2) or €35 + €70 (CPX32 dev + CPX42 prod) per month excl. VAT.

Why not the smallest plans?

CPX22 (4 GB RAM, ~€20/month) is tight for Postgres central + pivot + six engines + observability. Usable for a short demo, not for day-to-day integration work.

What actually drives cost

  1. NVMe — Postgres and durable queues are I/O sensitive; prefer local NVMe over network-only storage for the databases.
  2. RAM — 16 GB is a practical minimum for a full stack; 32 GB for prod with margin.
  3. Egress — Hetzner includes generous traffic in EU; hyperscaler egress fees do not apply the same way, but monitor if you push large payloads to external ERPs.

Network hardening (any host)

  • Bind Portlane to loopback (PORTLANE_BIND_ADDR=127.0.0.1). For external access, use the built-in TLS reverse proxy (Caddy with automatic Let's Encrypt certificates, enabled by setting a domain in the deploy env): it exposes only ports 80/443 and serves the console and webhook ingress over HTTPS.
  • To open only the webhook entry point to partners — keeping the console and everything else private — a dedicated bind address exists for the API gateway alone (PORTLANE_APIM_BIND_ADDR); it is protected by token auth, payload signatures, and rate limiting. See Partner access.
  • Do not expose Postgres (5432/5433) on the public Internet.
  • Firewall: SSH (restricted), 80/443 for the reverse proxy only.

On-prem runbooks (install script, runners, deploy/publish.env) ship in the customer bundle documentation inside your Control Tower (/docs).

On this page