docs(spec): clarify URL handling — public default in config, private URLs only in .env

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 <noreply@anthropic.com>
feat/v1-foundation
boban 2026-06-22 11:22:34 +02:00
parent e2b4a968c9
commit 70da2718fb
1 changed files with 8 additions and 8 deletions

View File

@ -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 <proj> remote get-url origin` und schreiben `CLUSEV_REPOSITORY=<das>` 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', '<public-repo-url>')`. 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 <proj> remote get-url origin` und schreiben `CLUSEV_REPOSITORY=<das>` 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', '<public-url-platzhalter>')` (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").