Homelab.

One home server, on 24/7, running 14 docker containers, 3 databases, 1 OSRM tile server, and a self-hosted Minecraft network. Watchdog + nightly backups + self-healing.

Hardware
CPU

Intel Xeon E3 (Haswell), 4 cores / 8 threads. AES-NI, no AVX-512. Enough for everything I run.

RAM

32 GB DDR3 ECC. Peak usage: ~22 GB when the Minecraft server has 20+ players online.

Disk

2× 1 TB SSD in ZFS mirror for the OS + databases. 1× 4 TB HDD for backups and the Minecraft worlds.

Network

1 Gbps LAN, public IPv4 + IPv6, 100 Mbps up. Tailscale for the things that shouldn't be on the public internet.

Uptime

Last unplanned restart: 7 months ago (kernel update). Planned restarts: twice a year for security patches.

What runs here
In production

safalife-api (FastAPI + PostgreSQL) · safalife-bot (aiogram 3) · OSRM tile server · 1 ai-persona bot (OpenRouter + Ollama fallback) · nginx reverse proxy · 1 cron + 1 systemd timer · 1 watchdog.

Side projects

ai-persona (the bot I talk to) · tiktok-streak-bot · tg-mc-bot (Minecraft Telegram bridge) · Grafana · Uptime Kuma.

Bigger than expected

The Minecraft server. Velocity + 5 backends (lobby, survival, anarchy, minigames, limbo), AuthMe across all, daily backups, watchdog. 12 GB of live world data.

Self-healing
Watchdog

Cron every 2 min — if any port (25565, 7125, 8310, 8804, 8200) stops responding, restart the corresponding docker container. Logs to a file that I occasionally read.

Backups

Nightly pg_dump + minecraft world tar + config snapshot, kept 7 days, 4 weeks, 6 months. Verified with restore tests every Sunday. The Sunday test has caught 2 bugs in my backup script so far.

Updates

Dependabot / Renovate on every repo. I review and merge weekly, then `git pull && docker compose up -d --build`. If something breaks, the previous image is still in the registry.

What's not here
A VPS

I used to have one. The home line has more bandwidth and I don't have to pay for it. As long as my ISP doesn't change that, I'm staying.

Kubernetes

Three services don't need an orchestrator. Docker compose + a watchdog + a tmux session for the long-running things is plenty.

Cloudflare

Direct nginx, let's encrypt, a clean A record. One less vendor in the stack.