Gérer ses serveurs personnels avec Docker Compose en tant qu'IaC
L'expérience pratique montre que la gestion de 1 à 5 serveurs avec docker compose up simplifie l'Infrastructure as Code (IaC) sans recourir à Ansible. Cette approche nécessite une bonne connaissance du fichier docker-compose.yml, de l'expérience en configuration manuelle et une envie d'automatiser. Les éléments clés incluent un script pour le déploiement via rsync + SSH et le stockage des secrets dans Git (avec sops ou git-secret). Docker Compose assure l'idempotence, réduisant ainsi les tâches manuelles.
Le dépôt avec le modèle présente DNS/email (primaire/secondaire), VPN (WireGuard), pare-feu nftables et surveillance Netdata avec alertes Telegram. Il inclut des docs et des schémas d'infrastructure.
Configuration initiale et bootstrap
Pour un nouveau serveur, créez bootstrap.sh — un script minimal pour installer Docker. Exécutez-le manuellement ou via cloud-init. L'exemple limite les changements au strict minimum : les mises à jour du système (comme do-release-upgrade) ou les outils en console (config nvim) nécessitent des ajustements occasionnels.
# Extrait simplifié de bootstrap.sh
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
docker compose version
Le script évite les étapes manuelles redondantes et se concentre sur Docker.
Pare-feu idempotent avec nftables
Docker modifie les règles nftables dans les familles ip/ip6. Stockez les vôtres dans inet pour éviter les conflits. bootstrap.sh configure /etc/nftables.conf, et le conteneur applique migrate.nft au démarrage.
Utilisez dockerize pour rendre et injecter des variables (comme l'IP depuis host-facts.sh). Idempotence complète :
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;
# Filtrage avant le NAT Docker
}
}
Gestion de WireGuard et des e-mails système
WireGuard crée une interface kernel : démontez-la à l'arrêt du conteneur.
finish() {
wg-quick down "$INTERFACE"
}
trap finish EXIT
wg-quick up "$INTERFACE"
sleep inf
Les e-mails système (de systemd, unattended-upgrades) transitent via un bind-mount de /var/spool/postfix vers un conteneur postfix. File d'attente partagée entre hôte et conteneur.
host-facts.sh pour les détails spécifiques au serveur
Ce script génère des variables d'environnement pour docker-compose.yml : IP, UID/GID, interfaces.
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
Aucun commentaire pour le moment.