Anleitung aus docs/ — 2026-08-12 00:04
+86
-1
@@ -137,6 +137,69 @@ direkt hierher.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Für eine Statusseite
|
||||||
|
|
||||||
|
Zwei Adressen, beide öffentlich, beide ohne Anmeldung — und sie beantworten
|
||||||
|
**verschiedene** Fragen.
|
||||||
|
|
||||||
|
```
|
||||||
|
GET /health -> 200 {"ok":true}
|
||||||
|
GET /status -> 200 | 503 mit Begründung
|
||||||
|
```
|
||||||
|
|
||||||
|
`/health` beweist genau eines: **der Prozess nimmt Anfragen an.** Daran hängt
|
||||||
|
auch der `HEALTHCHECK` des Containers, und dort ist eine billige Prüfung
|
||||||
|
richtig — eine schwere, die bei einer langsamen Platte einmal ausfällt, ließe
|
||||||
|
Docker den Container neu starten, also genau dann, wenn er unter Last steht.
|
||||||
|
|
||||||
|
`/status` sieht wirklich nach:
|
||||||
|
|
||||||
|
| Prüfung | wie |
|
||||||
|
|---|---|
|
||||||
|
| `datenbank` | eine echte Abfrage gegen eine echte Tabelle |
|
||||||
|
| `platte` | schreiben **und wieder löschen** — der einzige Beweis |
|
||||||
|
| `ausliefern` | eine zufällige Datei aus der Datenbank auf der Platte nachmessen |
|
||||||
|
| `bestand` | kein Eintrag, aber Dateien da? Dann stimmt etwas nicht |
|
||||||
|
| `platz` | ab 95 % belegt |
|
||||||
|
| `sicherung` | älter als 26 Stunden oder fehlgeschlagen |
|
||||||
|
|
||||||
|
```json
|
||||||
|
{ "dienst": "d4rk_media", "ok": true, "stand": "gesund", "seit": 4271,
|
||||||
|
"pruefungen": [ { "was": "datenbank", "ok": true }, … ] }
|
||||||
|
```
|
||||||
|
|
||||||
|
**Zwei Stufen, und der Unterschied ist der zwischen „tut es nicht" und „braucht
|
||||||
|
Aufmerksamkeit".** Datenbank, Platte, Ausliefern und Bestand sind das Geschäft
|
||||||
|
dieses Dienstes — fällt eines aus, ist er `gestoert` und die Antwort ist
|
||||||
|
**503**. Eine alte Sicherung oder eine volle Platte machen ihn
|
||||||
|
`beeintraechtigt`: er liefert weiter aus, die Antwort bleibt **200**.
|
||||||
|
|
||||||
|
Wer auch das rot haben will, hängt `?streng=1` an — dann gibt alles außer
|
||||||
|
`gesund` eine 503.
|
||||||
|
|
||||||
|
### In Uptime Kuma
|
||||||
|
|
||||||
|
```
|
||||||
|
Dienst läuft https://fivemanage.d4rkst3r.de/status
|
||||||
|
Braucht Pflege https://fivemanage.d4rkst3r.de/status?streng=1
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Warum `bestand` dabei ist.** Nachgemessen an genau diesem Dienst: wird eine
|
||||||
|
> Sicherung zurückgespielt, ohne `media.db-wal` daneben zu entfernen, spielt
|
||||||
|
> SQLite das WAL der **alten** Datenbank über die neue. Ergebnis: 0 Einträge,
|
||||||
|
> während 4452 Dateien danebenliegen. Der Dienst kommt hoch, `/health` ist
|
||||||
|
> grün, die Mediathek ist leer.
|
||||||
|
>
|
||||||
|
> ```
|
||||||
|
> /health sagt: HTTP 200
|
||||||
|
> /status sagt: HTTP 503 kein Eintrag in der Datenbank, aber Dateien auf der Platte
|
||||||
|
> ```
|
||||||
|
|
||||||
|
Was **nicht** hinausgeht: Dateizahlen, Größen, Pfade, Tokennamen, Benutzer. Die
|
||||||
|
einzige Zahl ist die Laufzeit in Sekunden.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Anmeldung: Token
|
## Anmeldung: Token
|
||||||
|
|
||||||
Alle Skript-Wege brauchen einen Token im Kopf:
|
Alle Skript-Wege brauchen einen Token im Kopf:
|
||||||
@@ -235,11 +298,33 @@ heraus wäre entweder Mixed Content oder ginge ins Leere.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## GET /api/exists/<pfad>
|
## GET /api/exists?pfad=<pfad>
|
||||||
|
|
||||||
Für „nur fehlende" in einem Serienlauf: eine winzige Antwort gegen 130 KB
|
Für „nur fehlende" in einem Serienlauf: eine winzige Antwort gegen 130 KB
|
||||||
Upload.
|
Upload.
|
||||||
|
|
||||||
|
> **Diese Form und nicht mehr `/api/exists/<pfad>`** — der Grund ist
|
||||||
|
> nachgemessen und unangenehm. Die alte Form endet auf `.webp`, und Nginx
|
||||||
|
> Proxy Managers `assets.conf` greift auf **jede** URL mit Bildendung:
|
||||||
|
>
|
||||||
|
> ```nginx
|
||||||
|
> location ~* ^.*\.(css|js|jpe?g|gif|png|webp|...)$ {
|
||||||
|
> proxy_cache public-cache;
|
||||||
|
> proxy_ignore_headers Set-Cookie Cache-Control Expires ...;
|
||||||
|
> proxy_cache_valid any 30m;
|
||||||
|
> }
|
||||||
|
> ```
|
||||||
|
>
|
||||||
|
> Der Proxy legt die berechtigte Antwort weg und liefert sie danach **an jeden
|
||||||
|
> aus, auch ohne Token** — gemessen: 200 mit voller Auskunft, `Authorization`
|
||||||
|
> gar nicht gesetzt. Unser eigenes `Cache-Control` hilft nicht,
|
||||||
|
> `proxy_ignore_headers` wirft es weg. Und es geht auch andersherum: landet
|
||||||
|
> zuerst ein `401` im Zwischenspeicher, bekommen ihn 30 Minuten lang alle.
|
||||||
|
>
|
||||||
|
> Die Abfrageform endet nie auf eine Bildendung und ist deshalb **von sich aus**
|
||||||
|
> dicht — ohne von einer Zeile in einer fremden Oberfläche abzuhängen. Die alte
|
||||||
|
> Form bleibt, weil Skripte sie benutzen; neu gebaut wird mit dieser.
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{ "exists": true, "path": "vehicles/adder.webp",
|
{ "exists": true, "path": "vehicles/adder.webp",
|
||||||
"url": "…", "size": 132760, "sha256": "…", "updated_at": 1786466462488 }
|
"url": "…", "size": 132760, "sha256": "…", "updated_at": 1786466462488 }
|
||||||
|
|||||||
Reference in New Issue
Block a user