Kubernetes
Het Helm-chart staat in helm/libre-webui.
Work op Kubernetes
Native, zonder Dockerdaemon, CLI of socket:
helm install libre-webui ./helm/libre-webui --set work.enabled=true
Stelt WORK_RUNTIME_BACKEND=kubernetes in en maakt:
- namespace
work.namespace(standaardlibre-webui-work) met Pod per actieve sandbox en PVC per taak (work.workspaceSize, standaard5Gi, echte quota; policy kan andere grootte kiezen); - Role/RoleBinding met alleen
pods(get/list/create/delete),pods/exec(get/create),persistentvolumeclaims(get/list/create/delete), geen secrets/clusterrechten. API-server verhindert hostmounts; - NetworkPolicies die standaard alles weigeren, alleen backendpreview toestaan en uitgaand internet geven behalve
work.networkPolicy.blockedEgressCidrs(privé, CGNAT en metadata; verifieer CIDRs). DNS alleen naarkube-system; node-local DNS vereist uitzondering.
Niet-root, read-only rootfs, alle capabilities weg, seccomp RuntimeDefault, geen ServiceAccount-token. Bestanden, commando's, git en terminals via exec; preview via Pod-IP en ondertekende proxy, backend in cluster. Hostmappen niet ondersteund.
NetworkPolicy vereist CNI zoals Calico/Cilium. Verifieer handhaving. Monteer nooit nodesocket.
Installatie
helm install libre-webui oci://ghcr.io/libre-webui/charts/libre-webui
Standaard persistente opslag en Ollama. Overgang 0.14.1 is op geverifieerde multiarchdigest vastgezet; latere charts gebruiken appVersion. Stel image.tag/image.digest alleen bewust in; tag wint.
solo accepteert replicaCount: 0 of replicaCount: 1; groter en HPA worden geweigerd wegens SQLite/lokale toestand.
Voor meerdere replica's gebruik compleet team met PostgreSQL/PGVector, S3, Redis en worker:
replicaCount: 3
env:
LIBRE_PLATFORM_MODE: team
DATABASE_BACKEND: postgres
DATABASE_SSL_MODE: verify-full
POSTGRES_MIGRATION_MODE: apply
POSTGRES_POOL_MAX: 10
POSTGRES_CONNECT_TIMEOUT_MS: 5000
POSTGRES_IDLE_TIMEOUT_MS: 30000
POSTGRES_STATEMENT_TIMEOUT_MS: 30000
POSTGRES_MIGRATION_LOCK_TIMEOUT_MS: 60000
OLLAMA_TIMEOUT: 300000
OLLAMA_LONG_OPERATION_TIMEOUT: 900000
OLLAMA_MAX_CONTEXT: 32768
BLOB_STORE_BACKEND: s3
VECTOR_STORE_BACKEND: pgvector
COORDINATION_BACKEND: redis
JOB_WORKER_MODE: external
STORAGE_ENCRYPTION_ACTIVE_KEY_ID: active
S3_BUCKET: libre-blobs
S3_REGION: us-east-1
S3_BLOB_PREFIX: libre/blobs
worker:
replicaCount: 1
secrets:
databaseUrl: postgresql://libre:replace-me@postgres.example/libre
redisUrl: rediss://redis.example:6379/0
jwtSecret: '<one-stable-high-entropy-secret-for-every-replica>'
encryptionKey: '<legacy-64-character-lowercase-hex-key>'
storageEncryptionKeys: '{"legacy":"<legacy-64-character-lowercase-hex-key>","active":"<active-64-character-lowercase-hex-key>"}'
s3AccessKeyId: replace-me
s3SecretAccessKey: replace-me
secrets.encryptionKey moet gelijk zijn aan legacy, kaart bevat STORAGE_ENCRYPTION_ACTIVE_KEY_ID, secrets.jwtSecret stabiel en gedeeld. Houd PostgreSQL TLS geverifieerd en voeg geen driverparameters aan databaseUrl toe. Reserveer (replicaCount + worker.replicaCount) * POSTGRES_POOL_MAX verbindingen plus marge.
helm upgrade --install libre-webui \
oci://ghcr.io/libre-webui/charts/libre-webui \
--values /absolute/path/to/libre-team-values.yaml
Commit het bestand niet en gebruik geen productiegeheimen via --set. Met work.enabled=true krijgt worker dezelfde image, StorageClass, work.env, Ollama en timeouts. Positieve replicaCount vereist worker; zet replicaCount en worker.replicaCount op nul voor volledige pauze. Alleen app nul is worker-only drain.
Team-upgrades en schema
Exact schema, geen mixed of zero-downtime. App/worker gebruiken Recreate, maar Kubernetes coördineert niet samen. Stop ingang, rond werk af, schaal beide nul, maak geverifieerde back-up, controleer beëindiging; upgrade dan met POSTGRES_MIGRATION_MODE=apply. Eén proces houdt advisory lock. Rollback herstelt naar schone PostgreSQL/S3; verwacht onderbreking.
Lokale toegang
kubectl port-forward svc/libre-webui 8080:8080
Open http://localhost:8080.
Externe Ollama
helm install libre-webui oci://ghcr.io/libre-webui/charts/libre-webui \
--set ollama.bundled.enabled=false \
--set ollama.external.enabled=true \
--set ollama.external.url=http://my-ollama:11434
Geheimen
Standaard maakt het chart <release>-libre-webui-secrets uit niet-lege secrets.*:
helm upgrade --install libre-webui \
oci://ghcr.io/libre-webui/charts/libre-webui \
--set-string secrets.jwtSecret="$(openssl rand -hex 64)" \
--set-string secrets.encryptionKey="$(openssl rand -hex 32)"
secrets:
existingSecret: libre-webui-runtime
Met secrets.existingSecret gebruikt het chart een bestaand Secret; stel secrets.existingSecret stabiel in. Maak vooraf met jwt-secret, encryption-key; team ook database-url, redis-url, storage-encryption-keys. Optioneel session-secret, s3-access-key-id, s3-secret-access-key, s3-session-token. GitHub/Hugging Face lezen *-client-id en *-client-secret bij secrets.githubClientId of secrets.huggingfaceClientId. Ontbrekende sleutel verhindert start.
Gebruik external-secrets of versleutelde values; --set kan zichtbaar en bewaard zijn.
NetworkPolicies
Stel networkPolicy.enabled=true in:
networkPolicy:
enabled: true
App accepteert alleen HTTP-poort, worker geen ingang. Uitgang blijft nodig. Dit staat los van work.networkPolicy.enabled; beide vereisen CNI.
Persistentie
Houd data- en Ollama-PVC persistent; back-up met sleutel. Work-PVCs zijn apart en vereisen database + PVCs samen.
Ingress
helm upgrade libre-webui \
oci://ghcr.io/libre-webui/charts/libre-webui \
--reuse-values \
--set env.TRUST_PROXY=1 \
--set-string env.CORS_ORIGIN=https://your-domain.example
TRUST_PROXY is exact hopgetal. Standaard 0; gebruik juiste 1–16, nooit true. Verkeerd aantal groepeert clients of vertrouwt clientinput.
Chart stelt BASE_URL/OAuth-callback niet bloot; breid uit met exacte publieke domein.
Resources
Plan Ollama-Pod op voldoende geheugen/GPU. Bestaande inferentieservice is vaak eenvoudiger extern.