Volver al inicio

Docker Compose para servidores IaC: configuración

Enfoque que utiliza Docker Compose para servidores personales IaC: scripts bootstrap y host-facts, firewall nftables idempotente, WireGuard con limpieza. Despliegue vía rsync+ssh, actualizaciones Renovate. Plantilla de repositorio para DNS/VPN/monitoreo.

Servidores IaC: Docker Compose up sin Ansible
Advertisement 728x90

Gestión de servidores personales con Docker Compose como IaC

La experiencia práctica demuestra que manejar de 1 a 5 servidores con docker compose up simplifica la Infraestructura como Código (IaC) sin necesidad de Ansible. Este enfoque requiere familiaridad con docker-compose.yml, experiencia en configuraciones manuales y ganas de automatizar. Los elementos clave incluyen un script para despliegue con rsync + SSH y el almacenamiento de secretos en Git (usando sops o git-secret). Docker Compose garantiza idempotencia, reduciendo el trabajo manual.

El repositorio con la plantilla muestra DNS/correo (primario/secundario), VPN (WireGuard), cortafuegos nftables y monitoreo con Netdata con alertas de Telegram. Incluye documentación y diagramas de infraestructura.

Configuración inicial y arranque

Para un servidor nuevo, crea bootstrap.sh: un script mínimo para instalar Docker. Ejecútalo manualmente o mediante cloud-init. El ejemplo minimiza cambios: actualizaciones del SO (como do-release-upgrade) o herramientas de consola (config de nvim) requieren ajustes ocasionales.

Google AdInline article slot
# Fragmento simplificado de bootstrap.sh
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
docker compose version

El script omite pasos manuales redundantes y se centra en Docker.

Cortafuegos idempotente con nftables

Docker modifica las reglas nftables en las familias ip/ip6. Almacena las tuyas en inet para evitar conflictos. bootstrap.sh configura /etc/nftables.conf y el contenedor aplica migrate.nft al hacer up.

Usa dockerize para renderizar e inyectar variables (como la IP de host-facts.sh). Idempotencia total:

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;
        # Filtrado antes del NAT de Docker
    }
}

Manejo de WireGuard y correos del sistema

WireGuard crea una interfaz de kernel: elimínala al detener el contenedor.

finish() {
    wg-quick down "$INTERFACE"
}
trap finish EXIT
wg-quick up "$INTERFACE"
sleep inf

Los correos del sistema (de systemd, unattended-upgrades) se enrutan mediante un bind-mount de /var/spool/postfix en un contenedor postfix. Cola compartida entre host y contenedor.

host-facts.sh para detalles específicos del servidor

Este script genera variables de entorno para 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

Leer después