Overview
Most of my projects need somewhere to live: staging databases, analytics, secrets, automation. Instead of renting all of it, I turned an old laptop into a real server — and then treated it like one. It runs around twenty Docker containers across eight stacks, self-heals on reboot, backs itself up on and off site, and pages me the moment anything falls over.
What's running
- Self-hosted apps — a password manager, a budgeting app, a Metabase analytics server, and a dashboard "front door," each behind real HTTPS.
- App backends — a trimmed self-hosted Supabase stack for staging, plus the Summit leaderboard database.
- Private DNS & ad-blocking — Pi-hole as the tailnet's global nameserver.
- A reverse proxy — Caddy issuing automatic Let's Encrypt certs for clean internal URLs, reachable only inside my private Tailscale network.
Run like production
- WAL-safe backups nightly — the right method per database (SQLite online-backup, pg_dump), rotated and mirrored offsite. A restore test once caught a silent corruption bug before it could bite.
- Monitoring & alerting — uptime checks on every service, pushing phone alerts when something drops.
- Hardened access — key-only SSH, a firewall, everything bound to loopback or the tailnet. Nothing exposed to the open internet.
- Reboot-survival tested — pulled the plug for real; the whole stack came back on its own.
The status dashboard
I built a status page for the whole box — stat tiles, services by stack, backup health, and a hardening roadmap — so the state of everything is legible at a glance.
sanitized screenshot slot
Drop a sanitized screenshot (no IPs or hostnames) into assets/homelab/ and swap it in here — never link the live dashboard publicly.