From 70da2718fb529ecf93d6723672fab5d6bbd7b874 Mon Sep 17 00:00:00 2001 From: boban Date: Mon, 22 Jun 2026 11:22:34 +0200 Subject: [PATCH] =?UTF-8?q?docs(spec):=20clarify=20URL=20handling=20?= =?UTF-8?q?=E2=80=94=20public=20default=20in=20config,=20private=20URLs=20?= =?UTF-8?q?only=20in=20.env?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per the maintainer: dev/staging may hold any URL (in their gitignored .env); the public repo's tracked files carry only the public URL. So config/clusev.php defaults to the public URL, private (Gitea/GitHub-private) URLs live solely in gitignored .env, and install.sh derives CLUSEV_REPOSITORY from the clone origin. Co-Authored-By: Claude Opus 4.8 --- ...2026-06-22-3-repo-release-promotion-design.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/superpowers/specs/2026-06-22-3-repo-release-promotion-design.md b/docs/superpowers/specs/2026-06-22-3-repo-release-promotion-design.md index 75edcef..8c2ce3b 100644 --- a/docs/superpowers/specs/2026-06-22-3-repo-release-promotion-design.md +++ b/docs/superpowers/specs/2026-06-22-3-repo-release-promotion-design.md @@ -22,15 +22,15 @@ Clusev über drei Repositories befördern — **Gitea (dev) → GitHub privat (s ## Repository-URL-Handhabung (Sicherheits-Kern) -Das ist der zentrale Mechanismus, der „URLs später" + „keine private URL im Public" erfüllt: +Klarstellung des Anforderers: **dev und staging dürfen alle URLs enthalten** (in ihrer gitignorierten `.env`); **nur das Public-Repo** darf in versionierten Dateien ausschließlich die Public-URL tragen — damit niemand über das Public-Repo die Dev-/Staging-Repos findet oder dorthin zu pushen versucht. -1. **Kein hardcodierter Default mehr.** `config/clusev.php`: `'repository' => env('CLUSEV_REPOSITORY')` — **kein** privater Fallback (aktuell ist die Gitea-URL als Default eingetragen → das muss raus, sonst spiegelt es ins Public). -2. **Ableitung aus dem Klon-Ursprung.** `install.sh`/`update.sh` ermitteln die Quelle per `git -C remote get-url origin` und schreiben `CLUSEV_REPOSITORY=` in die `.env`. → Update-Quelle = von wo das Panel geklont wurde (Gitea bei dev, GitHub-privat auf Staging, GitHub-public bei Nutzern). -3. **`.env` ist gitignored.** Die Gitea- + GitHub-privat-URLs liegen nur in der jeweiligen Installation (`.env` / lokale `git`-Config), **nie** in einem versionierten Baum. Das Public-Repo enthält damit **null** private URLs. -4. **Graceful Degradation.** `ReleaseChecker` + Versions-Seite behandeln leeres `CLUSEV_REPOSITORY` sauber (kein Update-Check, kein Crash, kein Sidebar-Badge). -5. **Dev-Maschine:** `CLUSEV_REPOSITORY` in der Dev-`.env` setzen (oder von `install.sh` ableiten lassen). +1. **Getrackter Default = die PUBLIC-URL** (sicher, weil ohnehin öffentlich), kein privater Fallback. `config/clusev.php`: `'repository' => env('CLUSEV_REPOSITORY', '')`. Aktuell ist die **Gitea-URL hart** eingetragen (`'repository' => 'https://git.bave.dev/boban/clusev'`) → ersetzen durch die Public-URL (Platzhalter, bis das Repo existiert). Das ist die **einzige** Repo-URL in versionierten Dateien — und sie ist die öffentliche. +2. **Private URLs nur in der `.env`.** Gitea- + GitHub-privat-URL stehen ausschließlich in der gitignorierten `.env` von dev/staging (`CLUSEV_REPOSITORY=…`), **nie** in einem versionierten Baum. → Das Public-Repo enthält **null** private URLs. +3. **Automatische Ableitung aus dem Klon-Ursprung.** `install.sh`/`update.sh` ermitteln die Quelle per `git -C remote get-url origin` und schreiben `CLUSEV_REPOSITORY=` in die `.env`. → dev (von Gitea geklont) bekommt automatisch die Gitea-URL in seine `.env`, staging die GitHub-privat-URL, Public-Nutzer die Public-URL. Kein manuelles Eintragen, und die private URL landet nur in der gitignorierten `.env`. +4. **Graceful Degradation.** Ist `CLUSEV_REPOSITORY` leer **und** kein Default gesetzt (Phase bevor das Public-Repo existiert), behandeln `ReleaseChecker` + Versions-Seite das sauber (kein Update-Check, kein Crash, kein Sidebar-Badge). +5. **Dev-Maschine jetzt:** `CLUSEV_REPOSITORY=https://git.bave.dev/boban/clusev` in die Dev-`.env` (oder von `install.sh` ableiten lassen), damit der Update-Check schon heute auf Gitea zeigt. -**Ergebnis:** Keine Repo-URL in versionierten Dateien. Beim Anlegen der Repos trägst du die URLs nur in (a) Giteas Mirror-Einstellung, (b) GitHub-Actions-Secrets/Variablen, (c) die Public-README (Clone-Befehl) ein. +**Ergebnis:** Versionierte Dateien tragen höchstens die Public-URL. Beim Anlegen der Repos trägst du die URLs nur in (a) Giteas Mirror-Einstellung, (b) GitHub-Actions-Secrets/Variablen, (c) die Dev-/Staging-`.env`, (d) den Public-Default in `config/clusev.php` ein. ## CI-Pipeline (GitHub Actions, im GitHub-privat-Repo) @@ -59,7 +59,7 @@ Zwei Stufen, secret-frei startbar: ## Zu bauende Artefakte (im Implementierungsplan) -1. `config/clusev.php`: Repository-Default entfernen (kein Gitea-Hardcode). +1. `config/clusev.php`: Gitea-Hardcode raus → `env('CLUSEV_REPOSITORY', '')` (Default = Public-URL). 2. `install.sh`/`update.sh`: `CLUSEV_REPOSITORY` aus dem Klon-Ursprung ableiten + in `.env` schreiben. 3. `.github/workflows/ci-staging.yml` (Tests bei Tag; optional Staging-Deploy). 4. `.github/workflows/promote-public.yml` (Gated Clean-Push, Environment „production").