meldestelle/docs/99_Journal/2026-03-06_Session_Log_Pipeline_Fix_v3.md
Stefan Mogeritsch c8d6ded38f
Some checks failed
Build and Publish Docker Images / build-and-push (., backend/infrastructure/gateway/Dockerfile, api-gateway, api-gateway) (push) Failing after 43s
Build and Publish Docker Images / build-and-push (., backend/services/ping/Dockerfile, ping-service, ping-service) (push) Failing after 41s
Build and Publish Docker Images / build-and-push (., config/docker/caddy/web-app/Dockerfile, web-app, web-app) (push) Failing after 1m59s
Build and Publish Docker Images / build-and-push (., config/docker/keycloak/Dockerfile, keycloak, keycloak) (push) Failing after 43s
docs: document pipeline fix v3 using iptables DNAT and update workflow
Added a detailed session log explaining the replacement of `socat` with `iptables` DNAT for internal Gitea registry access in the pipeline. Updated `.gitea/workflows/docker-publish.yaml` to reflect the new approach, eliminating the need for additional packages on minimal runners.
2026-03-06 14:50:09 +01:00

2.9 KiB

type status owner date
journal ACTIVE Lead Architect 2026-03-06

Session Log — Pipeline Fix v3: socat nicht verfügbar → iptables DNAT

Datum: 06.03.2026
Agent: 👷 Backend Developer
Thema: CI/CD Pipeline — socat nicht auf Runner verfügbar


Problem

Fix v2 verwendete socat als TCP-Proxy (Port 80 → Gitea:3000).
Der Gitea-Runner (VM 102, Debian minimal) hat kein socat installiert und das Paket ist im lokalen APT-Repo nicht auffindbar:

E: Unable to locate package socat

Lösung: iptables DNAT

iptables ist auf jedem Linux-System ohne Extra-Paket verfügbar.
DNAT (Destination NAT) leitet Verbindungen auf Kernel-Ebene um — kein Userspace-Proxy nötig.

- name: Registry intern auflösen (Pangolin-Bypass)
  run: |
    echo "10.0.0.22 git.mo-code.at" | sudo tee -a /etc/hosts
    sudo iptables -t nat -A OUTPUT -p tcp -d 10.0.0.22 --dport 80 -j DNAT --to-destination 10.0.0.22:3000
    sudo iptables -t nat -A POSTROUTING -p tcp -d 10.0.0.22 --dport 3000 -j MASQUERADE
    echo "✓ DNAT aktiv: git.mo-code.at:80 → 10.0.0.22:3000"    

Traffic-Weg:

BuildKit → http://git.mo-code.at:80
         → /etc/hosts: 10.0.0.22:80
         → iptables DNAT: 10.0.0.22:80 → 10.0.0.22:3000
         → Gitea (HTTP, kein TLS nötig)

Warum iptables besser als socat

Eigenschaft socat iptables DNAT
Verfügbarkeit Paket fehlt immer vorhanden
Paket-Installation nötig nicht nötig
Arbeitsebene Userspace Kernel (schneller)
Abhängigkeiten APT-Repo nötig keine

Netzwerk-Übersicht Zora

Host IP Protokoll
Runner (VM 102) 10.0.0.23
Gitea (CT 101) 10.0.0.22 HTTP :3000
Pangolin (CT 100) 10.0.0.21 HTTPS für git.mo-code.at

Fix-Verlauf dieser Pipeline-Debugging-Session

Version Symptom Fix Ergebnis
v1 502 Bad Gateway (Pangolin) /etc/hosts + provenance:false Port 443 refused
v2 connection refused Port 443 socat :80 → :3000 socat nicht da
v3 socat nicht verfügbar iptables DNAT erwartet grün

Gelernt

  • Minimale Runner-Images haben oft kein socat — APT-Repos auf Air-Gapped Systemen sind limitiert
  • iptables DNAT ist die robustere Lösung: kein Extra-Paket, Kernel-Level, überall verfügbar
  • OUTPUT-Chain für lokal initiierte Verbindungen, POSTROUTING + MASQUERADE für korrekte Source-Adresse