Hoppa till innehåll

Distribuera med Kubernetes ​

Kubernetes kan vara överdrivet för en statisk webbplats, men det kan passa utmärkt om du redan standardiserar på Helm + GitOps.

IMPORTANT

Obligatoriska huvuden för konvertering av Office-filer

LibreOffice-baserade verktyg (konvertering av Word, Excel, PowerPoint) kräver dessa HTTP-huvuden för stöd för SharedArrayBuffer:

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

De officiella nginx-avbildningarna för BentoPDF innehåller dessa huvuden. I Kubernetes är Ingress-/Gateway-kontrollerare också omvända proxyservrar, så se till att huvudena bevaras (eller lägg till dem vid kanten).

Förutsättningar ​

  • Kubernetes-kluster
  • Helm v3
  • En nginx-avbildning för BentoPDF (t.ex. ghcr.io/alam00000/bentopdf:<tag>) som levererar på port 8080

Distribuera med Helm ​

Installera från det här repositoryt (lokalt 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

Installera från GHCR (OCI-chart) ​

Om chartet är publicerat på GHCR som en OCI-artefakt:

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

Exponera tjänsten ​

Port-forward (snabbtest) ​

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

Ingress (valfritt) ​

Aktivera Ingress (exempel för nginx-ingress):

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

Gateway API (valfritt) ​

Det här chartet stöder Gateway API Gateway + HTTPRoute.

Exempel (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

Se till att SharedArrayBuffer-huvudena fortfarande fungerar (Ingress/Gateway) ​

Vad som "borde" hända ​

BentoPDF:s nginx-konfiguration sätter de nödvändiga svarshuvudena. De flesta Ingress-/Gateway-kontrollerare skickar vidare uppströmssvarens huvuden oförändrade.

Vad som kan gå sönder ​

  • En kontrollerare eller kantpolicy som skriver över eller tar bort svarshuvuden
  • Ett mellanlager för "säkerhetshuvuden" som sätter andra COOP/COEP-värden

Så verifierar du ​

Kör detta mot din publika slutpunkt:

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

Du bör se:

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

Om din Ingress-kontrollerare inte bevarar dem ​

Lägg till huvudena vid kanten (kontrollerarspecifikt). Exempel 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;

MIME-typfel för .mjs (tom iframe i Signera PDF / Formulärifyllare) ​

Om webbläsarkonsolen visar Failed to load module script: ... non-JavaScript MIME type "application/octet-stream" för en .mjs-begäran ersätter en Ingress-/Gateway-kontrollerare framför BentoPDF:s nginx huvudet Content-Type från uppströmsservern med application/octet-stream.

Nginx i BentoPDF-avbildningen levererar redan .mjs som application/javascript. Lösningen är att hindra kontrollern från att ta bort eller ersätta det. För nginx-ingress:

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

Eller använd ett ResponseHeaderModifier-filter i Gateway API för att sätta Content-Type: application/javascript för .mjs-sökvägar. Verifiera med DevTools → fliken Network: den misslyckade .mjs-begäran ska nu visa content-type: application/javascript.

Om du använder Gateway API och vill tvinga fram huvuden ​

Gateway API stöder ett ResponseHeaderModifier-filter. Du kan koppla det i httpRoute.rules[*].filters:

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

Stödet för specifika filter beror på din Gateway-kontrollerare. Om ett filter ignoreras lägger du till huvudena i kant- eller kontrollerarlagret i stället.

Inaktivera specifika verktyg ​

Använd en ConfigMap för att inaktivera verktyg vid körning utan att bygga om avbildningen:

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

Montera den i den levererade mappen:

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

Verktygs-ID:n är sidans URL utan .html: öppna ett verktyg och titta på URL:en (t.ex. edit-pdf, merge-pdf, compress-pdf). Inaktiverade verktyg döljs från startsidan, sökningen, genvägarna, arbetsflödesbyggaren och direkt URL-åtkomst. Se Docker-guiden för en fullständig lista över alternativ.

Dubbellicensierad under AGPL-3.0 och kommersiell licens.