النشر باستخدام Kubernetes
قد يكون Kubernetes أكثر مما يلزم لموقع ثابت، لكنه قد يكون خيارًا ممتازًا إذا كنت تعتمد أصلًا Helm وGitOps.
IMPORTANT
الترويسات المطلوبة لتحويل ملفات Office
تتطلب الأدوات المعتمدة على LibreOffice (تحويل Word وExcel وPowerPoint) ترويسات HTTP هذه لدعم SharedArrayBuffer:
Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp
تتضمن صور nginx الرسمية لـ BentoPDF هذه الترويسات. في Kubernetes، تُعد وحدات تحكم Ingress/Gateway أيضًا وكلاء عكسيين، لذا تأكد من الحفاظ على هذه الترويسات (أو أضفها على الحافة).
المتطلبات المسبقة
- عنقود Kubernetes
- Helm v3
- صورة nginx لـ BentoPDF (مثل
ghcr.io/alam00000/bentopdf:<tag>) تعمل على المنفذ 8080
النشر باستخدام Helm
التثبيت من هذا المستودع (مخطط محلي)
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التثبيت من GHCR (مخطط OCI)
إذا كان المخطط منشورًا على GHCR كعنصر OCI:
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إتاحته
إعادة توجيه المنفذ (اختبار سريع)
bash
kubectl -n bentopdf port-forward deploy/bentopdf 8080:8080Ingress (اختياري)
فعّل Ingress (مثال لـ nginx-ingress):
yaml
ingress:
enabled: true
className: nginx
hosts:
- host: pdf.example.com
paths:
- path: /
pathType: PrefixGateway API (اختياري)
يدعم هذا المخطط Gateway + HTTPRoute الخاصين بـ Gateway API.
مثال (مشغّل 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.comالتأكد من استمرار عمل ترويسات SharedArrayBuffer (Ingress/Gateway)
ما الذي "يجب" أن يحدث
يضبط إعداد nginx في BentoPDF ترويسات الاستجابة المطلوبة. تقوم معظم وحدات تحكم Ingress/Gateway بـتمرير ترويسات استجابة المصدر كما هي دون تغيير.
ما الذي قد يعطّل ذلك
- سياسة في وحدة التحكم أو على الحافة تستبدل ترويسات الاستجابة أو تحذفها
- وسيط "ترويسات أمان" يضبط قيم COOP/COEP مختلفة
كيف تتحقق
نفّذ هذا على نقطة النهاية العامة لديك:
bash
curl -I https://pdf.example.com/ | egrep -i 'cross-origin-opener-policy|cross-origin-embedder-policy'يجب أن ترى:
Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp
إذا كانت وحدة تحكم Ingress لا تحافظ عليها
أضف الترويسات على الحافة (بحسب وحدة التحكم). مثال لـ 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 لملفات .mjs (عارض توقيع PDF / ملء النماذج فارغ)
إذا عرضت وحدة تحكم المتصفح Failed to load module script: ... non-JavaScript MIME type "application/octet-stream" عند طلب .mjs، فإن وحدة تحكم Ingress/Gateway الموجودة أمام nginx الخاص بـ BentoPDF تستبدل ترويسة Content-Type الأصلية بـ application/octet-stream.
يقدّم nginx في صورة BentoPDF ملفات .mjs أصلًا بنوع application/javascript. الحل هو منع وحدة التحكم من حذفها أو استبدالها. بالنسبة إلى nginx-ingress:
yaml
ingress:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
location ~* \.mjs$ {
types {} default_type application/javascript;
}أو استخدم مرشح ResponseHeaderModifier في Gateway API لضبط Content-Type: application/javascript لمسارات .mjs. تحقق عبر DevTools ثم تبويب Network: يجب أن يعرض طلب .mjs الفاشل الآن content-type: application/javascript.
إذا كنت تستخدم Gateway API وتريد إضافة الترويسات قسرًا
يدعم Gateway API مرشح ResponseHeaderModifier. يمكنك إرفاقه في 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يعتمد دعم مرشحات محددة على وحدة تحكم Gateway لديك. إذا تم تجاهل مرشح، فأضف الترويسات في طبقة الحافة/وحدة التحكم بدلًا من ذلك.
تعطيل أدوات محددة
استخدم ConfigMap لتعطيل الأدوات وقت التشغيل دون إعادة بناء الصورة:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: bentopdf-config
namespace: bentopdf
data:
config.json: |
{
"disabledTools": ["edit-pdf", "sign-pdf", "encrypt-pdf"]
}اربطه بالمجلد المقدَّم:
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معرّفات الأدوات هي عنوان URL للصفحة بدون .html: افتح أي أداة وانظر إلى العنوان (مثل edit-pdf وmerge-pdf وcompress-pdf). تُخفى الأدوات المعطلة من الصفحة الرئيسية والبحث والاختصارات ومنشئ سير العمل والوصول المباشر عبر URL. راجع دليل Docker للاطلاع على القائمة الكاملة للخيارات.