You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
5.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# TD-Pult im Container bereitstellen
Nginx liefert die einzelne HTML-Datei aus und schützt sie mit Basic Auth.
TLS und Domain macht dein Nginx Proxy Manager.
Alle Befehle im Ordner `deploy/` ausführen. Der Ordner `deploy/site/` enthält
die auszuliefernde Seite — dort muss `index.html` liegen, das ist die
umbenannte `TD-Pult.html`.
---
## 1 · Passwortdatei anlegen
Die Datei `htpasswd` enthält Benutzername und Passwort-Hash. Sie liegt bewusst
**nicht** im Repo und wird einmalig erzeugt:
```bash
docker run --rm httpd:alpine htpasswd -Bbn td 'DEIN-PASSWORT' > htpasswd
chmod 600 htpasswd
```
`td` ist der Benutzername, `-B` erzwingt bcrypt. Passwort in einfachen
Anführungszeichen, damit Sonderzeichen von der Shell nicht angefasst werden.
Wenn es nicht im Shell-Verlauf landen soll:
```bash
docker run --rm -it httpd:alpine htpasswd -Bn td > htpasswd # fragt interaktiv
```
Weiteren Benutzer ergänzen:
```bash
docker run --rm httpd:alpine htpasswd -Bbn regie 'ANDERES-PASSWORT' >> htpasswd
```
Passwort später ändern: Datei neu erzeugen, dann `docker compose restart`.
---
## 2 · Seite bereitstellen
```bash
mkdir -p site
cp ../TD-Pult.html site/index.html # oder die hochgeladene Datei dorthin kopieren
```
Anschließend die Rechte setzen — nginx läuft im Container als eigener Benutzer
und kann Dateien mit Modus 600 nicht lesen. Das äußert sich als **403 Forbidden**
nach erfolgreichem Login:
```bash
chmod 755 site
chmod 644 site/index.html
```
Gemountet wird der **Ordner** `site/`, nicht die einzelne Datei. Einzeldatei-Mounts
brechen, sobald ein Editor oder eine Synchronisierung die Datei ersetzt statt sie
zu beschreiben — und wenn die Datei beim Start fehlt, legt Docker an ihrer Stelle
stillschweigend ein Verzeichnis an. Genau das erzeugt die Meldung
*„not a directory: Are you trying to mount a directory onto a file“*.
Wenn das schon passiert ist, den leeren Ordner entfernen und neu starten:
```bash
docker rm -f td-pult
rmdir ../TD-Pult.html # der versehentlich angelegte Ordner
mkdir -p site && cp /pfad/zu/TD-Pult.html site/index.html
docker compose up -d
```
Alternativ macht `sh install.sh` diese Schritte inklusive Aufräumen und Prüfung.
Ausgeliefert wird die leere Vorlage. Euer Programm kommt anschließend im Browser
über *Dateien → Programm laden* hinein (JSON-Datei aus *Programm sichern*).
---
## 3 · Container starten
```bash
docker compose up -d
docker compose logs -f # bei Bedarf
curl -I http://localhost:8087/ # muss 401 liefern – dann greift der Schutz
```
Der Container hört auf Port **8087**.
---
## 4 · Nginx Proxy Manager einrichten
Neuer *Proxy Host*:
| Feld | Wert |
|---|---|
| Domain Names | z. B. `td.example.com` |
| Scheme | `http` |
| Forward Hostname / IP | IP des Docker-Hosts (bei Portfreigabe) oder `td-pult` (bei gemeinsamem Netz) |
| Forward Port | `8087` bzw. `80` |
| Cache Assets | **aus** – sonst siehst du Änderungen verzögert |
| Block Common Exploits | an |
| Websockets Support | aus |
Reiter *SSL*: Let's-Encrypt-Zertifikat anfordern, **Force SSL**, **HTTP/2**
und **HSTS** aktivieren. Basic Auth überträgt das Passwort sonst im Klartext.
Läuft der Proxy Manager selbst als Container, erreicht er `127.0.0.1` des Hosts
nicht. Dann entweder die Host-IP eintragen oder beide Container ins selbe
Docker-Netz hängen (siehe Kommentare in `docker-compose.yml`) und auf
`td-pult:80` zeigen.
Optional zusätzlich: in NPM unter *Access Lists* eine Liste mit Passwortschutz
anlegen und dem Proxy Host zuweisen. Der Schutz im Container bleibt trotzdem
aktiv — dann fragt es zweimal, deshalb entweder das eine oder das andere.
---
## 5 · Aktualisieren
Neue Version des Tools einspielen:
```bash
cp /pfad/zur/neuen/TD-Pult.html site/index.html
chmod 644 site/index.html
```
Mehr ist nicht nötig — der Ordner ist gemountet, nginx liest die Datei bei jeder
Anfrage neu. Ein `docker compose restart` braucht es nur, wenn du `nginx.conf`
oder `htpasswd` geändert hast.
Da `Cache-Control: no-store` gesetzt ist, lädt der Browser beim nächsten Aufruf
die neue Fassung. Wenn du eine ältere Version testen willst, einfach die Datei
tauschen — das Image bleibt unverändert.
---
## 6 · Was du wissen solltest
**Deine Daten liegen im Browser, nicht auf dem Server.** Anweisungen, Haken und
das bearbeitete Programm stehen im `localStorage` der jeweiligen Domain. Daraus
folgt:
- Jedes Gerät hat seinen eigenen Stand. Übertragung über *Dateien → Programm
sichern* bzw. *Anweisungen sichern* und auf dem anderen Gerät laden.
- Der Stand hängt an der Domain. Rufst du das Tool später unter einer anderen
Adresse auf, ist es leer — vorher sichern.
- Wer im Browser die Website-Daten löscht, löscht auch deine Anweisungen.
Vor der Schicht einmal sichern.
**Ausfall am Platz.** Die Seite läuft nach dem Laden vollständig im Browser.
Bricht das Netz weg, arbeitet der bereits geöffnete Tab normal weiter — nur ein
Neuladen geht dann nicht mehr. Halte die Datei zusätzlich lokal vor, dann kannst
du sie im Notfall per Doppelklick öffnen.
**Basic Auth** ist nur so sicher wie die Leitung. Ausschließlich über HTTPS
betreiben und `Force SSL` im Proxy setzen.
---
## Dateien
| Datei | Zweck |
|---|---|
| `docker-compose.yml` | Container-Definition, Ports, Mounts |
| `site/index.html` | Die ausgelieferte Seite — hierhin `TD-Pult.html` kopieren |
| `install.sh` | Richtet ein bzw. repariert einen fehlgeschlagenen Start |
| `nginx.conf` | Auslieferung, Basic Auth, Header, Healthcheck |
| `htpasswd` | Benutzer und Passwort-Hash — selbst erzeugen, nicht teilen |
| `Dockerfile` | Optional: eigenständiges Image für eine Registry |
| `../.gitignore` | Hält `htpasswd` und `site/index.html` aus der Versionierung |

Powered by TurnKey Linux.