Správa osobních serverů s Docker Compose jako IaC
Z vlastní zkušenosti vím, že správa 1–5 serverů pomocí docker compose up zjednodušuje infrastrukturní kód bez Ansible. Tento přístup vyžaduje znalost docker-compose.yml, zkušenosti s ruční konfigurací a vůli k automatizaci. Klíčové komponenty jsou skript pro nasazení přes rsync a ssh, a ukládání tajemství v gitu (např. fnox nebo git-secret). Docker Compose zajišťuje idempotentnost, minimalizuje manuální úsilí.
Repozitář s šablonou demonstruje nastavení DNS/email (primární/sekundární), VPN (WireGuard), firewallu nftables, monitorování Netdata s Telegram upozorněními. Struktura zahrnuje dokumentaci a diagramy infrastruktury.
Počáteční nastavení a bootstrap
Pro nový server vytvořte bootstrap.sh — minimální skript pro instalaci Dockeru. Spusťte jej ručně nebo přes cloud-init. Příklad minimalizuje změny: aktualizace OS (do-release-upgrade) nebo konzolové nástroje (nvim-config) vyžadují vzácné úpravy.
# bootstrap.sh zjednodušený fragment
curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
docker compose version
Skript se vyhýbá duplikaci ručních akcí, soustředí se na Docker.
Idempotentní firewall s nftables
Docker mění pravidla nftables v rodině ip/ip6. Ukládejte své v inet pro vyhnutí se konfliktům. bootstrap.sh vytvoří /etc/nftables.conf, kontejner aplikuje migrate.nft při up.
Rendering přes dockerize dosazuje proměnné (IP z host-facts.sh). Plná idempotentnost:
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;
# Filtrace před Docker NAT
}
}
Zpracování WireGuard a systémových e-mailů
WireGuard vytváří kernel-interface: odstraňujte při zastavení kontejneru.
finish() {
wg-quick down "$INTERFACE"
}
trap finish EXIT
wg-quick up "$INTERFACE"
sleep inf
Systémové e-maily (systemd, unattended-upgrades) jsou doručovány přes bind-mount /var/spool/postfix v kontejneru postfix. Společná fronta hostitele a kontejneru.
host-facts.sh pro specifika serverů
Skript generuje env-proměnné pro docker-compose.yml: IP, UID/GID, interface.
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
Podpora DEVEL pro CI/lokální sestavení bez reálného hostitele.
Skript pro nasazení a HEALTHCHECK
Jednotný skript: 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 čeká na healthy HEALTHCHECK. Přidávejte je ručně v obrazech bez vestavěných. Rollback: git checkout @~ + redeploy.
- Výhody ručního nasazení: Viditelnost logů, rychlé ladění pro 2–5 serverů.
- Rezervace: Primární/sekundární minimalizuje downtime.
Aktualizace a CI-testování
unattended-upgrades pro hostitele. Pro kontejnery — Renovate: aktualizuje FROM, obrazy compose, apk-pakety, externí binárky (postgrey) přes regex-managery. Repo na GitHubu.
CI: mise pro lintry (shellcheck, hadolint), lokální sestavení bez tajemství.
Co je důležité
- Docker Compose řeší idempotentnost, skripty — počáteční instalaci a host-specificitu.
- Idempotentní firewall v
inet, WireGuard s trap na EXIT. - host-facts.sh + dockerize pro dynamické proměnné.
- Povinné HEALTHCHECK a
--waitpro spolehlivé nasazení. - Renovate pro automatizaci aktualizací obrazů/paketů.
Tento přístup je vhodný pro migraci existujících serverů: přenášejte služby postupně. Dokumentace v repu zjednodušuje audit.
— Editorial Team
Zatím žádné komentáře.