# Docker-Guardian — Test

Marker **DGUARD-V2** (24.08.2026) · Fassung **2.0** · PowerShell 5.1

## Dateien

| Datei | Zweck |
|---|---|
| `Docker-Guardian.ps1` | das Werkzeug (1335 Zeilen, UTF-8 **mit BOM**) |
| `docker_guardian_config.json` | Vorgaben, liegt daneben |
| `Stream-Tools-Updater.ps1` | Button 🐳 zeigt jetzt hierher, Fassung **17.8** |
| `Update-Worker.ps1` | Fassung **17.8**, zieht mit |

Backups in `Backup/` (`*.bak_dguard2_*`).

## Was an Fassung 1.0 nicht passte

| Befund | |
|---|---|
| **Falscher Ansatz für dein Ziel** | Sie kopierte `ext4.vhdx` — die ganze WSL-Platte. Viele Gigabyte, alle Container, und beim Zurückspielen wird die komplette Docker-Welt des Zielrechners überschrieben. Zum Übertragen des Restreamers auf den CAPT-Server unbrauchbar. |
| **Veralteter Pfad** | `…\Docker\wsl\data\ext4.vhdx` — neuere Docker-Fassungen legen die Platte unter `…\Docker\wsl\disk\docker_data.vhdx` ab. Bei denen lief die Sicherung ins Leere. |
| **`#Requires -RunAsAdministrator`** | bricht hart ab, bevor eine Zeile läuft — die Begründung steht in einer Konsole, die im selben Moment zu ist. |
| **`FixedDialog`** | nicht ziehbar, keine Rollbalken, kein `Set-FensterPassend`. |
| **Fremdes Theme** | `#2D2D30` mit blauem `#007ACC` statt unserem Dunkel + Gold. |
| **Nie verdrahtet** | Der Button im Updater rief eine **eingebaute** `Show-DockerGuardian` mit demselben veralteten Pfad — die separate `.ps1` startete niemand. |
| Kein Protokoll, kein Trockenlauf, keine Prüfung ob Docker überhaupt läuft | |

Die Syntax war in Ordnung.

## Der neue Weg: Paket statt Festplattenabbild

Für „Restreamer vom RTMP-Server auf den CAPT-Server" gehören **drei** Dinge zusammen:

| Teil | wie | warum |
|---|---|---|
| Image | `docker save` | die Software |
| **Volumes** | Wegwerf-Container packt sie in `tar.gz` | **hier liegen Konfiguration und Keys** |
| Startwerte | aus `docker inspect` | Ports, Umgebungsvariablen, Neustart-Verhalten |

**Nur das Image reicht nicht** — ein Restreamer ohne seine Volumes kommt ohne Keys
und ohne Einstellungen hoch. Genau der Punkt, um den es dir geht.

Ein Paket ist ein Ordner:

```
restreamer_RTMP-SERVER-1_20260824_180500\
    image.tar              docker save
    vol_core_config.tar.gz je Volume eine Datei
    vol_core_data.tar.gz
    paket.json             Beschreibung: Quelle, Datum, Volumes, Startbefehl
    container.json         das komplette docker inspect, falls doch was fehlt
    neu-anlegen.txt        der docker-run-Befehl im Klartext
```

**Das Paket enthält Zugangsdaten** — Stream-Keys aus den Umgebungsvariablen und
aus der Konfiguration in den Volumes. Es gehört in einen Ordner, auf den nicht
jeder Zugriff hat. Das steht auch in der Rückfrage vor dem Sichern.

## Die fünf Reiter

1. **Container** — was auf diesem Rechner in Docker liegt (Name, Image, Zustand, Ports).
   Starten · Anhalten · Neu starten · Letzte Meldungen. Der Container mit
   „restreamer" im Namen wird vorgewählt.
2. **Sichern** — zeigt **vor** dem Klick, was mitkommt: Image, Volumes mit ihren
   Zielen, und ob **Bind-Mounts** dabei sind (die zeigen auf Ordner *dieses*
   Rechners und wandern **nicht** mit — sie werden gelb gemeldet und im Protokoll
   einzeln aufgeführt).
3. **Zurückspielen** — Liste der Pakete im Paket-Ordner mit Datum und Herkunft.
   Ein gewähltes Paket wird auf Vollständigkeit geprüft (fehlt `image.tar` oder
   eine Volume-Datei, steht es rot da). Der Container kann unter einem anderen
   Namen angelegt werden.
4. **Ganze Platte** — der alte Weg als Notfall-Abbild, mit korrigierter Pfadsuche
   (drei mögliche Orte). Beim Zurückspielen wird die bisherige Platte **beiseite
   gelegt statt gelöscht** (`.vorher_<Zeitstempel>`).
5. **Einstellungen** — Paket-Ordner, Hilfs-Image, Vorauswahl, Trockenlauf,
   Container-Anhalten.

## Was bewusst so ist

- **Container wird vor dem Sichern angehalten** und danach wieder gestartet —
  sonst stehen die Volumes mitten im Schreiben und die Sicherung ist unstimmig.
  Abschaltbar, dann warnt das Protokoll.
- **Jeder Docker-Befehl steht im Protokoll**, bevor er läuft (`> docker save …`).
- **Trockenlauf** zeigt alles an, verändert nichts — eine einzige Stelle im Code
  entscheidet das, damit keine Lücke bleibt.
- **Ein gleichnamiger Container wird umbenannt, nicht gelöscht**
  (`<name>_alt_<Zeitstempel>`). Klappt das Umbenennen nicht, bricht der Vorgang
  ab, statt etwas zu überschreiben.
- **Anonyme Volumes und Bind-Mounts kommen nicht ins Paket** — anonyme sind
  Wegwerf-Daten, Bind-Mounts zeigen auf Ordner, die es drüben nicht gibt.
- **Der `docker run`-Befehl wird selbst zerlegt**, nicht von `cmd` — sonst
  zerbrechen Umgebungsvariablen mit Leerzeichen, und darin stecken die Keys.
  An vier Fällen durchgerechnet, auch mit Kennwörtern mit Leerzeichen und
  eingebetteten Anführungszeichen.

## Test

1. **Docker Desktop starten**, dann den Guardian über den Updater
   (🐳 Docker-Guardian) oder direkt.
   Erwartung: oben rechts „Docker laeuft — Server x.y", Reiter *Container* gefüllt,
   der Restreamer vorgewählt.

2. **Erst mit Trockenlauf** (Reiter Einstellungen): Reiter *Sichern* → *Paket
   erstellen*. Im Protokoll stehen alle Befehle, es passiert nichts. So siehst du
   vorher, was laufen würde.

3. Trockenlauf aus, **Paket erstellen**. Erwartung: Container hält an, Image und
   Volumes werden gesichert (mit MB-Angabe), Container startet wieder.

4. **Auf dem CAPT-Server**: denselben Paket-Ordner erreichbar machen (Freigabe
   oder kopieren), Reiter *Zurückspielen*, Paket wählen — die Zeile muss
   „vollstaendig" sagen — dann *Zurückspielen*.

5. Danach Reiter *Container*: der Restreamer muss laufen. Im Browser prüfen, ob
   die Keys da sind.

## Ungeprüft

Docker kann ich hier nicht ausführen — geprüft sind Syntax, BOM, Variablen,
Aufrufreihenfolge, Fenstermaße (996×699, passt auf 1024×768; jeder Reiter endet
oberhalb von 400 px) und die Befehls-Zerlegung. Ob `docker save`/`load` und der
Volume-Weg über das Hilfs-Image auf deinen Rechnern durchlaufen, zeigt der erste
Lauf — deshalb der Trockenlauf und das Protokoll.

**Das Hilfs-Image** (`alpine`) muss beim ersten Mal geladen werden können. Ohne
Internet vorher einmal `docker pull alpine` auf einem Rechner mit Verbindung und
das Image mitnehmen.
