Μετάβαση στο κύριο περιεχόμενο

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, default libre-webui-work) με ένα Pod ανά ενεργό sandbox και PersistentVolumeClaim ανά workspace (work.workspaceSize, default 5Gi — πραγματικό 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. Δέχεται μόνο 016, ποτέ 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 είναι συνήθως απλούστερο.

Σχετική τεκμηρίωση