diff --git a/beispiele/mehrere-apps/docker-compose.yml b/beispiele/mehrere-apps/docker-compose.yml index 84c05b1..7505fef 100644 --- a/beispiele/mehrere-apps/docker-compose.yml +++ b/beispiele/mehrere-apps/docker-compose.yml @@ -55,15 +55,101 @@ services: image: nginx:alpine container_name: honeybar-leiste restart: unless-stopped - volumes: - - ./upgrade.conf:/etc/nginx/conf.d/00-upgrade.conf:ro - - ./leiste.conf:/etc/nginx/conf.d/default.conf:ro + # Die beiden nginx-Dateien stehen als `configs` unten **in dieser Datei**. + # + # Mit Bind-Mounts (`./leiste.conf:/etc/nginx/…`) müssten sie auf dem Wirt + # liegen — und fehlt eine, legt Docker dort wortlos ein *Verzeichnis* an + # und scheitert beim nächsten Start mit „not a directory". Beim Einsetzen + # über eine Oberfläche, wo man nur die Compose-Datei bearbeitet, ist das + # eine Falle ohne Nutzen. + configs: + - source: upgrade + target: /etc/nginx/conf.d/00-upgrade.conf + - source: leiste + target: /etc/nginx/conf.d/default.conf ports: - "127.0.0.1:${LEISTE_PORT:-8185}:80" networks: [honeybar] # Der Einsetzer braucht HoneyOS nicht zum Starten — er reicht nur durch und # setzt eine Zeile ein. Ist HoneyOS aus, fehlt die Leiste, die App läuft. +configs: + # Achtung beim Ändern: `$$` ist hier ein einfaches `$` für nginx. Ein + # einzelnes `$` würde Compose als eigene Variable lesen und leeren. + upgrade: + content: | + # Gehört nach /etc/nginx/conf.d/, aber ausserhalb eines server-Blocks: + # „Connection: upgrade" nur dann setzen, wenn der Browser das auch will. + map $$http_upgrade $$connection_upgrade { + default upgrade; + '' close; + } + leiste: + content: | + # ───────────────────────────────────────────────────────────────────────────── + # Ein Einsetzer für alle Dienste, die die Leiste tragen sollen. + # + # Pangolin gibt den ursprünglichen Host weiter; daran erkennt nginx, welcher + # Dienst gemeint ist. Eine neue App heisst: zwei Zeilen in den Tabellen unten, + # neu laden, fertig — kein weiterer Behälter. + # ───────────────────────────────────────────────────────────────────────────── + + # Wohin durchgereicht wird. Links der Name, unter dem du die App aufrufst, + # rechts Behältername und Port im Docker-Netz. + map $$host $$ziel { + default ""; + pdf.honeyos.duckdns.org "bentopdf:8080"; + status.honeyos.duckdns.org "uptime-kuma:3001"; + } + + # Welche App das für HoneyOS ist. Muss der id in der App-Liste entsprechen — + # daran erkennt die Leiste, wo man gerade ist, und hebt sie hervor. + map $$host $$appid { + default ""; + pdf.honeyos.duckdns.org "bentopdf"; + status.honeyos.duckdns.org "status"; + } + + server { + listen 80; + server_name _; + + # Für ein proxy_pass mit Variable braucht nginx einen Namensauflöser — + # im Docker-Netz ist das der eingebaute unter 127.0.0.11. + resolver 127.0.0.11 valid=30s ipv6=off; + + # Unbekannter Host: nicht raten, sondern ablehnen. Sonst wird aus einem + # Tippfehler in Pangolin eine stille Weiterleitung irgendwohin. + if ($$ziel = "") { return 404; } + + location / { + proxy_pass http://$$ziel; + proxy_set_header Host $$host; + proxy_set_header X-Forwarded-For $$proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $$scheme; + proxy_set_header X-Real-IP $$remote_addr; + + # WebSockets durchlassen — viele Werkzeuge (Uptime Kuma, Dashboards, + # alles mit Live-Anzeige) brechen sonst ab. + proxy_http_version 1.1; + proxy_set_header Upgrade $$http_upgrade; + proxy_set_header Connection $$connection_upgrade; + + # Unkomprimiert anfordern, sonst ist im Strom nichts zu ersetzen. + proxy_set_header Accept-Encoding ""; + + # Nur HTML anfassen; alles andere geht unberührt durch. + sub_filter_types text/html; + sub_filter_once on; + sub_filter '' + ''; + + # Lange Antworten nicht künstlich aufhalten (Downloads, Fortschritt). + proxy_buffering off; + proxy_read_timeout 300s; + } + } + networks: honeybar: # Fester Name, damit andere Compose-Dateien ihn als `external` finden. diff --git a/beispiele/mehrere-apps/leiste.conf b/beispiele/mehrere-apps/leiste.conf index 237f6b9..88720a0 100644 --- a/beispiele/mehrere-apps/leiste.conf +++ b/beispiele/mehrere-apps/leiste.conf @@ -1,3 +1,14 @@ +# ───────────────────────────────────────────────────────────────────────────── +# HINWEIS: Diese Datei ist die lesbare Fassung zum Nachschlagen. Verwendet wird +# derselbe Inhalt aus `docker-compose.yml` (Abschnitt `configs:`) — dort steht +# er noch einmal, mit `$$` statt `$`. Wer hier etwas ändert, ändert es dort. +# +# Der Grund für den Umweg: Bind-Mounts einzelner Dateien scheitern, sobald die +# Datei auf dem Wirt fehlt — Docker legt dann ein Verzeichnis an und bricht mit +# „not a directory" ab. Beim Einsetzen über eine Oberfläche will man ausserdem +# nur eine Datei bearbeiten, nicht drei. +# ───────────────────────────────────────────────────────────────────────────── + # ───────────────────────────────────────────────────────────────────────────── # Ein Einsetzer für alle Dienste, die die Leiste tragen sollen. #