docs: das Wiki gibt es jetzt -- und es kommt aus docs/

Gitea legt das Wiki-Repo erst mit der ersten Seite an; Klon und Push antworten
davor mit 500, obwohl has_wiki auf true steht. Angelegt ueber die API
(POST /api/v1/repos/<besitzer>/<repo>/wiki/new) -- danach ist es ein
gewoehnliches Git-Repo und laesst sich klonen wie jedes andere.

  https://git.d4rkst3r.de/D4rkst3r/d4rk_media/wiki

DIE QUELLE BLEIBT docs/ IM REPO. 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.
tools/wiki.ps1 traegt sie danach hinaus -- EINSEITIG, und die Wiki-Seite sagt
das auch: wer dort tippt, verliert es beim naechsten Lauf. Unschoen, aber
ehrlicher als zwei Quellen, die auseinanderlaufen.

Zwei Seiten: Home (Zuschnitt, was der Dienst kann, was zu tun ist, wenn etwas
nicht geht) und API (Endpunkte, Kopfzeilen, Fehlerantworten, Grenzen -- und die
beiden Proxy-Fallen von heute).

Nachgemessen: beide Seiten sind ohne Anmeldung lesbar (200), ein zweiter Lauf
des Skripts erkennt "bereits aktuell", und eine Aenderung kommt an.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 20:09:35 +02:00
co-authored by Claude Opus 5
parent 28404b78c2
commit 66c5de1e31
3 changed files with 132 additions and 0 deletions
+4
View File
@@ -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.*
+67
View File
@@ -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.
+61
View File
@@ -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/<besitzer>/<repo>/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 }