Hoppa till huvudinnehåll

Kubernetes

Libre WebUI levereras med ett Helm-diagram i helm/libre-webui.

Work på Kubernetes

Work körs direkt på Kubernetes utan Docker-daemon, CLI eller socket. Aktivera det vid installationen:

helm install libre-webui ./helm/libre-webui --set work.enabled=true

Det växlar backend till WORK_RUNTIME_BACKEND=kubernetes och skapar:

  • ett särskilt sandlådenamespace (work.namespace, standard libre-webui-work) med en Pod per körande sandlåda och en PersistentVolumeClaim per uppgiftsarbetsyta (work.workspaceSize, standard 5Gi, en verklig diskkvot per uppgift; en namngiven Work-policy kan ange annan storlek);
  • en namespaceavgränsad Role och RoleBinding som ger backendens ServiceAccount exakt pods (get/list/create/delete), pods/exec (get/create) och persistentvolumeclaims (get/list/create/delete) i namespace—inga secrets eller klusteromfång. Behörigheten ersätter Docker-socketen helt: API-servern, inte programmet, upprätthåller att sandlådespecifikationen inte kan montera värdsökvägar;
  • NetworkPolicy som nekar all sandlådetrafik som standard, tillåter ingress endast från backend på förhandsvisningsporten och ger nätverksaktiverade sandlådor egress till Internet förutom work.networkPolicy.blockedEgressCidrs (privata intervall, CGNAT-intervallet som vissa hanterade kluster använder för pod- och tjänst-CIDR samt molnmetadataområdet som standard—verifiera att klustrets CIDR omfattas). Sandlådans DNS tillåts endast till kube-system; kluster med nodlokal DNS behöver ett eget undantag.

Sandlådor kör som icke-root med skrivskyddat rotfilsystem, alla capabilities borttagna, seccomp RuntimeDefault och utan ServiceAccount-token. Filer, kommandon, git och interaktiva terminaler använder exec-underresursen genom API-servern. Förhandsvisning serveras från sandlådans Pod-IP genom den signerade same-origin-proxyn, vilket kräver backend i klustret. Arbetsytor med värdmappar stöds inte.

Två operatörsanmärkningar: NetworkPolicy kräver en CNI som implementerar det (Calico, Cilium, nyare kind-utgåvor och de flesta hanterade kluster gör det). Verifiera innan sandlådeisoleringen betraktas som aktiv; CI:s end-to-end-svit rapporterar om klustret upprätthåller den. Montera aldrig en nods containerruntime-socket i WebUI-poden; Kubernetes-backend finns för att göra det onödigt.

Installera

helm install libre-webui oci://ghcr.io/libre-webui/charts/libre-webui

Standarddiagrammet driftsätter Libre WebUI med beständig lagring och medföljande Ollama. Övergången 0.14.1 är fäst vid verifierad multiarkitektur-image-digest; senare diagram använder matchande semantisk appVersion-image. Ange image.tag eller image.digest endast när en annan image avsiktligt önskas. En icke-tom image.tag har företräde.

Standardprofilen solo accepterar replicaCount: 0 för avsiktligt uppehåll eller replicaCount: 1 för normal drift. Större värden och HorizontalPodAutoscaler avvisas eftersom SQLite, lokala filer och processlokal samordning inte är säkra bakom flera poddar. En utgåva med noll repliker etablerar styrplansresurser men serverar ingen Libre WebUI-trafik.

Konfigurera den fullständiga profilen team för flera repliker. Den använder PostgreSQL/PGVector, S3-kompatibelt blobblager, Redis och separat beständig worker; diagrammet nekar en ofullständig blandning av delade och lokala backend. Börja med en skyddad values-fil:

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 måste exakt matcha posten legacy och nyckelkartan måste även innehålla STORAGE_ENCRYPTION_ACTIVE_KEY_ID. secrets.jwtSecret måste vara ett stabilt värde med hög entropi som delas av alla program- och worker-poddar; diagrammet nekar teamläget utan det så sessioner aldrig beror på poddlokalt material. Behåll verifierad TLS för hanterad PostgreSQL och lägg inte till drivrutinsparametrar i databaseUrl. Poolgränser gäller varje process, så reservera minst (replicaCount + worker.replicaCount) * POSTGRES_POOL_MAX anslutningar plus marginal. Installera med den skyddade values-filen:

helm upgrade --install libre-webui \
oci://ghcr.io/libre-webui/charts/libre-webui \
--values /absolute/path/to/libre-team-values.yaml

Committa inte filen och skicka inte produktionshemligheter genom --set. Lagra den i ett skyddat flöde för krypterade values. Skala modellleverantörer och Work-sandlådepoddar oberoende. Med work.enabled=true får extern team-worker samma runtime-image, StorageClass och work.env-gränser som programpoddarna, samt samma lösta Ollama-endpoint, tidsgränser och automatiskt antagna maximala kontext eftersom leverantörsanrop körs där. Ett aktivt teamprogram kräver minst en extern worker och diagrammet nekar noll workers. Sätt både replicaCount och worker.replicaCount till noll för full paus. Endast programantal noll är ett avsiktligt worker-exklusivt dränerings-/återställningsläge utan webbtrafik men med fortsatt köbearbetning.

Teamuppgraderingar och schemakompatibilitet

Libre kräver exakt schemaversion, inte blandade versioner eller databasuppgraderingar utan avbrott. Program- och worker-Deployment använder Recreate, vilket förhindrar överlappning inom varje Deployment, men Kubernetes samordnar inte dem som en gräns. Stoppa ny ingress före uppgradering, slutför eller avbryt aktiva beständiga och Work-jobb, skala båda gamla Deployment till noll, ta en verifierad teamsäkerhetskopia och bekräfta att alla gamla poddar avslutats. Uppgradera därefter med POSTGRES_MIGRATION_MODE=apply; en ny process håller PostgreSQLs rådgivande ledarlås medan övriga väntar och validerar samma migreringsreskontra. Återställ föregående verifierade säkerhetskopia till rena PostgreSQL-/S3-mål vid rollback; rikta aldrig en äldre binär mot ett schema som den inte exakt stöder. Ett avsiktligt tjänsteavbrott förväntas.

Lokal åtkomst

kubectl port-forward svc/libre-webui 8080:8080

Öppna http://localhost:8080.

Extern Ollama

Använd en befintlig Ollama-endpoint:

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

Hemligheter

Ange en stabil JWT-hemlighet och krypteringsnyckel för produktion. Diagrammet skapar som standard <release>-libre-webui-secrets från icke-tomma secrets.*-värden:

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)"

Ange secrets.existingSecret för en operatörshanterad Secret. Diagrammet renderar då ingen Secret och både program- och worker-poddar refererar det namngivna objektet:

secrets:
existingSecret: libre-webui-runtime

Skapa Secret före installation. Den måste innehålla jwt-secret och encryption-key; teamläge kräver även database-url, redis-url och storage-encryption-keys. Valfria nycklar är session-secret, s3-access-key-id, s3-secret-access-key och s3-session-token. GitHub och Hugging Face OAuth kan läsa sina *-client-id-/*-client-secret-par från namngiven Secret när motsvarande icke-tomma secrets.githubClientId eller secrets.huggingfaceClientId aktiverar integrationen. Diagrammet validerar eller kopierar avsiktligt inte värdena; en saknad obligatorisk nyckel hindrar Pod-start.

Föredra secrets.existingSecret med en external-secrets-controller för produktionsautomatisering eller tillhandahåll stabila värden genom ett krypterat Helm-values-flöde. Kommandoradsvärden med --set kan exponeras genom processinspektion och behålls i Helm-metadata. Lägg till leverantörsuppgifter genom en avsiktlig diagramexpansion eller konfigurera per användare i WebUI.

NetworkPolicy för program och worker

Ange networkPolicy.enabled=true för att rendera ingresspolicyer för programmet och, i teamläge, den externa beständiga workern:

networkPolicy:
enabled: true

Programmet accepterar ingress endast på sin HTTP-containerport. Workern accepterar ingen ingress. Policyerna begränsar inte egress: processerna måste fortfarande nå konfigurerade PostgreSQL-, Redis-, S3-, Ollama-, verktygs- och modellleverantörsendpoints och operatören bestämmer var tjänsterna finns.

Inställningen är separat från work.networkPolicy.enabled, som styr standardnekande policyer i Work-sandlådans namespace och aktiveras som standard med Work. Båda kräver en CNI som faktiskt upprätthåller Kubernetes NetworkPolicy; enbart renderade objekt bevisar inte nätverksisolering.

Beständighet

Behåll Libre WebUI:s data-PVC och Ollamas modell-PVC på beständig lagring. Säkerhetskopiera datavolymen och krypteringsnyckeln tillsammans.

Work-arbetsytor finns i egna PVC:er i sandlådenamespacet, inte Libre WebUI:s data-PVC. Fullständig Work-återställning kräver databasen (uppgiftsägarskap, resursnamn, körningar) och PVC:erna; säkerhetskopiera dem tillsammans enligt samma policy.

Ingress

Konfigurera ingress med HTTPS och ange exakt webbläsar-origin genom diagrammet för offentlig åtkomst:

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 är ett exakt hoppantal, inte boolean. Säker standard är 0, vilket ignorerar vidarebefordrade klientadresser. Använd 1 endast när en ingressproxy ansluter direkt; räkna alla betrodda lastbalanserare och proxysteg i en längre fast kedja och håll tjänsten onåbar utanför kedjan. För lågt antal grupperar klienter under proxyadressen och kan förbruka gemensamma inloggningsgränser; för högt kan lita på en klientangiven adress. Diagrammet accepterar endast 016, aldrig obegränsat true, och skickar värdet endast till HTTP-programpoddar.

Det aktuella diagrammet exponerar inte BASE_URL eller OAuth-callback-URL-värden. Driftsättningar med OAuth måste utöka diagrammet eller patcha Deployment för att ange variablerna, och callback-URL:erna måste matcha den offentliga domänen.

Resursplanering

Schemalägg den lokala Ollama-poden på noder med tillräckligt minne och GPU-kapacitet för modellerna. Om klustret redan har en särskild Ollama- eller inferenstjänst är extern Ollama vanligen enklare.

Relaterad dokumentation