Files
marc 6fe6533667 Kein alter Stand mehr im Zwischenspeicher, Einsetzer heisst HoneyBar-Proxy
Die HoneyBar kommt bei fremden Apps ueber deren eigenen Ursprung — das
loest CSP, CORS und COEP auf einmal, setzt sie aber auch deren Zwischen-
speicher aus. Eine alte HoneyBar dort sieht aus wie ein Fehler in HoneyOS.
Statt no-cache jetzt no-store, must-revalidate; dazu ein Abschnitt in der
README, wie man einen haengengebliebenen Stand erkennt.

Und der nginx davor heisst nicht mehr 'Einsetzer', sondern HoneyBar-Proxy
(Dienst und Behaelter honeybar-proxy bzw. <app>-honeybar). Er ist ein
Reverse Proxy, der die HoneyBar einsetzt — der alte Name sagte das
Gegenteil von dem, was man im docker ps sehen will. LEISTE_PORT heisst
jetzt HONEYBAR_PROXY_PORT.
2026-08-29 22:36:56 +02:00

108 lines
4.8 KiB
YAML

# ─────────────────────────────────────────────────────────────────────────────
# BentoPDF mit HoneyBar — alles über den eigenen Ursprung.
#
# Pangolin → honeybar-proxy → 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 honeybar-proxy: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 HoneyBar-Proxy davor.
# (Zum direkten Nachsehen ohne HoneyBar ruhig eins lassen.)
networks: [honeybar]
honeybar-proxy:
image: nginx:alpine
container_name: bentopdf-honeybar
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 `honeybar-proxy:80` direkt an.
- "${HONEYBAR_PROXY_PORT:-8185}:80"
configs:
- source: honeybar
target: /etc/nginx/conf.d/default.conf
networks: [honeybar]
configs:
honeybar:
# `$$` 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 HoneyBar-Proxy
# 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