Self-Hosting met Docker: Lessen uit de Praktijk

· 2 min lezen

Self-hosting is een achtbaan. Het ene moment ben je trots op je perfect draaiende setup, het volgende moment is je database gecrasht en werkt niets meer. Dit is wat ik geleerd heb.

De basis: Docker Compose

Elke service draait in een eigen container, georkestreerd via Docker Compose. Geen geklooi met dependencies — één docker compose up -d en alles draait.

Mijn compose.yml bevat:

  • Nginx reverse proxy (met Let’s Encrypt auto-renewal)
  • Nextcloud (met Redis caching en PostgreSQL)
  • Forgejo (Git server)
  • Home Assistant (connected via host network voor Zigbee)
  • Fail2ban (gekoppeld aan Nginx logs)

Les 1: Backups zijn geen optie

Ik heb het op de harde manier geleerd. Een corrupte database zonder backup is pure paniek. Mijn huidige strategie:

  • Dagelijks: database dumps naar lokale backup locatie
  • Wekelijks: volledige backup naar externe schijf (rsync)
  • Maandelijks: offsite kopie naar een andere locatie

Script draait via cron, stuurt status naar Telegram:

#!/bin/bash
pg_dump nextcloud > /backups/nextcloud-$(date +%Y%m%d).sql
tar czf /backups/volumes-$(date +%Y%m%d).tar.gz /var/lib/docker/volumes/
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
  -d "chat_id=$CHAT_ID" -d "text=Backup OK: $(date)"

Les 2: Monitor alles

Zonder monitoring weet je niet wat er speelt. Mijn stack:

  • Prometheus — metrics verzamelen van alle containers
  • Grafana — dashboards met realtime CPU, RAM, disk, netwerk
  • Node Exporter — systeem metrics van de Mac Mini
  • Uptime Kuma — externe health checks met Telegram alerts

Les 3: Automatiseer updates

Handmatig updaten is foutgevoelig. Watchtower checkt dagelijks op nieuwe container images en pulled automatisch. Voor breaking changes heb ik staging containers.

watchtower:
  image: containrrr/watchtower
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  command: --interval 86400 --cleanup

Les 4: Security first

  • Fail2ban — blokkeert brute force pogingen op SSH en Nginx
  • CrowdSec — community threat intelligence
  • Nginx hardening — alleen TLS 1.3, sterke ciphers
  • VPN — WireGuard voor remote access (geen poorten open)

De kosten

ServiceKosten/maand
Stroom (Mac Mini idle)~€4
Domeinnaam~€1
Cloud backup (B2)~€2
Totaal~€7

Een vergelijkbare setup bij cloud providers kost al snel €50-100 per maand.

Is het het waard?

Absoluut. Niet alleen voor de kostenbesparing, maar vooral voor de controle en het leerproces. Elke fout die ik maak leert me iets over Linux, netwerken en systeembeheer. Dat is onbetaalbaar.