Zum Inhalt springen

Mit Kubernetes bereitstellen ​

Kubernetes ist für eine statische Website vielleicht überdimensioniert, kann aber gut passen, wenn Sie ohnehin auf Helm + GitOps setzen.

IMPORTANT

Erforderliche Header für die Office-Dateikonvertierung

LibreOffice-basierte Werkzeuge (Word-, Excel-, PowerPoint-Konvertierung) benötigen diese HTTP-Header für die SharedArrayBuffer-Unterstützung:

  • Cross-Origin-Opener-Policy: same-origin
  • Cross-Origin-Embedder-Policy: require-corp

Die offiziellen BentoPDF-Nginx-Images enthalten diese Header. In Kubernetes sind Ingress-/Gateway-Controller ebenfalls Reverse-Proxys. Stellen Sie daher sicher, dass diese Header erhalten bleiben (oder fügen Sie sie am Edge hinzu).

Voraussetzungen ​

  • Kubernetes-Cluster
  • Helm v3
  • Ein BentoPDF-Nginx-Image (z. B. ghcr.io/alam00000/bentopdf:<tag>), das auf Port 8080 läuft

Mit Helm bereitstellen ​

Aus diesem Repo installieren (lokales Chart) ​

bash
kubectl create namespace bentopdf

helm upgrade --install bentopdf /path/to/bentopdf/chart \
  --namespace bentopdf \
  --set image.repository=ghcr.io/alam00000/bentopdf \
  --set image.tag=latest

Aus GHCR installieren (OCI-Chart) ​

Wenn das Chart als OCI-Artefakt in GHCR veröffentlicht ist:

bash
export GHCR_USERNAME="<github-org-or-user>"

helm upgrade --install bentopdf oci://ghcr.io/$GHCR_USERNAME/charts/bentopdf \
  --namespace bentopdf \
  --create-namespace \
  --version 0.1.0 \
  --set image.repository=ghcr.io/alam00000/bentopdf \
  --set image.tag=latest

Verfügbar machen ​

Port-Forward (schneller Test) ​

bash
kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080

Ingress (optional) ​

Aktivieren Sie Ingress (Beispiel für nginx-ingress):

yaml
ingress:
  enabled: true
  className: nginx
  hosts:
    - host: pdf.example.com
      paths:
        - path: /
          pathType: Prefix

Gateway API (optional) ​

Dieses Chart unterstützt Gateway API Gateway + HTTPRoute.

Beispiel (Cloudflare-Gateway-API-Operator):

yaml
gateway:
  enabled: true
  name: bento-tunnel
  namespace: bentopdf
  gatewayClassName: cloudflare

httpRoute:
  enabled: true
  parentRefs:
    - name: bento-tunnel
      namespace: bentopdf
      sectionName: http
  hostnames:
    - pdfs.example.com

Sicherstellen, dass die SharedArrayBuffer-Header weiterhin funktionieren (Ingress/Gateway) ​

Was passieren "sollte" ​

Die Nginx-Konfiguration von BentoPDF setzt die erforderlichen Response-Header. Die meisten Ingress-/Gateway-Controller leiten Response-Header des Upstreams unverändert weiter.

Was das verhindern kann ​

  • Eine Controller-/Edge-Richtlinie, die Response-Header überschreibt oder entfernt
  • Eine "Security-Header"-Middleware, die andere COOP/COEP-Werte setzt

So überprüfen Sie es ​

Führen Sie dies gegen Ihren öffentlichen Endpunkt aus:

bash
curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy'

Sie sollten Folgendes sehen:

  • Cross-Origin-Opener-Policy: same-origin
  • Cross-Origin-Embedder-Policy: require-corp

Wenn Ihr Ingress-Controller sie nicht beibehält ​

Fügen Sie die Header am Edge hinzu (controllerspezifisch). Beispiel für nginx-ingress:

yaml
ingress:
  enabled: true
  className: nginx
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      add_header Cross-Origin-Opener-Policy "same-origin" always;
      add_header Cross-Origin-Embedder-Policy "require-corp" always;

.mjs-MIME-Type-Fehler (PDF unterschreiben / PDF-Formular ausfüllen, leerer iframe) ​

Wenn die Browserkonsole bei einer .mjs-Anfrage Failed to load module script: ... non-JavaScript MIME type "application/octet-stream" anzeigt, ersetzt ein Ingress-/Gateway-Controller vor dem BentoPDF-Nginx den Upstream-Header Content-Type durch application/octet-stream.

Der Nginx im BentoPDF-Image liefert .mjs bereits als application/javascript aus. Die Lösung besteht darin, den Controller daran zu hindern, den Header zu entfernen oder zu ersetzen. Für nginx-ingress:

yaml
ingress:
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      location ~* \.mjs$ {
        types {} default_type application/javascript;
      }

Oder verwenden Sie in der Gateway API einen ResponseHeaderModifier-Filter, um Content-Type: application/javascript für .mjs-Pfade zu setzen. Überprüfen Sie es im DevTools-Tab Network: Die fehlgeschlagene .mjs-Anfrage sollte nun content-type: application/javascript zeigen.

Wenn Sie die Gateway API nutzen und Header erzwingen möchten ​

Die Gateway API unterstützt einen ResponseHeaderModifier-Filter. Sie können ihn in httpRoute.rules[*].filters einbinden:

yaml
httpRoute:
  enabled: true
  hostnames: [pdf.example.com]
  parentRefs:
    - name: bento-tunnel
      namespace: misc
      sectionName: http
  rules:
    - matches:
        - path: { type: PathPrefix, value: / }
      filters:
        - type: ResponseHeaderModifier
          responseHeaderModifier:
            set:
              - name: Cross-Origin-Opener-Policy
                value: same-origin
              - name: Cross-Origin-Embedder-Policy
                value: require-corp

Die Unterstützung bestimmter Filter hängt von Ihrem Gateway-Controller ab. Wenn ein Filter ignoriert wird, fügen Sie die Header stattdessen am Edge bzw. im Controller hinzu.

Bestimmte Werkzeuge deaktivieren ​

Verwenden Sie eine ConfigMap, um Werkzeuge zur Laufzeit zu deaktivieren, ohne das Image neu zu bauen:

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: bentopdf-config
  namespace: bentopdf
data:
  config.json: |
    {
      "disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"]
    }

Binden Sie sie in das ausgelieferte Verzeichnis ein:

yaml
spec:
  containers:
    - name: bentopdf
      volumeMounts:
        - name: config
          mountPath: /usr/share/nginx/html/config.json
          subPath: config.json
          readOnly: true
  volumes:
    - name: config
      configMap:
        name: bentopdf-config

Werkzeug-IDs entsprechen der Seiten-URL ohne .html: Öffnen Sie ein beliebiges Werkzeug und sehen Sie sich die URL an (z. B. edit-pdf, merge-pdf, compress-pdf). Deaktivierte Werkzeuge werden auf der Startseite, in der Suche, in den Tastenkürzeln, im Workflow-Builder und beim direkten URL-Zugriff ausgeblendet. Die vollständige Liste der Optionen finden Sie im Docker-Leitfaden.

Doppelt lizenziert unter AGPL-3.0 und kommerzieller Lizenz.