diff --git a/docs/API.md b/docs/API.md index 6d26d83..2519bbd 100644 --- a/docs/API.md +++ b/docs/API.md @@ -216,3 +216,7 @@ Im Dashboard unter **API** — oder direkt, mit gültiger Sitzung: ``` Die Lua-Fassung liest man in einer Resource als `Urls.adder` aus. + +--- + +*Diese Seite wird aus `docs/` im Repo erzeugt — Änderungen hier gehen beim nächsten Lauf verloren.* diff --git a/docs/Home.md b/docs/Home.md new file mode 100644 index 0000000..768a09d --- /dev/null +++ b/docs/Home.md @@ -0,0 +1,67 @@ +# d4rk_media + +Eigener Medien-Dienst für alle FiveM-Ressourcen: Dateien annehmen, ablegen, +ausliefern, in einem Dashboard verwalten. + +**Läuft unter** https://fivemanage.d4rkst3r.de — Dashboard und API an der +Wurzel, Dateien unter `/f/`. + +--- + +## Wo was steht + +| | | +|---|---| +| **[API](API)** | Endpunkte, Kopfzeilen, Fehlermeldungen, Grenzen — und was beim Anbinden schiefgeht | +| `ROADMAP.md` im Repo | Zuschnitt, Stand, Reihenfolge, offene Entscheidungen | +| `CLAUDE.md` im Repo | die Arbeitsweise: prüfen statt raten | + +Das Warum einer Änderung steht in der Commit-Nachricht, nicht nur im Diff. + +--- + +## Der Zuschnitt in vier Sätzen + +**Ein Container.** SQLite statt PostgreSQL, Dateien auf einer Platte statt +MinIO. Das ist nicht die kleine Lösung, sondern die, die man nicht pflegt. + +**Der Pfad ist der Schlüssel.** `vehicles/adder.webp` bleibt +`vehicles/adder.webp`, damit die Vorlage im Handy `{model}.webp` lauten kann. +Die Adressen stehen nirgends in der Datenbank — sie werden bei jeder Antwort +neu gebaut. + +**Jeder Knopf gibt Rückmeldung, auch der erfolgreiche.** Das ist der Fehler, an +dem der Fivemanage-Anlauf gescheitert ist: ein Knopf ohne Antwort sieht aus wie +ein kaputter Knopf, und das Ergebnis waren neunzehn gleichnamige +Organisationen. + +**Nicht nachgebaut wird das Logging.** Dafür schleppt Fivemanage ClickHouse +mit, und genau da ist der Wartungsaufwand echt. + +--- + +## Was der Dienst kann + +- **Hochladen** über die Skript-API (Token) oder aus dem Dashboard (Sitzung) — + Bilder, Videos, Ton, PDF +- **Ausliefern** mit ETag, Bereichsanfragen und Vorschaubildern +- **Galerie** mit Ordnerbaum, Suche, Filter nach Medienart, Sortierung, + Mehrfachauswahl, Verschieben und Löschen +- **Verlauf**: wer hat wann was abgelegt, ersetzt, verschoben oder gelöscht +- **Anmeldung** über Discord (Rolle auf dem Server) oder Passwort +- **Sicherung** täglich, geprüft, in die Nextcloud + +--- + +## Wenn etwas nicht geht + +1. **Ein Bild ändert sich nicht.** Der Proxy hielt Bilder früher 30 Minuten + fest. Behoben — siehe [API](API), Abschnitt *Zwischenspeicher des Proxys*. +2. **Die Anmeldung sagt 200, aber man ist nicht angemeldet.** `NODE_ENV=production` + setzt das Cookie auf `Secure`; über eine nackte `http`-Adresse verwirft der + Browser es still. Über den Proxy mit TLS gibt es das Problem nicht. +3. **Ein Upload gibt 400 mit „ist als Pfadteil nicht erlaubt".** Jeder Teil + eines Pfades muss mit einem Buchstaben oder einer Ziffer beginnen. Ein + führender Unterstrich fällt durch. +4. **Ein Fehler ohne Text.** Sollte es nicht mehr geben: der Dienst hat eine + Auffanglinie, die auch bei unerwarteten Fehlern einen Satz mitgibt. diff --git a/tools/wiki.ps1 b/tools/wiki.ps1 new file mode 100644 index 0000000..58ff398 --- /dev/null +++ b/tools/wiki.ps1 @@ -0,0 +1,61 @@ +# docs/ ins Gitea-Wiki schieben. +# +# Aufruf: pwsh -File tools\wiki.ps1 +# +# WARUM DIE DATEIEN IM REPO LIEGEN UND NICHT NUR IM WIKI. Ein Wiki hat keinen +# Zusammenhang mit dem Code: niemand sieht, ob die Anleitung noch zu dem passt, +# was der Dienst tut. Unter docs/ wandert sie im selben Commit mit der +# Aenderung, die sie beschreibt — und dieses Skript traegt sie danach hinaus. +# +# Die Richtung ist bewusst EINSEITIG: docs/ ist die Quelle, das Wiki die Kopie. +# Wer im Wiki tippt, verliert es beim naechsten Lauf. Das ist unschoen, aber +# ehrlicher als zwei Quellen, die auseinanderlaufen. +# +# DAS WIKI MUSS EINMAL EXISTIEREN. Gitea legt das Wiki-Repo erst mit der ersten +# Seite an; ein Klon davor antwortet mit 500. Angelegt wurde es ueber die API +# (POST /api/v1/repos///wiki/new) — danach ist es ein +# gewoehnliches Git-Repo. + +[CmdletBinding()] +param( + [string]$Wiki = 'https://git.d4rkst3r.de/D4rkst3r/d4rk_media.wiki.git', + [string]$Quelle = 'docs' +) + +$ErrorActionPreference = 'Stop' +function Gut($t) { Write-Host " $t" -ForegroundColor Green } + +$dateien = Get-ChildItem $Quelle -Filter '*.md' +if (-not $dateien) { Write-Host " Nichts in $Quelle" -ForegroundColor Yellow; exit 0 } + +$tmp = Join-Path $env:TEMP ("wiki-" + [guid]::NewGuid().ToString('N').Substring(0, 8)) +git clone --quiet $Wiki $tmp +if ($LASTEXITCODE -ne 0) { + Write-Host ' Klon fehlgeschlagen. Gibt es das Wiki schon? (Erste Seite ueber die Oberflaeche anlegen.)' -ForegroundColor Red + exit 1 +} + +foreach ($d in $dateien) { + Copy-Item $d.FullName (Join-Path $tmp $d.Name) -Force + Gut $d.Name +} + +Push-Location $tmp +git add -A +# Nichts geaendert ist kein Fehler: dann steht das Wiki schon richtig da. +$status = git status --porcelain +if (-not $status) { + Pop-Location + Remove-Item $tmp -Recurse -Force + Gut 'Das Wiki ist bereits aktuell.' + exit 0 +} + +git commit --quiet -m ("Anleitung aus docs/ — " + (Get-Date -Format 'yyyy-MM-dd HH:mm')) +git push --quiet +$ok = $LASTEXITCODE -eq 0 +Pop-Location +Remove-Item $tmp -Recurse -Force + +if ($ok) { Gut 'Ins Wiki geschoben.' } +else { Write-Host ' Push fehlgeschlagen.' -ForegroundColor Red; exit 1 }