Home · Builds · The home-office database

Build

One small box, every record the household keeps.

Postgres, Metabase, and Caddy on a Hetzner VM. Two databases, one read-only role, nightly dumps, and a credential-rotation lesson I only needed to learn once.

Scratch cut · 1:54 The part 2 scratch cut: the server created, Docker installed, the compose file brought up, and the health column turning green. Demo environment, scratch narration.

The problem

Spreadsheets do not remember. Every household question I cared about was a question across time: are we on pace, what did we spend in the same month last year, when did that balance start drifting. I wanted one place where every record lands and every dashboard reads from the same tables.

What I built

The VM, the firewall ring, and the three containers, drawn in dots.

What it taught me

A database password lives in more places than you think. The reader role's password exists in Postgres, in Metabase's saved connection, and in the environment file. Rotate one and nothing breaks until the next container restart, when every chart fails at once. Rotate all three in one change and restart to prove it.

Decision

DNS for the Metabase hostname is set to DNS only, not proxied. Caddy needs direct traffic to issue its certificate. Everything else on the domain goes through Cloudflare.

Audio · 2 minWhy one VM and not a managed database
Scratch narration The cost argument, the backup argument, and where this stops scaling.
All buildsNext build · Lean FIRE and Coast FIRE tracker

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