Vault-Sync: LFS-Upload scheitert hinter Reverse Proxy (doppelter Authorization-Header) #243

Closed
opened 2026-10-29 08:29:18 +00:00 by alf · 2 comments
Owner

Befund

Der Vault-Abgleich lädt Anhänge (Git-LFS) hinter dem Reverse Proxy (nginx/openresty) nicht hoch. Beim Verbinden mit einem neuen Repo bricht der Push mit

LFS: Client error: https://…/info/lfs/objects/<oid>/<größe>
error: failed to push some refs to '…'

ab. Betroffen sind Objekte jeder Größe (22 KB bis 60 MB); ship/Abgleich zeigen nur diesen Text, Forgejo selbst protokolliert keinen Fehler.

Ursache (gemessen)

Der Zugang wird per http.<server>.extraHeader = Authorization: Basic … an git gegeben. git-lfs hängt diesen Header an jede Anfrage an, beim Upload (PUT) zusätzlich den Authorization-Header aus der batch-Antwort von Forgejo. Der Upload trägt dann zwei Authorization:-Zeilen (Trace mit GIT_CURL_VERBOSE=1). Der Reverse Proxy weist das mit 400 ab, bevor Forgejo die Anfrage sieht (Proxy-Log: PUT … 400, kein Ziel; Forgejo-Log: kein PUT).

Nachgestellt mit dem echten git-lfs gegen dasselbe Repo:

  • mit extraHeader (wie die App): 24 von 24 Uploads → 400
  • ohne extraHeader (Zugang über Credential-Helper bzw. URL): 16 parallele Uploads, 413 MB, 39 MB/s, alle 200

Die 544 KB/s in der App sind sehr wahrscheinlich Wiederholungen der fehlgeschlagenen Uploads (nicht eigens gemessen).

Fix

Zugang nicht mehr als extraHeader, sondern als Credential-Helper für genau diesen Server (Token nur in der Umgebung des git-Prozesses, nie in .git/config, nie in der Prozessliste). Die batch-Antwort liefert dann den einzigen Authorization-Header des Uploads.

Prüfen

  • Test: Beim LFS-Upload kommt genau ein Authorization-Header an.
  • Test: Token steht nicht in .git/config.
  • Handtest gegen den Reverse Proxy (große Anhänge, parallel).

Der Linux-Server nutzt dasselbe Muster (_basic_auth_env) und bekommt ein eigenes Issue (iris/iris-linux-server).

## Befund Der Vault-Abgleich lädt Anhänge (Git-LFS) hinter dem Reverse Proxy (nginx/openresty) nicht hoch. Beim Verbinden mit einem neuen Repo bricht der Push mit ``` LFS: Client error: https://…/info/lfs/objects/<oid>/<größe> error: failed to push some refs to '…' ``` ab. Betroffen sind Objekte jeder Größe (22 KB bis 60 MB); `ship`/Abgleich zeigen nur diesen Text, Forgejo selbst protokolliert keinen Fehler. ## Ursache (gemessen) Der Zugang wird per `http.<server>.extraHeader = Authorization: Basic …` an git gegeben. git-lfs hängt diesen Header an **jede** Anfrage an, beim Upload (`PUT`) zusätzlich den `Authorization`-Header aus der `batch`-Antwort von Forgejo. Der Upload trägt dann zwei `Authorization:`-Zeilen (Trace mit `GIT_CURL_VERBOSE=1`). Der Reverse Proxy weist das mit **400** ab, bevor Forgejo die Anfrage sieht (Proxy-Log: `PUT … 400`, kein Ziel; Forgejo-Log: kein PUT). Nachgestellt mit dem echten git-lfs gegen dasselbe Repo: - mit `extraHeader` (wie die App): 24 von 24 Uploads → 400 - ohne `extraHeader` (Zugang über Credential-Helper bzw. URL): 16 parallele Uploads, 413 MB, 39 MB/s, alle 200 Die 544 KB/s in der App sind sehr wahrscheinlich Wiederholungen der fehlgeschlagenen Uploads (nicht eigens gemessen). ## Fix Zugang nicht mehr als `extraHeader`, sondern als Credential-Helper für genau diesen Server (Token nur in der Umgebung des git-Prozesses, nie in `.git/config`, nie in der Prozessliste). Die `batch`-Antwort liefert dann den einzigen `Authorization`-Header des Uploads. ## Prüfen - Test: Beim LFS-Upload kommt genau ein `Authorization`-Header an. - Test: Token steht nicht in `.git/config`. - Handtest gegen den Reverse Proxy (große Anhänge, parallel). Der Linux-Server nutzt dasselbe Muster (`_basic_auth_env`) und bekommt ein eigenes Issue (iris/iris-linux-server).
Author
Owner

PR #244 gemergt: fix(vault-sync): LFS-Upload ohne doppelten Authorization-Header (#243)
#244

Commits:

  • fix(vault-sync): LFS-Upload ohne doppelten Authorization-Header (#243)

Stand (2026-10-29)

Befund: Der LFS-Upload scheiterte hinter dem Reverse Proxy (nginx/openresty) mit LFS: Client error bei jedem Objekt. Ursache: http.<Server>.extraHeader und der Authorization-Header der batch-Antwort ergeben zwei Authorization:-Zeilen im PUT; der Proxy antwortet 400, Forgejo sieht nichts.

Geändert: VaultSyncCredentials.authEnvironment gibt den Zugang als Credential-Helper nur für diesen Server (credential.<scope>.helper, Token in IRIS_VAULT_TOKEN der Prozess-Umgebung). Das leere credential.helper (kein Keychain) kommt jetzt ebenfalls über die Umgebung statt über -c, sonst würde es den Helper löschen. Tests angepasst und ergänzt (kein extraHeader, Token nicht im Helper-Text). Dokumentation: Wire-Protokoll, Abschnitt Zugangsdaten.

Geprüft: test-vault-sync-core.sh (274 Prüfungen) und test-forgejo-core.sh (41) grün. Mit dem echten git-lfs und genau dieser Umgebung gegen den echten Proxy: mit extraHeader 24 von 24 Uploads → 400, mit Credential-Helper 24 von 24 → 200 (572 MB, 62 MB/s).

Nicht geprüft: Die gebaute App selbst (Xcode-Build) und ein kompletter Verbinden-Lauf mit dem 29-GB-Vault. Die Server mit Iris-CA (sslCAInfo) sind nur durch die Tests abgedeckt.

Offen: Gegenstück iris/iris-linux-server#128 (gleicher Fehler). Die 544 KB/s sind vermutlich Wiederholungen der fehlgeschlagenen Uploads, nicht eigens gemessen. Die SolidCraft-Sperrdatei (.~*.sc.lock) im Export geteilter Chats ist ein eigener, noch nicht behobener Fehler.

PR #244 gemergt: fix(vault-sync): LFS-Upload ohne doppelten Authorization-Header (#243) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/244 Commits: - fix(vault-sync): LFS-Upload ohne doppelten Authorization-Header (#243) --- **Stand (2026-10-29)** **Befund:** Der LFS-Upload scheiterte hinter dem Reverse Proxy (nginx/openresty) mit `LFS: Client error` bei jedem Objekt. Ursache: `http.<Server>.extraHeader` und der `Authorization`-Header der `batch`-Antwort ergeben zwei `Authorization:`-Zeilen im PUT; der Proxy antwortet 400, Forgejo sieht nichts. **Geändert:** `VaultSyncCredentials.authEnvironment` gibt den Zugang als Credential-Helper nur für diesen Server (`credential.<scope>.helper`, Token in `IRIS_VAULT_TOKEN` der Prozess-Umgebung). Das leere `credential.helper` (kein Keychain) kommt jetzt ebenfalls über die Umgebung statt über `-c`, sonst würde es den Helper löschen. Tests angepasst und ergänzt (kein `extraHeader`, Token nicht im Helper-Text). Dokumentation: Wire-Protokoll, Abschnitt Zugangsdaten. **Geprüft:** `test-vault-sync-core.sh` (274 Prüfungen) und `test-forgejo-core.sh` (41) grün. Mit dem echten git-lfs und genau dieser Umgebung gegen den echten Proxy: mit `extraHeader` 24 von 24 Uploads → 400, mit Credential-Helper 24 von 24 → 200 (572 MB, 62 MB/s). **Nicht geprüft:** Die gebaute App selbst (Xcode-Build) und ein kompletter Verbinden-Lauf mit dem 29-GB-Vault. Die Server mit Iris-CA (`sslCAInfo`) sind nur durch die Tests abgedeckt. **Offen:** Gegenstück iris/iris-linux-server#128 (gleicher Fehler). Die 544 KB/s sind vermutlich Wiederholungen der fehlgeschlagenen Uploads, nicht eigens gemessen. Die SolidCraft-Sperrdatei (`.~*.sc.lock`) im Export geteilter Chats ist ein eigener, noch nicht behobener Fehler.
Author
Owner

PR #133 gemergt: docs(wire): Zugang per Credential-Helper statt extraHeader (iris/Iris#243)
alf/2ndbrain#133

Commits:

  • docs(wire): Zugang per Credential-Helper statt extraHeader (iris/Iris#243)
PR #133 gemergt: docs(wire): Zugang per Credential-Helper statt extraHeader (iris/Iris#243) https://forgejo.lewerken.duckdns.org/alf/2ndbrain/pulls/133 Commits: - docs(wire): Zugang per Credential-Helper statt extraHeader (iris/Iris#243)
alf 2026-10-31 09:10:43 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
iris/Iris#243
No description provided.