Added a session log confirming the resolution of pipeline issues in iteration v6, including successful sequential builds and the use of direct `config.json` for Docker credentials. Detailed the root causes (registry proxy timeouts and RAM-OOM) and the implemented fixes, ensuring stability and reliable internal registry access.
4.2 KiB
| type | status | owner | date |
|---|---|---|---|
| journal | ACTIVE | Lead Architect | 2026-03-06 |
Session Log — Pipeline vollständig grün ✅
Datum: 06.03.2026
Agent: 🏗️ Lead Architect
Thema: CI/CD Pipeline — alle 4 Jobs erfolgreich bestätigt
Ergebnis
Alle vier Build-and-Push-Jobs sind grün:
| Job | Status |
|---|---|
api-gateway (backend/infrastructure/gateway/Dockerfile) |
✅ grün |
ping-service (backend/services/ping/Dockerfile) |
✅ grün |
web-app (config/docker/caddy/web-app/Dockerfile) |
✅ grün |
keycloak (config/docker/keycloak/Dockerfile) |
✅ grün |
Root Causes (Gesamtüberblick)
Die Pipeline hatte zwei voneinander unabhängige Probleme, die zusammen alle Pushes verhinderten:
Problem 1: Pangolin-Tunnel als Registry-Proxy (Hauptursache)
Der Gitea-Runner (VM 102, 10.0.0.23) kannte git.mo-code.at nur über den
Pangolin-Tunnel (öffentliche DNS-Auflösung → Pangolin → HTTPS → Gitea).
Bei großen Image-Layern (70+ Sekunden Upload) timeoutet Pangolin → 502 Bad Gateway.
Lösung (v6): Credentials direkt in ~/.docker/config.json schreiben (kein Daemon-Ping),
buildkitd via config-inline auf http://10.0.0.22:3000 zeigen (intern, kein Pangolin).
Problem 2: RAM-OOM auf 16 GB Runner
4 Matrix-Jobs liefen parallel. Jeder Job: Gradle-Build + Docker-Buildx = 3–4 GB RAM. Zusammen: 15+ GB → RAM-Erschöpfung → Builds crashed/hingen.
Lösung (v6): max-parallel: 1 — Jobs laufen sequenziell, Runner bleibt stabil.
Finale Lösung (v6) — die funktionierenden Kern-Änderungen
strategy:
max-parallel: 1 # ← RAM-Schutz: kein OOM mehr
steps:
- name: Registry-Credentials konfigurieren (kein Daemon-Kontakt)
run: |
mkdir -p ~/.docker
printf '{"auths":{"10.0.0.22:3000":{"auth":"%s"}}}' \
"$(printf '%s:%s' '${{ secrets.REGISTRY_USER }}' '${{ secrets.REGISTRY_TOKEN }}' | base64 -w0)" \
> ~/.docker/config.json
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
config-inline: |
[registry."git.mo-code.at"]
mirrors = ["http://10.0.0.22:3000"]
http = true
insecure = true
[registry."10.0.0.22:3000"]
http = true
insecure = true
Traffic-Weg (intern, kein Pangolin):
BuildKit → push git.mo-code.at/mocode-software/meldestelle/<image>:latest
→ buildkitd config-inline Mirror: http://10.0.0.22:3000
→ Gitea Registry (HTTP, direkt intern)
→ ✅ kein Pangolin, kein Timeout, kein TLS-Konflikt
Warum 6 Iterationen nötig waren
| Version | Blockiert durch |
|---|---|
| v1 | Pangolin 502 beim Push großer Layer |
| v2 | socat nicht im APT-Repo des Runners |
| v3 | iptables benötigt Root — Runner-User hat kein sudo für iptables |
| v4 | buildkitd-Mirror funktioniert für Pulls, nicht für Pushes von login-action |
| v5 | systemctl restart docker benötigt Root + RAM-OOM durch parallele Jobs |
| v6 | Beide Root Causes gleichzeitig behoben → ✅ grün |
Gelernt
- Pangolin ist kein Registry-Proxy — ausschließlich Pull-Traffic (klein) läuft über Pangolin. Push-Traffic (groß, langsam) muss intern bleiben.
- buildkitd ≠ Docker-Daemon — beide Prozesse müssen separat konfiguriert werden.
login-action→ Daemon;build-push-action→ buildkitd. ~/.docker/config.jsondirekt schreiben umgeht den Daemon vollständig — kein Ping, kein HTTPS-Test.max-parallel: 1ist auf einem 16 GB Runner mit Gradle + Buildx Pflicht.- Permanente Lösung für die Zukunft:
insecure-registrieseinmalig in/etc/docker/daemon.jsonauf VM 102 setzen →login-actionkann wieder normal verwendet werden.
Nächste Schritte
- Permanent (einmalig auf VM 102):
/etc/docker/daemon.json→insecure-registries: ["10.0.0.22:3000"]→ dann kann derconfig.json-Workaround durchdocker/login-actionersetzt werden. - Meldestelle-Host:
.envmit Server-IP befüllen, Container neu starten, Ping-Service testen. - Grafana + Pangolin-URLs konfigurieren (nächste Session).
- Ollama + Open WebUI auf Proxmox LXC einrichten (übernächste Session).