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.
Intel Xeon E3 (Haswell), 4 cores / 8 threads. AES-NI, no AVX-512. Enough for everything I run.
32 GB DDR3 ECC. Peak usage: ~22 GB when the Minecraft server has 20+ players online.
2× 1 TB SSD in ZFS mirror for the OS + databases. 1× 4 TB HDD for backups and the Minecraft worlds.
1 Gbps LAN, public IPv4 + IPv6, 100 Mbps up. Tailscale for the things that shouldn't be on the public internet.
Last unplanned restart: 7 months ago (kernel update). Planned restarts: twice a year for security patches.
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.
ai-persona (the bot I talk to) · tiktok-streak-bot · tg-mc-bot (Minecraft Telegram bridge) · Grafana · Uptime Kuma.
The Minecraft server. Velocity + 5 backends (lobby, survival, anarchy, minigames, limbo), AuthMe across all, daily backups, watchdog. 12 GB of live world data.
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.
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.
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.
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.
Three services don't need an orchestrator. Docker compose + a watchdog + a tmux session for the long-running things is plenty.
Direct nginx, let's encrypt, a clean A record. One less vendor in the stack.