Powrót do strony głównej

Docker Compose dla serwerów IaC: konfiguracja

Podejście wykorzystuje Docker Compose do IaC serwerów osobistych: skrypty bootstrap i host-facts, idempotentny firewall nftables, WireGuard z cleanup. Wdrożenie przez rsync+ssh, aktualizacje Renovate. Szablon repo dla DNS/VPN/monitoringu.

IaC serwerów: Docker Compose up bez Ansible
Advertisement 728x90

Zarządzanie osobistymi serwerami z Docker Compose jako IaC

Osobiste doświadczenie pokazuje: zarządzanie 1–5 serwerami za pomocą docker compose up upraszcza IaC bez Ansible. Podejście wymaga znajomości docker-compose.yml, doświadczenia w ręcznej konfiguracji i chęci automatyzacji. Główne składniki to skrypt dla rsync + ssh-deployu oraz przechowywanie sekretów w git (fnox lub git-secret). Docker Compose zapewnia idempotentność, minimalizując pracę ręczną.

Repozytorium z szablonem demonstruje konfigurację DNS/email (primary/secondary), VPN (WireGuard), zapory nftables, monitoringu Netdata z alertami Telegram. Struktura zawiera dokumentację i diagramy infrastruktury.

Początkowa konfiguracja i bootstrap

Dla nowego serwera utwórz bootstrap.sh — minimalny skrypt instalacji Dockera. Wykonaj go ręcznie lub przez cloud-init. Przykład minimalizuje zmiany: aktualizacje systemu operacyjnego (do-release-upgrade) lub narzędzia konsoli (nvim-konfig) wymagają rzadkich modyfikacji.

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

Skrypt unika duplikacji ręcznych działań, skupiając się na Dockerze.

Idempotentna zapora z nftables

Docker zmienia reguły nftables w rodzinie ip/ip6. Przechowuj swoje w inet, aby uniknąć konfliktów. bootstrap.sh tworzy /etc/nftables.conf, kontener stosuje migrate.nft przy up.

Renderowanie przez dockerize wstawia zmienne (IP z host-facts.sh). Pełna idempotentność:

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;
        # Filtracja przed Docker NAT
    }
}

Obsługa WireGuard i wiadomości systemowych

WireGuard tworzy interfejs kernela: usuwaj go przy zatrzymywaniu kontenera.

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

Wiadomości systemowe (systemd, unattended-upgrades) są dostarczane przez bind-mount /var/spool/postfix w kontenerze postfix. Wspólna kolejka hosta i kontenera.

host-facts.sh dla specyfiki serwerów

Skrypt generuje zmienne środowiskowe dla docker-compose.yml: IP, UID/GID, interfejsy.

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

Wsparcie DEVEL dla CI/lokalnego budowania bez rzeczywistego hosta.

Skrypt deployu i HEALTHCHECK

Jednolity skrypt: rsync + docker compose up.

rsync --recursive --links --delete "./$proj/" "${destination}:.myserver"
ssh -t "${destination}" 'set -euo pipefail
    cd ~/.myserver
    docker compose up --build --detach --remove-orphans --wait'

--wait oczekuje na healthy HEALTHCHECK. Dodawaj je ręcznie w obrazach bez wbudowanych. Cofnięcie: git checkout @~ + redeploy.

  • Zalety ręcznego deployu: Widoczność logów, szybkie debugowanie dla 2–5 serwerów.
  • Rezerwacja: Primary/secondary minimalizuje przestoje.

Aktualizacje i testowanie CI

unattended-upgrades dla hosta. Dla kontenerów — Renovate: aktualizuje FROM, obrazy compose, pakiety apk, zewnętrzne binarie (postgrey) przez regex-managers. Repo na GitHub.

CI: mise dla linterów (shellcheck, hadolint), lokalne budowanie bez sekretów.

Co jest ważne

  • Docker Compose rozwiązuje idempotentność, skrypty — początkową instalację i specyfikę hosta.
  • Idempotentna zapora w inet, WireGuard z trap na EXIT.
  • host-facts.sh + dockerize dla dynamicznych zmiennych.
  • Obowiązkowe HEALTHCHECK i --wait dla niezawodnego deployu.
  • Renovate dla automatyzacji aktualizacji obrazów/pakietów.

Podejście nadaje się do migracji istniejących serwerów: przenoś usługi etapami. Dokumentacja w repo upraszcza audyt.

— Editorial Team

Advertisement 728x90

Czytaj dalej