Persönliche Server mit Docker Compose als IaC verwalten
Praktische Erfahrung zeigt: Die Verwaltung von 1–5 Servern mit docker compose up macht Infrastructure as Code (IaC) ohne Ansible kinderleicht. Diese Methode setzt Kenntnisse in docker-compose.yml, Erfahrung mit manueller Einrichtung und den Drang zur Automatisierung voraus. Wichtige Bausteine sind ein Skript für rsync + SSH-Deployment sowie die Speicherung von Geheimnissen in Git (mit sops oder git-secret). Docker Compose sorgt für Idempotenz und reduziert manuelle Arbeit erheblich.
Das Repository mit dem Template demonstriert DNS/E-Mail (primär/sekundär), VPN (WireGuard), nftables-Firewall und Netdata-Monitoring mit Telegram-Alerts. Es enthält Dokumentation und Infrastrukturdiagramme.
Erste Einrichtung und Bootstrap
Für einen neuen Server erstellen Sie bootstrap.sh – ein minimalistisches Skript zur Docker-Installation. Führen Sie es manuell oder via cloud-init aus. Das Beispiel hält Änderungen minimal: OS-Upgrades (wie do-release-upgrade) oder Konsolen-Tools (nvim-Konfig) erfordern gelegentliche Anpassungen.
# Vereinfachtes bootstrap.sh-Snippet
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
docker compose version
Das Skript überspringt überflüssige manuelle Schritte und fokussiert sich auf Docker.
Idempotente Firewall mit nftables
Docker passt nftables-Regeln in den ip/ip6-Familien an. Lagern Sie Ihre Regeln in inet ab, um Konflikte zu vermeiden. bootstrap.sh richtet /etc/nftables.conf ein, und der Container wendet migrate.nft beim up an.
Nutzen Sie dockerize, um Variablen (z. B. IP aus host-facts.sh) zu rendern und einzubinden. Volle Idempotenz:
flush ruleset inet
flush chain ip filter DOCKER-USER
flush chain ip6 filter DOCKER-USER
table inet filter {
chain prerouting-before-docker {
type filter hook prerouting priority dstnat - 2;
# Filterung vor Docker-NAT
}
}
Umgang mit WireGuard und System-E-Mails
WireGuard erstellt eine Kernel-Schnittstelle: Nehmen Sie sie beim Stoppen des Containers wieder ab.
finish() {
wg-quick down "$INTERFACE"
}
trap finish EXIT
wg-quick up "$INTERFACE"
sleep inf
System-E-Mails (von systemd, unattended-upgrades) werden über ein Bind-Mount von /var/spool/postfix in einen postfix-Container geleitet. Gemeinsame Warteschlange zwischen Host und Container.
host-facts.sh für server-spezifische Details
Dieses Skript erzeugt Umgebungsvariablen für docker-compose.yml: IP, UID/GID, Schnittstellen.
uid() { getent passwd "$1" | cut -d: -f3; }
gid() { getent group "$1" | cut -d: -f3; }
metadata() { curl -s "http://169.254.169.254/metadata/v1$1"; }
set -euo pipefail
if test -z "${DEVEL:-}"; then
WAN_IP="$(metadata /interfaces/public/0/ipv4/address)"
UID_POSTFIX="$(uid postfix)"
GID_POSTFIX="$(gid postfix)"
else
WAN_IP=0.0.0.0
UID_POSTFIX=1001
GID_POSTFIX=1001
fi
for _var in WAN_IP UID_POSTFIX GID_POSTFIX; do eval "export $_var=\"$${_var}\""; done
— Editorial Team
Noch keine Kommentare.