# ───────────────────────────────────────────────────────────────────────────── # 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 '' ''; # 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