Skip to main content

Architecture

The Annolive Helm chart deploys the same on-premise microservices as Docker Compose, orchestrated on Kubernetes. It is designed for single-node clusters (k3s, microk8s) and larger production clusters.

Deployment architecture​

Current chart layout: the frontend Service is exposed directly for the UI, and nginx is the API gateway (proxies to backend, serves /static/ and /media/). Backend, worker, model-server, PostgreSQL, and RabbitMQ stay ClusterIP-only inside the cluster.

note

NodePort and Ingress share the same in-cluster path: UI → frontend Service → frontend Deployment; API → nginx Service → nginx Deployment → backend Service → backend Deployment. The worker has a Deployment only (no Service) — it consumes RabbitMQ. Under Ingress, frontend/nginx Services are usually ClusterIP.

User interaction​

Users reach Annolive through one of two access modes:

ModeUIAPI
NodePorthttp://<node-ip>:30558http://<node-ip>:30559
Ingresshttp(s)://app.example.comhttp(s)://api.example.com

externalUrls.frontendUrl and externalUrls.backendUrl in Helm values must match exactly what users open in the browser (scheme, host, and port). Mismatches cause CORS, CSRF, or DisallowedHost errors.

Kubernetes resources​

ComponentKindRole
backendDeploymentDjango REST API (Gunicorn on port 8000)
frontendDeploymentNext.js UI (port 3000)
nginxDeploymentAPI gateway; proxies to backend, serves static/media
workerDeploymentCelery worker
model-serverDeploymentAI model inference
postgresStatefulSetPostgreSQL 16
rabbitmqStatefulSetCelery message broker
setup JobJobFresh install only: runs setup.py (seed domain + admin)
init JobJobUpgrades: runs init.py (collectstatic + migrate)

Storage (PVCs)​

All persistent data uses PersistentVolumeClaims (no hostPath). Default sizes come from values.yaml in the Helm package:

PVCPurposeDefault size
<release>-dataMedia, static100 Gi
<release>-postgres-postgres-data-0PostgreSQL10 Gi
<release>-rabbitmq-rabbitmq-data-0RabbitMQ2 Gi

Set persistence.storageClass if your cluster has no default provisioner (for example k3s local-path). To override sizes at install or grow volumes later, see Installation — Storage.

Bootstrap jobs​

  • setup Job (setupJob.enabled: true): runs once on first install. Creates the organisation domain and platform admin. Do not re-run on upgrades.
  • init Job (initJob.enabled: true): runs on every Helm upgrade. Applies collectstatic and migrations only.

See Installation for configuration details.