Fail early when Gitea advertises an insecure registry token endpoint
All checks were successful
check / verify (push) Successful in 3m10s
check / publish (push) Has been skipped

This commit is contained in:
Weapie 2026-10-08 08:45:52 +02:00
parent 74c1e7130c
commit 7be231409f
3 changed files with 25 additions and 0 deletions

View File

@ -62,6 +62,8 @@ jobs:
RELEASE_REF: ${{ github.ref }}
run: |
node scripts/release-version.mjs >> "$GITHUB_OUTPUT"
- name: Verify HTTPS registry authentication endpoint
run: node scripts/check-registry.mjs
- uses: docker/login-action@v3
with:
registry: git.jfritzsche.de

View File

@ -39,6 +39,10 @@ ROOT_URL = https://git.jfritzsche.de/
Alternativ im Gitea-Container `GITEA__server__ROOT_URL=https://git.jfritzsche.de/` setzen und Gitea neu starten. Der interne Listener darf weiterhin HTTP auf Port 3000 verwenden. HTTPS am Proxy allein korrigiert nicht automatisch die Registry-Token-URL.
Bei einer geänderten Compose-Umgebungsvariable reicht `docker restart` nicht: den **Gitea-Dienst** aus dessen eigenem Compose-Projekt neu erstellen (`docker compose up -d --force-recreate DIENSTNAME`). Das ist nicht der Taskmanager-Dienst. In der Gitea-Administrationsansicht die tatsächlich geladene Serverkonfiguration prüfen; eine Umgebungsvariable kann eine manuell bearbeitete `app.ini` beim Start wieder überschreiben. Keine Secrets oder vollständigen Umgebungsvariablen in Fehlerlogs veröffentlichen.
Neue Release-Workflows prüfen den HTTPS-Realm bereits vor Login und Image-Build mit `node scripts/check-registry.mjs`. Ein erneuter Lauf des alten Tags `v1.0.0` verwendet weiterhin den Workflow dieses Tags; die Serverkorrektur ist auch dafür erforderlich.
```bash
curl -sS -D - -o /dev/null https://git.jfritzsche.de/v2/
```

View File

@ -0,0 +1,19 @@
import { execFileSync } from "node:child_process";
// Inspect the unauthenticated challenge before sending credentials or building images.
const headers = execFileSync("curl", [
"--silent", "--show-error", "--max-time", "20",
"--header", "Cache-Control: no-cache", "--dump-header", "-",
"--output", process.platform === "win32" ? "NUL" : "/dev/null",
"https://git.jfritzsche.de/v2/",
], { encoding: "utf8" });
const realm = headers.match(/^www-authenticate:\s*Bearer[^\r\n]*realm="([^"]+)"/im)?.[1];
if (realm !== "https://git.jfritzsche.de/v2/token") {
throw new Error(
`Registry advertises an unexpected authentication realm: ${realm ?? "missing"}. ` +
"Set Gitea [server] ROOT_URL=https://git.jfritzsche.de/ " +
"(Docker: GITEA__server__ROOT_URL), recreate the Gitea container when changing its environment, " +
"and verify the live /v2/ challenge. No credentials were sent by this check.",
);
}
console.log("Registry HTTPS authentication endpoint verified.");