BentoPDF · Operate
This runbook deploys the service from apps/bentopdf/ and completes the configuration that Kubernetes cannot supply by itself. Start with the shared deployment workflow for repository rendering, credentials, and Argo CD ownership.
1. Prepare dependencies and inputs
-
Set
BENTOPDF_HOSTandBENTOPDF_IMAGE_TAG; publish the hostname to the shared ingress endpoint. -
Deploy Traefik, cert-manager, and Authentik. Keep both response headers in
bentopdf-headerswhen adjusting middleware.
2. Reconcile the application
Publish the reviewed manifests and shared variables to the branch tracked by your Argo CD Applications. Local edits are not deployment inputs until that branch contains them. Let the root app-of-apps discover this service and retain its declared hook order; do not apply files containing unresolved variable placeholders directly.
From the repository root, inspect the Application and its namespace:
/home/linuxbrew/.linuxbrew/bin/kubectl --kubeconfig kubeconfig \ -n argocd get application bentopdf
/home/linuxbrew/.linuxbrew/bin/kubectl --kubeconfig kubeconfig \ -n bentopdf get pods,svc,pvcWait for required controllers, database initialization, and migration Jobs before testing the user workflow. Synced configuration, ready workloads, and a successful user transaction are separate milestones.
3. Complete identity and first access
Create an Authentik proxy provider in forward-auth mode for the exact BentoPDF HTTPS origin and assign it to the embedded outpost. Add the host-specific /outpost.goauthentik.io/ callback route described in the SSO guide. The middleware reference is already in the ingress, but apps/traefik/forward-auth.yaml currently defines an outpost route only for the Traefik dashboard hostname.
4. Connect and operate the service
-
Try a small merge and a representative large PDF from an authenticated browser. Confirm downloads work.
-
URL-based conversion may need a separate CORS proxy and a custom frontend build with
VITE_CORS_PROXY_URL; no such proxy is provisioned here. Follow the upstream self-hosting instructions for the selected image before enabling that feature.
Availability before maintenance
HA static serving tier; access depends on the shared identity and ingress services.
The declared zero-surge update fits two eligible nodes, provided the remaining pod is Ready. A PDB controls eviction; it does not prevent every failed release or node outage.
Measure protected page access after losing one serving pod and separately assess identity/ingress continuity. Preserve an honest distinction between frontend uptime and browser job success.
Use the component-by-component failure contract before a node drain, database promotion, or upgrade. Restoring a healthy replica count must include data resynchronization and restored voting capacity, not just Running pods.
5. Maintain and recover
Git, the image, and ingress configuration reconstruct the server. User input and exported PDFs remain on the client. Downloaded results need the user’s own storage and backup policy.
Before an upgrade, read the release notes for the pinned target and record a recovery point. A previous image tag is not a database rollback after a schema migration. Use routine operations and disaster recovery for the platform sequence.
Troubleshooting
If the page works but a tool fails, inspect browser errors for blocked worker resources, cross-origin isolation, or memory exhaustion. If the page never opens, resolve forward-auth and callback routing before troubleshooting PDF processing.
