Kubernetes
Το Libre WebUI παρέχει Helm chart στο helm/libre-webui.
Work σε Kubernetes
Το Work εκτελείται εγγενώς σε Kubernetes — χωρίς Docker daemon, CLI ή socket. Ενεργοποιήστε το κατά την εγκατάσταση:
helm install libre-webui ./helm/libre-webui --set work.enabled=true
Αυτό ορίζει WORK_RUNTIME_BACKEND=kubernetes και δημιουργεί:
- dedicated sandbox namespace (
work.namespace, defaultlibre-webui-work) με ένα Pod ανά ενεργό sandbox και PersistentVolumeClaim ανά workspace (work.workspaceSize, default5Gi— πραγματικό disk quota ανά εργασία· named policy μπορεί άλλο μέγεθος)· - Role/RoleBinding περιορισμένα στο namespace που δίνουν στο ServiceAccount ακριβώς
pods(get/list/create/delete),pods/exec(get/create) καιpersistentvolumeclaims(get/list/create/delete) — χωρίς secrets ή cluster scope. Αντικαθιστούν πλήρως το Docker socket: ο API server επιβάλλει ότι sandbox δεν mountάρει host paths· - NetworkPolicies με default-deny, ingress μόνο από backend στο preview port και internet
egress για network-enabled sandboxes εκτός
work.networkPolicy.blockedEgressCidrs(private ranges, CGNAT ranges managed clusters και cloud-metadata link-local από default· επαληθεύστε pod/service CIDRs). DNS μόνο προςkube-system· node-local DNS χρειάζεται εξαίρεση.
Τα sandboxes τρέχουν non-root, read-only rootfs, χωρίς capabilities, seccomp
RuntimeDefault και χωρίς ServiceAccount token. Αρχεία, commands, git και terminal
χρησιμοποιούν exec μέσω API server. Preview σερβίρεται από Pod IP μέσω signed same-origin
proxy και απαιτεί in-cluster backend. Host-folder workspaces δεν υποστηρίζονται.
Δύο σημειώσεις: το NetworkPolicy απαιτεί CNI που το επιβάλλει (Calico, Cilium, πρόσφατο kind και περισσότερα managed defaults). Επαληθεύστε πριν θεωρήσετε την απομόνωση ενεργή· το CI αναφέρει enforcement. Ποτέ μην mountάρετε node container-runtime socket στο WebUI Pod.
Εγκατάσταση
helm install libre-webui oci://ghcr.io/libre-webui/charts/libre-webui
Το default chart αναπτύσσει Libre με persistent storage και bundled Ollama. Η μετάβαση
0.14.1 είναι pinned σε verified multi-architecture digest· επόμενα charts χρησιμοποιούν
matching semantic appVersion. Ορίστε image.tag ή image.digest μόνο σκόπιμα.
Non-empty image.tag υπερισχύει του transition digest.
Το solo δέχεται replicaCount: 0 για σκόπιμη αναστολή ή replicaCount: 1 για κανονική
λειτουργία. Απορρίπτει μεγαλύτερες τιμές και HorizontalPodAutoscaler, επειδή SQLite,
local files και process-local coordination δεν είναι ασφαλή με πολλά pods. Με zero
replicas δημιουργούνται control-plane resources αλλά δεν σερβίρεται traffic.
Για πολλές replicas χρησιμοποιήστε πλήρες team: PostgreSQL/PGVector, S3-compatible
blob, Redis και separate durable worker. Το chart αρνείται μερικό μείγμα shared/local.
Ξεκινήστε από protected values:
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 πρέπει να ταιριάζει ακριβώς την εγγραφή legacy και ο χάρτης
να περιέχει STORAGE_ENCRYPTION_ACTIVE_KEY_ID. Το secrets.jwtSecret πρέπει να είναι
μία σταθερή high-entropy τιμή κοινή σε κάθε app/worker pod· χωρίς αυτή το chart αρνείται
team mode ώστε sessions να μη βασίζονται σε pod-local υλικό. Κρατήστε verified TLS για
managed PostgreSQL και μην προσθέτετε driver TLS params στο databaseUrl. Τα pool limits
ισχύουν ανά pod, άρα δεσμεύστε τουλάχιστον
(replicaCount + worker.replicaCount) * POSTGRES_POOL_MAX συν headroom. Εγκατάσταση:
helm upgrade --install libre-webui \
oci://ghcr.io/libre-webui/charts/libre-webui \
--values /absolute/path/to/libre-team-values.yaml
Μην commitάρετε το αρχείο ούτε περνάτε production secrets με --set. Φυλάξτε το σε
encrypted-values workflow. Κλιμακώστε providers και Work Pods ανεξάρτητα. Με
work.enabled=true, ο external worker παίρνει ίδιο runtime image, StorageClass και
work.env limits με app pods, καθώς και Ollama endpoint, timeouts και max adopted
context, επειδή embeddings, durable chats και Work calls εκτελούνται εκεί.
Ενεργή team app (positive replicaCount ή autoscaling) απαιτεί τουλάχιστον έναν worker
και το chart αρνείται zero-worker. Για πλήρη αναστολή ορίστε και replicaCount και
worker.replicaCount μηδέν. Μόνο app count μηδέν είναι σκόπιμο worker-only drain/recovery:
χωρίς web traffic αλλά επεξεργασία queued work.
Αναβαθμίσεις team και συμβατότητα schema
Το Libre απαιτεί exact schema version, όχι mixed version ή zero-downtime DB upgrade.
App και external worker χρησιμοποιούν Recreate, εμποδίζοντας overlap εντός κάθε
Deployment, αλλά Kubernetes δεν συντονίζει τα δύο μαζί. Πριν upgrade: σταματήστε ingress,
ολοκληρώστε/ακυρώστε jobs, scale και τα δύο παλιά Deployments σε zero, πάρτε verified
team backup και επιβεβαιώστε termination όλων. Έπειτα upgrade με
POSTGRES_MIGRATION_MODE=apply: μία νέα διεργασία κρατά advisory leader lock ενώ άλλες
περιμένουν και επικυρώνουν ίδιο ledger. Για rollback, επαναφέρετε verified backup σε
καθαρό PostgreSQL/S3. Ποτέ παλιό binary σε μη ακριβώς supported schema. Αναμένεται διακοπή.
Τοπική πρόσβαση
kubectl port-forward svc/libre-webui 8080:8080
Open http://localhost:8080.
Εξωτερικό Ollama
Χρησιμοποιήστε υπάρχον endpoint 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
Secrets
Ορίστε σταθερό JWT secret και encryption key. Default, το chart δημιουργεί
<release>-libre-webui-secrets από non-empty 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)"
Για operator-managed Secret ορίστε secrets.existingSecret. Τότε δεν δημιουργείται
Secret και app/worker αναφέρονται στο named object:
secrets:
existingSecret: libre-webui-runtime
Δημιουργήστε το πριν release. Απαιτεί jwt-secret, encryption-key, και σε team
database-url, redis-url, storage-encryption-keys. Προαιρετικά
session-secret, s3-access-key-id, s3-secret-access-key, s3-session-token.
GitHub/Hugging Face OAuth διαβάζουν *-client-id/*-client-secret όταν non-empty
secrets.githubClientId ή secrets.huggingfaceClientId ενεργοποιεί integration. Το
chart σκόπιμα δεν επικυρώνει/αντιγράφει values· missing required key εμποδίζει start.
Για automation προτιμήστε secrets.existingSecret με external-secrets controller ή
encrypted Helm values. --set μπορεί να φανεί σε process inspection και Helm metadata.
Provider credentials μέσω σκόπιμου chart extension ή ανά χρήστη στο WebUI.
NetworkPolicies εφαρμογής και worker
Ορίστε networkPolicy.enabled=true για ingress policies εφαρμογής και, σε team, worker:
networkPolicy:
enabled: true
Η εφαρμογή δέχεται ingress μόνο στο HTTP port. Ο worker κανένα. Δεν περιορίζουν egress: app/worker πρέπει να φτάνουν PostgreSQL, Redis, S3, Ollama, tools και model providers, των οποίων τη θέση αποφασίζουν operators.
Είναι ξεχωριστό από work.networkPolicy.enabled, που ελέγχει default-deny στο sandbox
namespace και ενεργοποιείται default με Work. Και τα δύο απαιτούν CNI enforcement· το
rendering αντικειμένων μόνο δεν αποδεικνύει isolation.
Μόνιμη αποθήκευση
Κρατήστε data PVC και Ollama model PVC σε persistent storage. Backup data volume και encryption key μαζί.
Work workspaces βρίσκονται σε δικά τους PVCs στο sandbox namespace, όχι data PVC. Πλήρης recovery χρειάζεται βάση (ownership, names, runs) και PVCs· backup μαζί.
Ingress
Για public access ρυθμίστε HTTPS ingress και ακριβές browser origin:
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 είναι exact hop count, όχι boolean. Safe default 0 αγνοεί forwarded
addresses. 1 μόνο με ένα ingress proxy απευθείας. Μετρήστε κάθε trusted load balancer
σε fixed chain και κρατήστε Service unreachable γύρω της. Πολύ μικρό count ομαδοποιεί
clients και εξαντλεί shared login limits· πολύ μεγάλο εμπιστεύεται client-supplied IP.
Δέχεται μόνο 0–16, ποτέ true, και στέλνεται μόνο HTTP app pods.
Το chart δεν εκθέτει BASE_URL ή OAuth callbacks. OAuth installations πρέπει να
επεκτείνουν chart ή patch Deployment και callbacks να ταιριάζουν public domain.
Σχεδιασμός πόρων
Για τοπικό Ollama στο cluster, προγραμματίστε Pod σε nodes με αρκετή μνήμη/GPU. Αν υπάρχει dedicated Ollama/inference, external Ollama είναι συνήθως απλούστερο.