Der Dienst im Beispiel heisst jetzt einsetzer — er ist nicht die HoneyBar, er setzt sie ein. Zusammensetzungen wie Menueleiste, Taskleiste und Statusleiste bleiben, die meinen etwas anderes. Dazu in IDEAS notiert, dass HoneyBar und Menueleiste zwei getrennte Stilsaetze sind und schon einmal auseinandergelaufen ist. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
108 lines
4.8 KiB
YAML
108 lines
4.8 KiB
YAML
# ─────────────────────────────────────────────────────────────────────────────
|
|
# BentoPDF mit HoneyBar — alles über den eigenen Ursprung.
|
|
#
|
|
# Pangolin → einsetzer → bentopdf
|
|
# ↘ honeyos (nur /honeybar/ und zwei Abfragen)
|
|
#
|
|
# Der Kniff: Die HoneyBar 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 einsetzer: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 HoneyBar ruhig eins lassen.)
|
|
networks: [honeybar]
|
|
|
|
einsetzer:
|
|
image: nginx:alpine
|
|
container_name: bentopdf-einsetzer
|
|
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 `einsetzer:80` direkt an.
|
|
- "${LEISTE_PORT:-8185}:80"
|
|
configs:
|
|
- source: einsetzer
|
|
target: /etc/nginx/conf.d/default.conf
|
|
networks: [honeybar]
|
|
|
|
configs:
|
|
einsetzer:
|
|
# `$$` 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 HoneyBar 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 '</head>'
|
|
'<script defer src="/honeybar/honeybar.js" data-app="bentopdf" data-apps="/honeyos-api/apps" data-home="https://honeyos.duckdns.org/"></script></head>';
|
|
}
|
|
}
|
|
|
|
networks:
|
|
honeybar:
|
|
external: true
|