diff --git a/.gitea/workflows/docker-publish.yaml b/.gitea/workflows/docker-publish.yaml index 1dc4aa59..a7d63dfc 100644 --- a/.gitea/workflows/docker-publish.yaml +++ b/.gitea/workflows/docker-publish.yaml @@ -92,30 +92,26 @@ jobs: --max-workers=8 \ -Dkotlin.daemon.jvm.options="-Xmx4g" + # Pangolin-Bypass via buildkitd Mirror (kein Root, kein iptables, kein socat nötig) + # Problem: git.mo-code.at läuft extern über Pangolin (HTTPS), große Layer-Uploads timeouton (502). + # Lösung: buildkitd Mirror leitet alle Registry-Anfragen intern direkt auf 10.0.0.22:3000 um. + # Login erfolgt ebenfalls intern (HTTP) → kein Pangolin-Timeout möglich. - 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 - # Pangolin-Bypass: Gitea intern via HTTP erreichbar machen - # Problem: git.mo-code.at ist extern HTTPS (Pangolin), Gitea intern läuft HTTP auf Port 3000. - # Lösung: /etc/hosts zeigt git.mo-code.at → 10.0.0.22 - # iptables DNAT leitet :80 → :3000 weiter (kein socat, kein Extra-Paket nötig) - # buildkitd nutzt http=true (Port 80) → iptables → Gitea:3000 - - 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" - - - name: Log in to the Container registry + - name: Bei Registry intern anmelden (Pangolin-Bypass) uses: docker/login-action@v3 with: - registry: ${{ env.REGISTRY }} + registry: 10.0.0.22:3000 username: ${{ secrets.REGISTRY_USER }} password: ${{ secrets.REGISTRY_TOKEN }} diff --git a/docs/99_Journal/2026-03-06_Session_Log_Pipeline_Fix_v3.md b/docs/99_Journal/2026-03-06_Session_Log_Pipeline_Fix_v3.md index b7bb933f..d7b86cae 100644 --- a/docs/99_Journal/2026-03-06_Session_Log_Pipeline_Fix_v3.md +++ b/docs/99_Journal/2026-03-06_Session_Log_Pipeline_Fix_v3.md @@ -71,16 +71,58 @@ BuildKit → http://git.mo-code.at:80 ## 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 | +| 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 | Permission denied | +| **v4** | iptables — kein sudo-Recht | **buildkitd Mirror (kein Root)** | ✅ erwartet grün | + +--- + +## Fix v4: buildkitd Mirror — die Root-freie Lösung + +`iptables` schlägt mit `Permission denied` fehl — der Runner-User hat kein sudo-Recht für iptables. + +**Lösung:** buildkitd hat eine eingebaute Mirror-Funktion. Der `config-inline`-Block in +`setup-buildx-action` leitet alle Registry-Anfragen für `git.mo-code.at` intern auf +`http://10.0.0.22:3000` um — vollständig auf Anwendungsebene, ohne Root-Rechte. + +```yaml +- 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 + +- name: Bei Registry intern anmelden (Pangolin-Bypass) + uses: docker/login-action@v3 + with: + registry: 10.0.0.22:3000 + username: ${{ secrets.REGISTRY_USER }} + password: ${{ secrets.REGISTRY_TOKEN }} +``` + +**Traffic-Weg v4:** +``` +BuildKit → push git.mo-code.at/... + → buildkitd Mirror: http://10.0.0.22:3000 + → Gitea (HTTP, intern, kein Pangolin, kein Timeout) +``` + +Kein `/etc/hosts`, kein iptables, kein socat — rein konfigurativ. --- ## 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 +- `iptables` DNAT schlägt fehl wenn sudo-Policy es nicht erlaubt (auch bei `tee` in `/etc/hosts` erlaubt) +- **buildkitd Mirror ist die sauberste Lösung**: kein Root, kein Extra-Paket, rein in der Workflow-Konfig +- Login auf `10.0.0.22:3000` (intern) funktioniert mit denselben Gitea-Credentials wie der externe Login