Retour à l'accueil

Docker Compose pour serveurs IaC : configuration

Approche utilisant Docker Compose pour serveurs personnels IaC : scripts bootstrap et host-facts, pare-feu nftables idempotent, WireGuard avec nettoyage. Déploiement via rsync+ssh, mises à jour Renovate. Modèle de repo pour DNS/VPN/surveillance.

Serveurs IaC : Docker Compose up sans Ansible
Advertisement 728x90

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.

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

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;
        # 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.

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

Lire ensuite