|
|
1 week ago | |
|---|---|---|
| .. | ||
| site | 1 week ago | |
| Dockerfile | 1 week ago | |
| README.md | 1 week ago | |
| docker-compose.yml | 1 week ago | |
| install.sh | 1 week ago | |
| nginx.conf | 1 week ago | |
README.md
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:
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:
docker run --rm -it httpd:alpine htpasswd -Bn td > htpasswd # fragt interaktiv
Weiteren Benutzer ergänzen:
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
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:
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:
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
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:
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 |