docs: fertiges Beispiel — BentoPDF mit Einsetzer davor
Compose und nginx-Konfiguration, genau so durchprobiert. Dazu der Hinweis, dass der Ursprung in HoneyOS auf den Buchstaben passen muss: localhost und 127.0.0.1 sind fuer den Browser zwei verschiedene. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5dbadf212f
commit
607ae13374
3 files changed
+76
-1
No files matched your search
@@ -212,7 +212,10 @@ location / {
|
|||||||
```
|
```
|
||||||
|
|
||||||
Dazu muss der Ursprung dieser App **in HoneyOS als App eingetragen** sein — die
|
Dazu muss der Ursprung dieser App **in HoneyOS als App eingetragen** sein — die
|
||||||
Liste ist zugleich die CORS-Freigabe.
|
Liste ist zugleich die CORS-Freigabe. **Auf den Ursprung genau**: `localhost` und
|
||||||
|
`127.0.0.1` sind für den Browser zwei verschiedene, ebenso `http` und `https`
|
||||||
|
oder ein abweichender Port. Passt er nicht, erscheint die Leiste mit leerer
|
||||||
|
App-Liste und in der Konsole steht ein CORS-Fehler.
|
||||||
|
|
||||||
**Warum `style-src 'unsafe-inline'`:** Die Leiste bringt ihre Stile mit, im
|
**Warum `style-src 'unsafe-inline'`:** Die Leiste bringt ihre Stile mit, im
|
||||||
Shadow DOM. Eine strenge CSP verbietet die — gemessen: die Leiste erscheint,
|
Shadow DOM. Eine strenge CSP verbietet die — gemessen: die Leiste erscheint,
|
||||||
@@ -228,6 +231,9 @@ aus. Ohne das erscheint dort keine Leiste, und in der Konsole steht nur
|
|||||||
`ERR_BLOCKED_BY_RESPONSE.NotSameOriginAfterDefaultedToSameOriginByCoep`.
|
`ERR_BLOCKED_BY_RESPONSE.NotSameOriginAfterDefaultedToSameOriginByCoep`.
|
||||||
Das COEP der App bleibt dabei unangetastet — ihre eigenen Fähigkeiten also auch.
|
Das COEP der App bleibt dabei unangetastet — ihre eigenen Fähigkeiten also auch.
|
||||||
|
|
||||||
|
**Fertiges Beispiel:** [`beispiele/bentopdf/`](beispiele/bentopdf/) — Compose
|
||||||
|
und nginx-Konfiguration, so getestet.
|
||||||
|
|
||||||
**Nur Pangolin davor?** Traefik kann Antwortkörper nicht von sich aus ändern;
|
**Nur Pangolin davor?** Traefik kann Antwortkörper nicht von sich aus ändern;
|
||||||
dafür bräuchte es ein Plugin. Der kürzere Weg ist ein kleiner nginx *zwischen*
|
dafür bräuchte es ein Plugin. Der kürzere Weg ist ein kleiner nginx *zwischen*
|
||||||
Pangolin und der App, der nichts tut außer einsetzen:
|
Pangolin und der App, der nichts tut außer einsetzen:
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# ─────────────────────────────────────────────────────────────
|
||||||
|
# BentoPDF mit HoneyOS-Leiste
|
||||||
|
#
|
||||||
|
# Aufbau: Pangolin → leiste (nginx) → bentopdf
|
||||||
|
#
|
||||||
|
# Der nginx tut nichts weiter, als beim Durchreichen einen <script>-Tag vor
|
||||||
|
# </head> zu setzen. BentoPDF selbst bleibt unangetastet und weiss nichts davon.
|
||||||
|
#
|
||||||
|
# docker compose up -d
|
||||||
|
# → in Pangolin die Ressource auf leiste:80 zeigen lassen (nicht mehr auf
|
||||||
|
# bentopdf), und in HoneyOS BentoPDF als App eintragen — diese Liste ist
|
||||||
|
# zugleich die CORS-Freigabe.
|
||||||
|
# ─────────────────────────────────────────────────────────────
|
||||||
|
services:
|
||||||
|
bentopdf:
|
||||||
|
image: bentopdf/bentopdf:latest
|
||||||
|
container_name: bentopdf
|
||||||
|
restart: unless-stopped
|
||||||
|
# Kein ports: mehr. Erreichbar ist nur noch der Einsetzer davor.
|
||||||
|
networks: [intern]
|
||||||
|
|
||||||
|
leiste:
|
||||||
|
image: nginx:alpine
|
||||||
|
container_name: bentopdf-leiste
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on: [bentopdf]
|
||||||
|
volumes:
|
||||||
|
- ./leiste.conf:/etc/nginx/conf.d/default.conf:ro
|
||||||
|
ports:
|
||||||
|
# Nur an localhost binden: davor steht Pangolin, nicht das offene Netz.
|
||||||
|
- "127.0.0.1:8185:80"
|
||||||
|
networks: [intern]
|
||||||
|
|
||||||
|
networks:
|
||||||
|
intern:
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# Setzt die HoneyOS-Leiste in eine fremde App ein, die man nicht ändern kann.
|
||||||
|
#
|
||||||
|
# Angepasst werden müssen genau zwei Dinge: die Adresse von HoneyOS und
|
||||||
|
# data-app (der Name muss der id der App in HoneyOS entsprechen, sonst weiss
|
||||||
|
# die Leiste nicht, wo man gerade ist).
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
|
||||||
|
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.
|
||||||
|
# Das betrifft nur die Strecke Einsetzer→App; nach draussen komprimiert
|
||||||
|
# Pangolin weiterhin.
|
||||||
|
proxy_set_header Accept-Encoding "";
|
||||||
|
|
||||||
|
# Nur HTML anfassen. Bilder, JSON und Downloads gehen 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="bentopdf"></script></head>';
|
||||||
|
|
||||||
|
# Falls die App eine eigene CSP schickt (BentoPDF tut es nicht), muss
|
||||||
|
# sie ersetzt werden — zwei CSP-Kopfzeilen heissen nicht „mehr erlaubt",
|
||||||
|
# sondern „beide müssen zustimmen". Dann diese zwei Zeilen einschalten:
|
||||||
|
#
|
||||||
|
# proxy_hide_header Content-Security-Policy;
|
||||||
|
# add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://honeyos.duckdns.org; connect-src 'self' https://honeyos.duckdns.org; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:" always;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user