fix(beispiel): nginx-Konfiguration in die Compose-Datei, keine Bind-Mounts

Fehlt eine der beiden Dateien auf dem Wirt, legt Docker dort wortlos ein
Verzeichnis an und scheitert beim Start mit "not a directory" — beim Einsetzen
ueber eine Oberflaeche eine Falle ohne Nutzen. Als configs mit content traegt
die Compose-Datei alles selbst.

Durchprobiert ohne eine einzige Datei auf dem Wirt: Stapel hoch, HoneyOS
antwortet, richtige data-app, unbekannter Host 404.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-08-29 00:45:43 +02:00
1 parent fe48f3d98e
commit d1cd20586f
2 files changed
+100 -3

No files matched your search

+89 -3
View File
@@ -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 '</head>'
'<script defer src="https://honeyos.duckdns.org/honeybar/honeybar.js" data-app="$$appid"></script></head>';
# 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.
+11
View File
@@ -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.
#