Adds the Open WebUI stack at openwebui.basicstack.de: - Namespace `openwebui`, ArgoCD Application with auto-sync + selfHeal - Own Postgres 16 + pgvector (`pgvector/pgvector:pg16`, 20Gi encrypted PVC, fsn1-pinned); VECTOR_DB=pgvector, extension auto-created - Own Redis 7 (2Gi encrypted PVC, fsn1-pinned) used both as cache and as websocket manager (db=1) - Hetzner Object Storage bucket `openwebui-basicstack` (hel1, path-style) for file uploads; shared project S3 credentials - Traefik ingress + Let's Encrypt TLS - Pocket ID client `Open WebUI` (PKCE on) restricted to groups `openwebui_admins` and `openwebui_users`; `andreas.leinen@basicstack.de` is member of both and gets admin via OAUTH_ADMIN_ROLES - Password login disabled (`ENABLE_LOGIN_FORM=false`, `ENABLE_SIGNUP=false`) Co-Authored-By: Paperclip <noreply@paperclip.ing> |
||
|---|---|---|
| .. | ||
| app-secrets-sealed.yaml | ||
| namespace.yaml | ||
| oidc-sealed.yaml | ||
| openwebui.yaml | ||
| postgres-credentials-sealed.yaml | ||
| postgres.yaml | ||
| README.md | ||
| redis.yaml | ||
| s3-sealed.yaml | ||
Open WebUI (openwebui.basicstack.de)
Self-hosted LLM front-end — Open WebUI.
Stack
- App:
ghcr.io/open-webui/open-webui:v0.11.3(Deployment, 1 replica,Recreatestrategy) - Database: Postgres 16 + pgvector (
pgvector/pgvector:pg16, StatefulSet, PVC 20Gi onhcloud-volumes-encrypted) - Vector DB:
pgvectorin the same Postgres instance (VECTOR_DB=pgvector, extension auto-created on first start) - Cache / websocket manager: Redis 7 (StatefulSet, PVC 2Gi on
hcloud-volumes-encrypted,WEBSOCKET_MANAGER=redisondb=1) - Object storage: Hetzner Object Storage bucket
openwebui-basicstack(regionhel1, path-style) - Auth: Pocket ID OIDC —
Open WebUIclient, restricted toopenwebui_admins/openwebui_users. Sign-up via OAuth only (ENABLE_LOGIN_FORM=false,ENABLE_SIGNUP=false) - Ingress: Traefik, TLS via
letsencrypt-prod(DNS-01) - Node placement: all stateful pods pinned to Hetzner location
fsn1(matches CSI-encrypted PVCs)
Files
| File | Purpose |
|---|---|
namespace.yaml |
Namespace declaration |
postgres.yaml |
Postgres+pgvector StatefulSet + Service (fsn1-pinned) |
redis.yaml |
Redis StatefulSet + Service (fsn1-pinned) |
openwebui.yaml |
App Deployment + Service + Ingress (+ PVC for local cache) |
postgres-credentials-sealed.yaml |
Sealed Postgres user/db/password |
app-secrets-sealed.yaml |
Sealed WEBUI_SECRET_KEY, DATABASE_URL, PGVECTOR_DB_URL, REDIS_URL, WEBSOCKET_REDIS_URL |
oidc-sealed.yaml |
Sealed OIDC client id + secret |
s3-sealed.yaml |
Sealed S3 access key, secret, endpoint, region, bucket |
Deployment references
- Argo Application:
apps/app-openwebui.yaml - Pocket ID OIDC client id:
3ffbd06b-12cc-4562-bbe5-da4433962870(PKCE enabled, group restriction on, allowed groups:openwebui_admins,openwebui_users) - Pocket ID groups:
openwebui_admins(737f4b7f-63f2-42b5-98bb-4e96c4a80546),openwebui_users(74b0af52-0942-4cb6-b37a-83d87d203e32) - OIDC redirect URI:
https://openwebui.basicstack.de/oauth/oidc/callback - Role mapping: OIDC
groupsclaim → Open WebUI roles.openwebui_admins→ admin,openwebui_users→ user. - Initial admin:
andreas.leinen@basicstack.de(member of both groups;OAUTH_ADMIN_ROLES=openwebui_admins) - DNS:
openwebui.basicstack.deA →138.199.128.63(cluster ingress) - S3 endpoint:
https://hel1.your-objectstorage.combucketopenwebui-basicstack(CORS whitelisted tohttps://openwebui.basicstack.de). S3 credentials are shared with the Hetzner project (same key used foroutline-basicstack,basicstack-backup).
Deferred / follow-ups
- Model providers (Ollama / OpenAI): none wired yet. Add
OLLAMA_BASE_URLorOPENAI_API_BASE_URL/OPENAI_API_KEYvia a sealed secret when a backend is chosen. - RAG embeddings:
RAG_EMBEDDING_ENGINE=default(local). Switch toopenai+RAG_OPENAI_*for hosted embeddings when a provider is picked. - Content extraction (Tika): not deployed. Add
CONTENT_EXTRACTION_ENGINE=tika+TIKA_SERVER_URLonce a Tika service is available if PDF/Docx ingestion is required. - SMTP: Open WebUI has no built-in mailer; not wired.
- HA: single replica with
Recreatestrategy; Redis websocket manager already in place, so scaling to N replicas only requires bumpingspec.replicas(Postgres/Redis remain single-instance).