Zurück zur Startseite

Docker Compose für IaC-Server: Einrichtung

Ansatz verwendet Docker Compose für IaC-Persönliche Server: bootstrap- und host-facts-Skripte, idempote nftables-Firewall, WireGuard mit Cleanup. Deployment via rsync+ssh, Renovate-Updates. Repo-Vorlage für DNS/VPN/Monitoring.

IaC-Server: Docker Compose up ohne Ansible
Advertisement 728x90

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.

Google AdInline article slot
# 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:

Google AdInline article slot
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.

Google AdInline article slot
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

Advertisement 728x90

Weiterlesen