Przejdź do głównej zawartości

Kubernetes

Chart w helm/libre-webui.

Work

Natywnie, bez Docker daemon/CLI/socket:

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

WORK_RUNTIME_BACKEND=kubernetes; namespace work.namespace (domyślnie libre-webui-work), Pod na sandbox i PVC na zadanie (work.workspaceSize 5Gi, prawdziwa quota); Role tylko pods, pods/exec, persistentvolumeclaims; NetworkPolicies deny-all, preview od backendu i egress poza work.networkPolicy.blockedEgressCidrs. DNS do kube-system.

Non-root, read-only rootfs, capabilities drop, seccomp RuntimeDefault, bez tokenu. Exec przez API, preview po Pod IP, backend w klastrze. Brak folderów hosta. CNI musi egzekwować NetworkPolicy; nie montuj socketu node.

Instalacja

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

Domyślnie storage i Ollama. 0.14.1 na zweryfikowanym digest; później appVersion. image.tag wygrywa, a własny digest ustawia image.digest.

solo: replicaCount: 0 lub replicaCount: 1, bez większych/HPA. team: PostgreSQL/PGVector, S3, Redis, 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 = legacy, mapa zawiera STORAGE_ENCRYPTION_ACTIVE_KEY_ID, secrets.jwtSecret wspólny. TLS PostgreSQL, bez parametrów drivera w databaseUrl; minimum (replicaCount + worker.replicaCount) * POSTGRES_POOL_MAX.

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

Nie commituj sekretów ani --set. work.enabled=true przekazuje workerowi ten sam image, StorageClass, work.env, Ollama i timeouty. Dodatni replicaCount wymaga workera; ustaw replicaCount i worker.replicaCount zero na pełną pauzę.

Aktualizacje team

Deploymenty używają Recreate. Pełna pauza ustawia aplikację na 0 i workera na 0; normalny solo używa 1. TRUST_PROXY przyjmuje wartości do 16.

Dokładny schema, nie mixed/zero-downtime. Zatrzymaj ingress, zadania, skaluj oba do zera, backup, potem POSTGRES_MIGRATION_MODE=apply z advisory lock. Rollback do czystych PostgreSQL/S3, przerwa planowana.

Lokalnie

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

http://localhost:8080

Zewnętrzna 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

Sekrety

Domyślnie <release>-libre-webui-secrets z 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

secrets.existingSecret wskazuje istniejący Secret; ustaw secrets.existingSecret stabilnie. Wymaga jwt-secret, encryption-key; team także database-url, redis-url, storage-encryption-keys. Opcjonalne session-secret, s3-access-key-id, s3-secret-access-key, s3-session-token. GitHub/Hugging Face czyta *-client-id, *-client-secret przy secrets.githubClientId/secrets.huggingfaceClientId.

Użyj external-secrets lub szyfrowanych values.

NetworkPolicies

networkPolicy.enabled=true:

networkPolicy:
enabled: true

App tylko HTTP ingress, worker brak. Egress potrzebny. Oddzielne od work.networkPolicy.enabled; CNI wymagany.

Trwałość

PVC danych i Ollama trwałe; Work PVC osobno i backup z bazą.

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 to dokładne hop 0–16, nie true. Chart nie wystawia BASE_URL/OAuth callback, rozszerz.

Zasoby

Ollama Pod potrzebuje RAM/GPU; zewnętrzna usługa może być prostsza.

Powiązane