Bulk-Renovate-Merge loest parallele Komodo-Deploys aus; Image-Pulls scheitern mit DNS connection refused, weil AdGuard (einziger Host-Resolver) im selben Batch recreated wird. Runbook haelt Symptom, Ursache, Sofortmassnahme (Unraid DNS2) und Betriebsregel fest. Verweis in REPO_MAP ergaenzt. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.8 KiB
Runbook: Komodo Bulk-Deploy schlaegt mit DNS connection refused fehl
Stand: 2026-06-10 · Typ: Runbook / ADR-light · Status: Sofortmassnahme empfohlen, noch nicht umgesetzt
Symptom
Ein Bulk-Merge (z. B. Renovate-Sammel-PR) loest gleichzeitig viele Komodo-Stack-Webhooks aus. Komodo startet parallele DeployStack. Nur ein Teil der Stacks deployt, der Rest bleibt auf dem alten Image. In der Deploy-Stufe Compose Pull stehen Fehler wie:
Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io
on 192.168.178.58:53: read udp ...->192.168.178.58:53: read: connection refused
Manuelles Re-Deploy der betroffenen Stacks danach funktioniert (AdGuard ist dann wieder oben).
Ursache
Der Host nutzt AdGuard Home als einzigen Resolver (/etc/resolv.conf = nur nameserver 192.168.178.58, keine /etc/docker/daemon.json). AdGuard laeuft selbst als Container auf dem Host und bindet 0.0.0.0:53. Wird der adguard-Stack im selben Batch neu deployt, faellt Port 53 fuer Sekunden aus. Alle parallelen docker compose pull der anderen Stacks koennen registry-1.docker.io dann nicht aufloesen -> connection refused -> Deploy success=false.
Es ist kein Webhook-, Auth- oder Docker-Hub-Rate-Limit-Problem: Webhooks authentifizieren sauber, webhook_enabled=true, Fehlerbild ist connection refused auf den eigenen DNS-Port direkt nach AdGuard-Recreate. Fuer den Pull-Pfad zaehlt der Docker-Daemon/Go-Resolver (iteriert ueber die resolv.conf-Server und springt bei Socket-Fehlern zum naechsten), nicht der glibc-Client.
Sofortmassnahme (Schicht 1)
Unraid -> Settings -> Network Settings -> eth0:
- DNS server 1:
192.168.178.58(AdGuard, bleibt) - DNS server 2:
192.168.178.1(FritzBox) -> Apply
Damit ueberleben Registry-Pulls einen kurzen AdGuard-Ausfall via Resolver-Failover. Im Normalbetrieb wird weiter DNS1 (AdGuard) genutzt, der Filter bleibt aktiv.
Pruefen / Bedingungen:
- Kein
options rotatein/etc/resolv.conf(sonst dauerhafter Filter-Bypass). Aktuell nicht gesetzt; nach Apply erneut pruefen. - Router muss oeffentliche Namen selbst aufloesen und nicht intern an AdGuard zurueckleiten.
- Hinweis zur Verifikation: Ein
nslookup registry-1.docker.io 192.168.178.1bei laufendem AdGuard ist ein gutes Signal, aber kein letzter Beweis. Wasserdicht: AdGuard kurz stoppen unddig @192.168.178.1 registry-1.docker.io, oder FritzBox-Upstream / AdGuard-Querylog pruefen.
Rollback: DNS server 2 leeren + Apply.
Betriebsregel (Schicht 2)
- AdGuard und Unbound nicht gemeinsam mit abhaengigen Stacks im Bulk deployen. DNS-Infrastruktur immer separat / einzeln deployen, nicht waehrend 20+ parallele Pulls laufen.
- Renovate-PRs gestaffelt mergen (eine Etappe pro Deploy) statt Sammel-Merge. Deckt dieses Problem fuer den Normalbetrieb bereits ab.
Spaeter optional
- Komodo-Deploys serialisieren: statt vieler paralleler Stack-Webhooks eine Procedure (sequenzielle Stages) oder Resource Sync mit
after-Ordering. Trifft die Ursache direkter, ist aber ein groesserer Umbau und kein Renovate-Blocker. - Host-DNS vom AdGuard-Container entkoppeln (AdGuard eigene IP via macvlan, Host-Resolver auf Router/Unbound), damit
:53am Host nicht exklusiv am Container-Lifecycle haengt.
Verworfen
/etc/docker/daemon.jsonmit"dns": [...]: wirkt nur fuer Container-DNS, nicht fuer Daemon-eigene Image-Pulls.- AdGuard
network_mode: host: beim Recreate ist der DNS-Prozess trotzdem weg; macht aus dem Single Point of Failure keinen HA-Resolver.
Referenzen
- Diagnose-Zugriff: SSH
root@192.168.178.58; Komodo-Mongo (docker exec komodo-mongo, DBkomodo, CollectionsStack/Update); Gitea SQLite/data/gitea/gitea.db(Tabellewebhook,repo_id=3). - Verwandt:
docs/WORKFLOW.md(DNS-Regeln fuer Container),docs/GITOPS_DRIFT_RUNBOOK.md.