feat(open-webui): инстанс Open WebUI для человека + Cluster/postgres в его ns #79
Loading…
Reference in a new issue
No description provided.
Delete branch "refs/pull/79/head"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Инстанс Open WebUI на человека: UI к Hermes API, одна модель (
hermes-agent), вход только через Zitadel, база — свой Postgres человека.ns grachevko
postgres—Cluster/postgres(CNPG 1.30). В инфстансе живут базы всех личных приложений человека: каждое приложение объявляет свою базу и роль объектамиDatabase/DatabaseRole, отдельный Cluster на приложение не заводится.instances: 1(репликация — про доступность, не про сохранность), 10Giproxmox-ssd. Bootstrap создаёт только паруapp/app— конвенция оператора 1.30, обойти нечем (cloudnative-pg#3242); приложения на неё не опираются.open-webui— официальный чарт по OCI (oci://ghcr.io/open-webui/helm-charts/open-webui, тег16.5.0= appVersion0.11.3, сверен живым манифестом ghcr). Образ по digest'уv0.11.3@sha256:41daa0cf….ollama/pipelines/tika/terminalsвыключены,websocket.manager: ""+websocket.redis.enabled: false(свой Redis однорепличному инстансу не нужен);strategy: Recreateпод RWO-PVC,readOnlyRootFilesystem: true, uid 1000, emptyDir на/tmp;ENABLE_LOGIN_FORM=false+OAUTH_AUTO_REDIRECT=true(аварийный вход —/auth?form=true), первый вход через Zitadel становится админом;/health(startup с запасом на миграции Alembic) и/health/db;internal-ca,SSL_CERT_FILE/REQUESTS_CA_BUNDLE/CURL_CA_BUNDLEнаca.crt.Креды
WEBUI_SECRET_KEYгенерируются в кубе: ESOPassword+refreshPolicy: CreatedOnce+target.immutable+creationPolicy: Orphan. Наивная привязка генератора к периодическому ExternalSecret давала бы новый ключ на каждомrefreshInterval— сессии падали бы по расписанию.WEBUI_SECRET_KEYобязателен:backend/open_webui/env.pyv0.11.3 делаетSystemExit, если он пуст, а entrypoint образа кладёт свой ключ в/app/backend/.webui_secret_key— рядом с кодом, то есть вне тома.DatabaseRole/open-webuiберёт пароль из Secret'а типаkubernetes.io/basic-auth(требование CNPG) с меткойcnpg.io/reload; приложение читает те же username/password черезDATABASE_USER/DATABASE_PASSWORD, потому чтоdatabaseUrlчарта — литерал, а URL собирается изDATABASE_*(env.py).kv/ai/open-webui): его выдаёт провайдер, сгенерировать нельзя.Ключ Hermes API — Secret
hermes-api-key, сгенерированный в кубе один раз; его читают оба пода в nsgrachevko(Hermes — envAPI_SERVER_KEY, Open WebUI — ключ подключения).⚠️ Требуется правка данных (не git), сразу после выката: удалить строку
API_SERVER_KEY=из/opt/data/.envтома и перекатить подhermes—.envгрузится сoverride=Trueи до этого побеждает env пода. Пока строка жива, Open WebUI будет получать401от/v1(Hermes работает старым ключом из.env).Сверка
flate test all -p ./kubernetes/flux/cluster— 90 passed, 0 blocked (на ветке с уже влитым #78).flate build all: порт сервиса8080↔backendRefв HTTPRoute, все env-ссылки ↔ ключи Secret'ов,mountPath↔SSL_CERT_FILE; все пути значений существуют вvalues.yamlчарта (своегоvalues.schema.jsonу него нет, опечатка молча игнорировалась бы).chat.<домен>против бандла внутреннего CA проходит (wildcard*.<домен>).Остаётся сделать вручную (не git): DNS-запись
chat→ 192.168.40.11 (сейчас имя отдаёт публичный адрес — ловит wildcard) и правка.envвыше.