# ───────────────────────────────────────────────────────────────────────────── # BentoPDF mit HoneyOS-Leiste — alles über den eigenen Ursprung. # # Pangolin → leiste → bentopdf # ↘ honeyos (nur /honeybar/ und zwei Abfragen) # # Der Kniff: Die Leiste wird nicht von honeyos.… geladen, sondern über die # Adresse der App selbst durchgereicht. Für den Browser ist sie damit eigener # Ursprung — und alle drei Hürden fallen auf einmal weg: # # · die CSP der App (BentoPDF erlaubt 'self', mehr braucht es nicht) # · CORS (keine fremde Anfrage mehr) # · COEP (kein fremdes Skript mehr) # # Ausserdem bleibt HONEYOS_APPS_KEY auf dem Server: Der nginx setzt ihn ein, # im Quelltext der Seite steht er nicht. # # docker compose up -d # → in Pangolin die Ressource auf leiste:80 zeigen lassen, # und in HoneyOS BentoPDF als App eintragen (id: bentopdf, URL: die # öffentliche Adresse, exakt so, wie du sie im Browser aufrufst). # ───────────────────────────────────────────────────────────────────────────── services: bentopdf: image: ghcr.io/alam00000/bentopdf-simple:latest container_name: bentopdf restart: unless-stopped # Kein ports: nötig — erreichbar ist nur noch der Einsetzer davor. # (Zum direkten Nachsehen ohne Leiste ruhig eins lassen.) networks: [honeybar] leiste: image: nginx:alpine container_name: bentopdf-leiste restart: unless-stopped depends_on: [bentopdf] ports: # Auf welcher Adresse Pangolin die App abholt. 127.0.0.1 nur, wenn # Pangolin auf demselben Wirt im Host-Netz läuft — hängt es in einem # eigenen Behälter oder auf einer anderen Maschine, kommt es dort nicht # hin. Am saubersten: kein ports:, und Pangolin (bzw. sein Newt) tritt # dem Netz `honeybar` bei und spricht `leiste:80` direkt an. - "${LEISTE_PORT:-8185}:80" configs: - source: leiste target: /etc/nginx/conf.d/default.conf networks: [honeybar] configs: leiste: # `$$` ist hier ein einfaches `$` für nginx. Ein einzelnes `$` setzt # dagegen Compose ein — genau das ist bei ${HONEYOS_APPS_KEY} gewollt: # der Schlüssel kommt aus der .env und landet nur in der Konfiguration # des nginx, nie im Quelltext der Seite. (nginx selbst löst keine # Umgebungsvariablen auf; stünde dort $${…}, ginge die Zeichenkette # wörtlich als Schlüssel hinaus.) content: | server { listen 80; resolver 127.0.0.11 valid=30s ipv6=off; # Uploads nicht hier begrenzen — nginx nimmt sonst bei 1 MB nichts # mehr an, und jede App mit Dateiupload waere hinter dem Einsetzer # kaputt. Wieviel erlaubt ist, entscheidet die App dahinter. client_max_body_size 0; # 1. Die Leiste selbst, durchgereicht über diesen Ursprung. location /honeybar/ { proxy_pass http://honeyos:8080/honeybar/; } # 2. Ihre zwei Abfragen — einzeln benannt und nur lesend. Ein # durchgereichtes /api/ hinge die ganze HoneyOS-Schnittstelle # unter die Adresse dieser App. location = /honeyos-api/apps { limit_except GET { deny all; } proxy_pass http://honeyos:8080/api/apps; proxy_set_header X-HoneyOS-Key "${HONEYOS_APPS_KEY}"; } location = /honeyos-api/weather { limit_except GET { deny all; } proxy_pass http://honeyos:8080/api/weather; proxy_set_header X-HoneyOS-Key "${HONEYOS_APPS_KEY}"; } # 3. Die App selbst, mit eingesetzter Zeile. location / { proxy_pass http://bentopdf:8080; proxy_set_header Host $$host; proxy_set_header X-Forwarded-For $$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $$scheme; proxy_http_version 1.1; # Unkomprimiert anfordern — in einem gzip-Strom ist nichts zu ersetzen. proxy_set_header Accept-Encoding ""; # sub_filter_types braucht es nicht: text/html ist voreingestellt, # und doppelt genannt warnt nginx beim Start. sub_filter_once on; sub_filter '' ''; } } networks: honeybar: external: true