|
|
# 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 |
|