Kubernetes
Chart находится в helm/libre-webui.
Work
Нативно, без Docker daemon/CLI/socket:
helm install libre-webui ./helm/libre-webui --set work.enabled=true
WORK_RUNTIME_BACKEND=kubernetes; namespace work.namespace (по умолчанию libre-webui-work), Pod на sandbox и PVC на задачу (work.workspaceSize 5Gi, реальная квота); Role только для pods, pods/exec, persistentvolumeclaims; NetworkPolicies запрещают всё по умолчанию, разрешают предпросмотр от backend и egress кроме work.networkPolicy.blockedEgressCidrs. DNS — к kube-system.
Без root, read-only rootfs, удалённые capabilities, seccomp RuntimeDefault, без токена. Exec через API, предпросмотр по IP Pod, backend в кластере. Папки хоста не поддерживаются. CNI должен применять NetworkPolicy; не монтируйте socket узла.
Установка
helm install libre-webui oci://ghcr.io/libre-webui/charts/libre-webui
По умолчанию развёртываются хранилище и Ollama. Версия 0.14.1 закреплена проверенным digest; затем используется appVersion. image.tag имеет приоритет, собственный digest задаётся через image.digest.
solo: replicaCount: 0 или replicaCount: 1, без больших значений и 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, карта содержит STORAGE_ENCRYPTION_ACTIVE_KEY_ID, а secrets.jwtSecret общий. Используйте TLS PostgreSQL без параметров driver в databaseUrl; минимум (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
Не коммитьте секреты и не передавайте их через --set. work.enabled=true передаёт worker те же image, StorageClass, work.env, Ollama и тайм-ауты. Положительный replicaCount требует worker; для полной паузы установите replicaCount и worker.replicaCount в ноль.
Обновления team
Deployment используют Recreate. Полная пауза ставит приложение в 0 и worker в 0; обычный solo использует 1. TRUST_PROXY принимает значения до 16.
Требуется точная schema, без mixed/zero-downtime. Остановите ingress и задачи, уменьшите оба Deployment до нуля, сделайте backup, затем используйте POSTGRES_MIGRATION_MODE=apply с advisory lock. Rollback выполняется в чистые PostgreSQL/S3; перерыв запланирован.
Локальный доступ
kubectl port-forward svc/libre-webui 8080: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
Секреты
По умолчанию создаётся <release>-libre-webui-secrets из 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 указывает существующий Secret; задайте secrets.existingSecret стабильно. Требуются 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 читают *-client-id, *-client-secret при secrets.githubClientId/secrets.huggingfaceClientId.
Используйте external-secrets или зашифрованные values.
NetworkPolicies
networkPolicy.enabled=true:
networkPolicy:
enabled: true
Приложение принимает только HTTP ingress, worker не принимает. Egress необходим. Это отдельно от work.networkPolicy.enabled; требуется CNI.
Постоянное хранение
PVC данных и Ollama должны быть постоянными; PVC Work находятся отдельно и резервируются вместе с базой.
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 0–16, не true. Chart не предоставляет BASE_URL/OAuth callback; расширьте его.
Ресурсы
Pod Ollama требует RAM/GPU; внешний сервис может быть проще.