Skip to content
antalos

BentoPDF · Architecture

bentopdf.yaml deploys two stateless NGINX containers from the bentopdf-simple image. Required anti-affinity and a disruption budget retain one serving replica during ordinary maintenance. The ingress chains traefik-authentik-forward-auth with bentopdf-headers; the latter sets COOP and COEP for browser isolation. There is no application database or file-upload PVC in this service.

Component boundaries

BentoPDF · component flow
  1. Protected origin
    • Browser → Traefik
    • Authentik forward-auth
  2. Static serving
    • 2 NGINX replicas
    • COOP / COEP response headers
  3. Client workspace
    • WebAssembly processing
    • Local files → downloaded PDF
Arrows show the main flow between responsibility groups. Parallel boxes are related components, not interchangeable replicas; the text below defines their individual failure and recovery behavior.

State and recovery contract

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.

Availability and failure behavior

Availability classification: HA static serving tier; access depends on the shared identity and ingress services.

This is an interpretation of the checked-in configuration, assuming the declared replicas are healthy, separated as intended, and their required dependencies are reachable. It is not a live-health result or a completed failure drill.

What supplies redundancy

Component Declared layout Mechanism
Frontend 2 stateless pods on separate nodes Ready Service endpoints serve interchangeable copies of frontend assets.
Update/eviction protection Zero surge; one unavailable; PDB minimum 1 Retains one serving replica during the intended rolling update or voluntary eviction.
PDF processing Inside each user’s browser No server database or shared processing volume to promote.
Access Authentik forward-auth and Traefik A separate dependency path must be reachable for protected access.

How a failure is handled

Once Kubernetes stops routing to the failed endpoint, fresh page and asset requests go to the other replica. A PDF operation already running in a loaded browser is not transferred between pods and may continue locally; subsequent asset fetches still need the site.

Failure scenarios

Failure Expected behavior and remaining dependency
One main worker The other serving replica can handle new requests. There is no persistent application volume attached to the lost node that must move before the static site returns.
RTX worker only No app-specific voter or backend is pinned to RTX. Whole-host API failure can still affect endpoint updates and replacement scheduling.
A second failure before recovery Outside the stated single-failure envelope; assess remaining data copies, quorum, endpoints, and capacity before further maintenance.

An RTX worker VM failure is not the same as an RTX Proxmox host failure. The latter also removes its control-plane VM and the configured API address. Read the physical failure-domain explanation before making a whole-host HA claim.

Upgrades and voluntary maintenance

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.

What prevents a stronger HA claim

This is not independent end-to-end HA while Authentik, ingress, DNS, and their dependencies can fail. Browser memory exhaustion and a missing optional CORS proxy are feature problems that extra server replicas do not fix.

What would improve the availability contract

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.

These are operational/design requirements, not changes made to the deployment by this documentation. The shared availability reference explains election, replication, durability, recovery time, and shared dependencies; the manifest links below identify this service’s source.

Configuration ownership

apps/bentopdf/ owns this service’s Kubernetes resources. Hostnames, addresses, versions, node names, and volume sizes belong in apps/variables.yaml. Runtime settings stored in a product database need that product’s backup and administration procedure.

Continue

Read the deployment guide for dependency order, initial credentials, and integration work. The official documentation explains the upstream product; the topology above describes this repository.