Nasadenie pomocou Kubernetes
Kubernetes môže byť pre statický web zbytočne veľa, no môže sa výborne hodiť, ak už štandardne používate Helm + GitOps.
IMPORTANT
Povinné hlavičky pre konverziu súborov Office
Nástroje založené na LibreOffice (konverzia Word, Excel, PowerPoint) vyžadujú pre podporu SharedArrayBuffer tieto HTTP hlavičky:
Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp
Oficiálne nginx obrazy BentoPDF tieto hlavičky obsahujú. V Kubernetes sú kontroléry Ingress/Gateway tiež reverzné proxy, preto sa uistite, že sa tieto hlavičky zachovajú (alebo ich pridajte na okraji siete).
Predpoklady
- Klaster Kubernetes
- Helm v3
- Nginx obraz BentoPDF (napr.
ghcr.io/alam00000/bentopdf:<tag>), ktorý počúva na porte 8080
Nasadenie pomocou Helm
Inštalácia z tohto repozitára (lokálny 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=latestInštalácia z GHCR (OCI chart)
Ak je chart publikovaný v GHCR ako 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=latestSprístupnenie
Port-forward (rýchly test)
bash
kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080Ingress (voliteľné)
Zapnite Ingress (príklad pre nginx-ingress):
yaml
ingress:
enabled: true
className: nginx
hosts:
- host: pdf.example.com
paths:
- path: /
pathType: PrefixGateway API (voliteľné)
Tento chart podporuje Gateway API Gateway + HTTPRoute.
Príklad (operátor Cloudflare Gateway API):
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.comAko zabezpečiť, aby hlavičky SharedArrayBuffer stále fungovali (Ingress/Gateway)
Čo by sa „malo“ diať
Konfigurácia nginx v BentoPDF nastavuje potrebné hlavičky odpovede. Väčšina kontrolérov Ingress/Gateway odovzdáva hlavičky odpovede z upstreamu bez zmeny.
Čo to môže pokaziť
- Politika kontroléra alebo okraja siete, ktorá hlavičky odpovede prepisuje alebo odstraňuje
- Middleware „bezpečnostných hlavičiek“, ktorý nastavuje iné hodnoty COOP/COEP
Ako overiť
Spustite toto proti svojmu verejnému endpointu:
bash
curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy'Mali by ste vidieť:
Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp
Ak ich váš kontrolér Ingress nezachováva
Pridajte hlavičky na okraji siete (podľa konkrétneho kontroléra). Príklad pre 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;Chyby MIME typu .mjs (prázdny iframe v Podpísať PDF / Vyplňovač formulárov)
Ak konzola prehliadača pri požiadavke .mjs zobrazí Failed to load module script: ... non-JavaScript MIME type "application/octet-stream", kontrolér Ingress/Gateway pred nginx BentoPDF nahrádza hlavičku Content-Type z upstreamu hodnotou application/octet-stream.
Nginx v obraze BentoPDF už poskytuje .mjs ako application/javascript. Riešením je zabrániť kontroléru, aby ju odstraňoval alebo nahrádzal. Pre nginx-ingress:
yaml
ingress:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
location ~* \.mjs$ {
types {} default_type application/javascript;
}Alebo v Gateway API použite filter ResponseHeaderModifier na nastavenie Content-Type: application/javascript pre cesty .mjs. Overte to v DevTools → karta Network: zlyhaná požiadavka .mjs by teraz mala zobrazovať content-type: application/javascript.
Ak používate Gateway API a chcete hlavičky pridať vynútene
Gateway API podporuje filter ResponseHeaderModifier. Môžete ho pripojiť v 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-corpPodpora konkrétnych filtrov závisí od vášho kontroléra Gateway; ak sa filter ignoruje, pridajte hlavičky na vrstve okraja siete alebo kontroléra.
Vypnutie konkrétnych nástrojov
Na vypnutie nástrojov za behu bez nového zostavenia obrazu použite ConfigMap:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: bentopdf-config
namespace: bentopdf
data:
config.json: |
{
"disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"]
}Pripojte ho do poskytovaného adresára:
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-configID nástroja je URL stránky bez .html: otvorte ľubovoľný nástroj a pozrite sa na URL (napr. edit-pdf, merge-pdf, compress-pdf). Vypnuté nástroje sa skryjú z domovskej stránky, vyhľadávania, skratiek, nástroja na tvorbu workflow aj z priameho prístupu cez URL. Úplný zoznam možností nájdete v príručke Docker.