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.
# 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ść:
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.
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
--waitdla 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
Brak komentarzy.