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