Kubernetes
Libre WebUI में helm/libre-webui पर Helm chart है।
Kubernetes पर Work
Work बिना Docker daemon, CLI या socket के native Kubernetes पर चलता है:
helm install libre-webui ./helm/libre-webui --set work.enabled=true
यह WORK_RUNTIME_BACKEND=kubernetes और बनाता है:
- dedicated sandbox namespace (
work.namespace, डिफ़ॉल्टlibre-webui-work) में हर running sandbox का Pod और कार्य वर्कस्पेस का PersistentVolumeClaim (work.workspaceSize, डिफ़ॉल्ट5Gi, real प्रति-task disk quota; named नीति अलग आकार दे सकती); - namespace-scoped भूमिका/RoleBinding जो बैकएंड ServiceAccount को केवल
pods(get/सूची/बनाएँ/हटाएँ),pods/exec(get/बनाएँ),persistentvolumeclaims(get/सूची/बनाएँ/हटाएँ) देता है — secrets/cluster दायरा नहीं। यह Docker socket बदलता और API सर्वर होस्ट पथ mount रोकता है; - NetworkPolicies जो डिफ़ॉल्ट-अस्वीकार, preview port पर केवल बैकएंड ingress, और नेटवर्क-सक्षम sandboxes को
work.networkPolicy.blockedEgressCidrsछोड़कर internet egress देता। निजी, CGNAT और metadata ranges डिफ़ॉल्ट blocked; Pod/सेवा CIDRs जाँचें। DNS केवलkube-system; node-स्थानीय DNS को carve-बाहर।
Sandboxes non-root, केवल-पढ़ने rootfs, सभी capabilities dropped, seccomp RuntimeDefault, नहीं ServiceAccount टोकन। फ़ाइलें, commands, Git, terminals API exec subresource; preview Pod IP से signed समान-origin proxy, इसलिए बैकएंड in-cluster। Host-फ़ोल्डर unsupported।
NetworkPolicy लागू करने वाला CNI (Calico, Cilium, recent kind, managed defaults) सत्यापित करें। WebUI Pod में node container-रनटाइम socket कभी mount न करें।
स्थापना
helm install libre-webui oci://ghcr.io/libre-webui/charts/libre-webui
डिफ़ॉल्ट chart स्थायी storage और bundled Ollama देता है। 0.14.1 transition verified multi-arch digest पर pin, बाद के charts matching appVersion इमेज। अलग इमेज चाहें तभी image.tag/image.digest; non-खाली tag transition digest से पहले।
solo, deliberate suspension के लिए replicaCount: 0, सामान्य के लिए replicaCount: 1; SQLite/स्थानीय फ़ाइलें/प्रक्रिया-स्थानीय coordination के कारण larger/HPA reject। Zero control संसाधन बनाता पर traffic नहीं।
कई replicas के लिए पूर्ण team: PostgreSQL/PGVector, S3 blob, Redis, बाहरी टिकाऊ worker; partial साझा/स्थानीय mix reject।
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, map में STORAGE_ENCRYPTION_ACTIVE_KEY_ID। secrets.jwtSecret सभी app/worker Pods में समान स्थिर high-entropy; chart बिना team reject। Managed PostgreSQL में verified TLS, databaseUrl में driver TLS params नहीं। Pool प्रति प्रक्रिया; कम से कम (replicaCount + worker.replicaCount) * POSTGRES_POOL_MAX plus 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 में न दें; एन्क्रिप्टेड मान workflow। मॉडल प्रदाता और Work Pods separately scale। work.enabled=true पर worker समान रनटाइम इमेज, StorageClass, work.env, Ollama एंडपॉइंट, timeouts, context लेता; embeddings, टिकाऊ chats, Work calls वहीं।
सक्रिय team कम से कम एक बाहरी worker; zero reject। पूर्ण suspension में replicaCount और worker.replicaCount zero। App zero और worker positive drain/recovery।
Team अपग्रेड और schema compatibility
Libre सटीक schema version चाहता है, mixed-version/zero-downtime DB upgrade नहीं। App/worker Recreate, लेकिन Kubernetes दोनों को एक सीमा नहीं समन्वित करता। नया ingress रोकें, jobs पूर्ण/cancel, दोनों पुराना Deployments zero, verified backup, सभी पुराना Pods terminated। फिर POSTGRES_MIGRATION_MODE=apply; one प्रक्रिया advisory leader lock, बाकी wait/validate समान ledger। Rollback में previous backup clean PostgreSQL/S3 पर restore; older binary unsupported schema पर नहीं। Planned outage अपेक्षित।
स्थानीय पहुँच
kubectl port-forward svc/libre-webui 8080:8080
http://localhost:8080 खोलें।
बाहरी 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
रहस्य
Production स्थिर JWT/एन्क्रिप्शन कुंजी। डिफ़ॉल्ट chart non-खाली secrets.* से <release>-libre-webui-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 रहस्य के लिए secrets.existingSecret; chart रहस्य नहीं बनाता:
secrets:
existingSecret: libre-webui-runtime
स्थापित से पहले बनाएँ। 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 पढ़ सकते हैं जब secrets.githubClientId/secrets.huggingfaceClientId non-खाली। Chart मान validate/copy नहीं; अनुपस्थित कुंजी Pod शुरू रोकता है।
ऑटोमेशन में secrets.existingSecret को external-secrets या एन्क्रिप्टेड Helm मानों के साथ उपयोग करें। --set प्रक्रिया निरीक्षण और रिलीज़ मेटाडेटा में दिख सकता है। प्रदाता क्रेडेंशियल chart विस्तार या प्रति-उपयोगकर्ता WebUI से दें।
अनुप्रयोग और Worker NetworkPolicies
networkPolicy.enabled=true ingress policies बनाता है:
networkPolicy:
enabled: true
App केवल HTTP port ingress, worker कोई नहीं। Egress restricted नहीं; PostgreSQL, Redis, S3, Ollama, tools, प्रदाता पहुँचने चाहिए। यह work.networkPolicy.enabled से अलग है; दोनों को enforcing CNI चाहिए।
स्थायित्व
Libre डेटा PVC और Ollama मॉडल PVC स्थायी रखें, डेटा volume और कुंजी साथ backup। Work workspaces sandbox namespace के अपने PVC में हैं; पूर्ण recovery DB और PVC साथ चाहता है।
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 बूलियन नहीं सटीक hop count। Safe डिफ़ॉल्ट 0 forwarded addresses ignore। One सीधा ingress proxy पर 1; longer chain में हर विश्वसनीय hop और सेवा chain के बाहर unreachable। Too small clients proxy address में समूह और login सीमाएँ exhaust; too large client-supplied address trust। Chart केवल 0–16, unbounded true नहीं, केवल HTTP app Pods को।
Chart BASE_URL या OAuth callback मान expose नहीं करता; extend/patch Deployment और callbacks सार्वजनिक domain से सटीक match।
संसाधन योजना
Cluster Ollama Pod को पर्याप्त memory/GPU nodes पर schedule करें। Dedicated Ollama/inference सेवा हो तो बाहरी सरल।