# Kickoff-Prompt — Lane C: App-Code Garage-tauglich Du übernimmst **Lane C** der Umstellung **MinIO → Garage**. Lies `docs/KONZEPT-garage-migration.md` (v. a. §3 und §4 D3). **Kern:** Der S3-Code bleibt inhaltlich gleich (AWS SDK v3, `forcePathStyle`), aber die Selbstheilung `ensureBucket()` (HeadBucket→**CreateBucket**) muss weg — Garage unterstützt S3-`CreateBucket` nicht; Buckets werden von Lane B vorab provisioniert. ## Repo & Branch - **origin:** `git.certvia.de/msolarczek/certvia` — Basis-Branch **`dev`**. - Zweiter Remote: `local-gitea` = `gitea.192.168.1.155.sslip.io/msolarczek/ISMS-Tool`. - Arbeite auf `feature/garage-code` (aus `dev`), PR nach `dev`. **Unabhängig von Lane A/B** entwickelbar (gegen einen lokalen Garage-Container testen). ## Scope (genau diese Dateien) - `src/server/storage/adapter.ts` — `ensureBucket()` anpassen. - `src/server/storage/backup-store.ts` — `ensureBucket()` anpassen. - `.env.coolify.example` + `.env.example` — Kommentare MinIO → Garage, `S3_ENDPOINT`-Beispiel `http://garage:3900`, `forcePathStyle`-Begründung bleibt gültig. - Tests unter `scripts/` (neuer Smoke-Test). - **Nicht anfassen:** Compose/Infra (Lane A), Provisioning (Lane B), Fachlogik/UI. ## Aufgaben 1. **`ensureBucket()` in beiden Stores** von „HeadBucket→CreateBucket" auf **nur prüfend** umstellen: - `HeadBucketCommand` → wenn ok, weiter. - Wenn Bucket fehlt/kein Zugriff → **klarer Konfigurationsfehler** werfen: „Bucket `` nicht provisioniert/kein Zugriff — Garage-Provisioning (Lane B) ausführen." **Kein** `CreateBucketCommand` mehr. - `CreateBucketCommand`-Import entfernen, wenn ungenutzt (tsc/lint sauber halten). - Beachte: `backup-store.ts` schluckt heute den Fehler still — das durch die neue, sprechende Variante ersetzen. 2. **Region/Endpoint-Doku** aktualisieren (Default `S3_REGION=us-east-1` bleibt, passend zu Garage-`s3_region`). 3. **Smoke-Test** (`scripts/test-garage-storage.ts` o. ä.): gegen einen lokalen Garage-Container Put→Get→(List/Delete beim Backup-Store) grün; plus Negativfall „Bucket fehlt → sprechender Fehler". ## Vorgaben - **API der Storage-Abstraktion unverändert** (`StorageAdapter`/`BackupStore`-Interfaces, Key-Schema, Local-/Stub-Fallback bleiben). - Keine neuen Pflicht-Env; `S3_*`-Kontrakt bleibt. - **Validierungs-Gate vor PR:** `npx tsc --noEmit`, Lint, `npm run build`, alle `scripts/test-*.ts` grün (inkl. neuem Test). Denk an die bekannte Falle: **nichts, was Secrets liest, auf Modulebene aufrufen** (Build-Kompatibilität). ## Definition of Done - Beide `ensureBucket()` prüfen nur noch, mit sprechendem Fehler bei fehlendem Bucket. - Doku aktualisiert; Smoke-Test grün gegen lokale Garage; Gate grün. ## Abhängigkeiten Zur **Laufzeit** auf **Lane B** angewiesen (Bucket muss existieren), aber **Code + Tests unabhängig** entwickelbar (lokaler Garage-Container).