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>
158 lines
7.0 KiB
YAML
158 lines
7.0 KiB
YAML
# ─────────────────────────────────────────────────────────────────────────────
|
|
# HoneyOS und der Einsetzer in einem Stapel.
|
|
#
|
|
# Pangolin → honeyos (der Schreibtisch selbst)
|
|
# Pangolin → leiste → bentopdf, kuma, … (fremde Dienste mit Leiste)
|
|
#
|
|
# Beides gehört zusammen: Die Leiste kommt von HoneyOS, der Einsetzer trägt sie
|
|
# in Werkzeuge, die man nicht ändern kann. Getrennt zu pflegen hiesse, bei jeder
|
|
# neuen App an zwei Stellen zu denken.
|
|
#
|
|
# cp ../../.env.example .env && ausfüllen
|
|
# mkdir -p daten && sudo chown 1000:1000 daten
|
|
# docker compose up -d
|
|
#
|
|
# Das Netz `honeybar` legt dieser Stapel selbst an — die fremden Dienste treten
|
|
# ihm bei. In deren Compose-Datei:
|
|
#
|
|
# services:
|
|
# bentopdf:
|
|
# networks: [default, honeybar] # ports: kann dann ganz weg
|
|
# networks:
|
|
# honeybar:
|
|
# external: true
|
|
#
|
|
# Diesen Stapel deshalb zuerst starten; danach die anderen.
|
|
# In Pangolin zeigt honeyos.… auf honeyos:8080 und jede App auf leiste:80.
|
|
# ─────────────────────────────────────────────────────────────────────────────
|
|
|
|
services:
|
|
honeyos:
|
|
image: gitea.honeyy.duckdns.org/docker/honeyos:latest
|
|
container_name: honeyos
|
|
restart: unless-stopped
|
|
user: "1000:1000"
|
|
ports:
|
|
# Nur an localhost: davor steht Pangolin, nicht das offene Netz.
|
|
- "127.0.0.1:${HONEYOS_PORT:-8088}:8080"
|
|
volumes:
|
|
- ${HONEYOS_DATA_DIR:-./daten}:/data
|
|
environment:
|
|
- HONEYOS_PUBLIC_URL=${HONEYOS_PUBLIC_URL:-}
|
|
- HONEYOS_SESSION_SECRET=${HONEYOS_SESSION_SECRET:-}
|
|
- HONEYOS_OIDC_ISSUER=${HONEYOS_OIDC_ISSUER:-}
|
|
- HONEYOS_OIDC_CLIENT_ID=${HONEYOS_OIDC_CLIENT_ID:-}
|
|
- HONEYOS_OIDC_CLIENT_SECRET=${HONEYOS_OIDC_CLIENT_SECRET:-}
|
|
- HONEYOS_OIDC_REDIRECT_URL=${HONEYOS_OIDC_REDIRECT_URL:-}
|
|
- HONEYOS_BUTTON_LABEL=${HONEYOS_BUTTON_LABEL:-Anmelden}
|
|
- HONEYOS_ALLOWED_USERS=${HONEYOS_ALLOWED_USERS:-}
|
|
- HONEYOS_PROXY_AUTH=${HONEYOS_PROXY_AUTH:-}
|
|
- HONEYOS_USER_HEADER=${HONEYOS_USER_HEADER:-}
|
|
- HONEYOS_APPS_KEY=${HONEYOS_APPS_KEY:-}
|
|
networks: [honeybar]
|
|
|
|
leiste:
|
|
image: nginx:alpine
|
|
container_name: honeybar-leiste
|
|
restart: unless-stopped
|
|
# 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.
|
|
# Ohne den hiesse das Netz nach dem Ordner, in dem diese Datei liegt.
|
|
name: honeybar
|