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.
# 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:
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.
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
Aún no hay comentarios.