Home · Builds · Finance ETL · Part 2

Finance ETL · Part 2 of 8

One VM, three containers, one hour.

Provision a Hetzner VM with a firewall, install Docker, and bring up Postgres, Metabase, and Caddy with a single compose file. HTTPS is automatic, which may be the most satisfying sentence in this series.

Scratch cut · 1:54 Screen recording, sped up where it waits. Firewall create, server create, Docker install, compose up, the health check turning green, the first HTTPS load. Demo data, scratch voice, real pipeline. The live recording takes over once it is shot.

Provision

export HCLOUD_TOKEN=<token from the project>
hcloud ssh-key create --name drew-mbp --public-key-from-file ~/.ssh/id_ed25519.pub
hcloud firewall create --name metabase-fw --rules-file firewall-rules.json
hcloud server create --name brosnan-growth-metabase --type cx22 \
  --image ubuntu-24.04 --location ash --ssh-key drew-mbp --firewall metabase-fw

The firewall rules file allows SSH and HTTPS inbound and nothing else. Postgres is never published to the host; it lives on an internal Docker network.

Compose

Each container has a memory limit and an OOM score so that if something has to die under pressure, it is Metabase and not the database.

The box: the VM rises out of the plane, the firewall ring draws itself with one gap, and the three containers land on top.

DNS and backups

The Metabase hostname is an A record set to DNS only, because Caddy needs direct traffic to prove it owns the name. A nightly cron runs pg_dump and keeps 14 days of dumps on disk, excluding the raw landing schema because it can be replayed from the API.

Audio · 3 minSizing the box
Scratch narration Why a small box with under four gigabytes of RAM is enough, what the swapfile is for, and when I would move Postgres off the VM.
The VM inside a firewall ring, with Postgres 16, Metabase, and Caddy on top and their memory limits below.
Plate II · The box
Free to borrow for your feed · Square edition

Where you are: a box with HTTPS and nothing in it yet. Next, the data arrives.

Previous · The pictureNext · Part 3 of 8Landing the data: keep every response, forever

Write to me

I built this for a household. Imagine it pointed at your company.

Fractional CTO and CFO engagements start with a short call. No deck required, no pitch either. Bring the number you do not trust.

Tell me what is stuck