Overview
Open WebUI is a self-hosted, ChatGPT-style chat interface for large language models with user accounts, RAG (chat grounded in your uploaded documents), and model management. This template deploys a single stateful workload that keeps all of its state on a persistent volume and connects to your models through an in-GVC Ollama server and/or any OpenAI-compatible endpoint. The install is private by default:publicAccess.enabled is false and self-registration is closed, because the first account registered on a fresh install becomes the administrator. You reach the UI over a port-forward, claim that admin account, and then opt in to publishing it — see First Run.
Architecture
- Open WebUI — A single-replica stateful workload serving the web UI and API on port
8080. A mounted start script sets its publicWEBUI_URLfrom the canonical endpoint at boot, so links resolve correctly with no manual configuration. - Embedded SQLite on a persistent volume — All durable state (the
webui.dbdatabase, uploaded files, the default Chroma vector store used for RAG, and cache) lives on the workload’s volume set at/app/backend/data. SQLite is single-writer, so there is no external database dependency and the workload runs as exactly one replica. - Model backends — Chat completions are served by an existing Ollama workload in the same GVC (default), an OpenAI-compatible API (optional), or both. Neither backend is bundled by this template — you point it at model providers you run or subscribe to.
- No template-created credential — The key that signs sessions and JWTs lives only in a secret you create yourself, so it never enters the Helm release.
What Gets Created
- Stateful Open WebUI Workload — A single replica serving the web UI and API on port
8080. - Volume Set — A 10 GiB persistent volume mounted at
/app/backend/dataholding the SQLite database, uploaded files, the RAG vector store, and cache. Scheduled snapshots protect the data, and a final snapshot is kept on delete. - Start-Script Secret — An opaque secret whose boot script sets
WEBUI_URLfrom the canonical endpoint. - Identity & Policy — An identity bound to the workload with a least-privilege policy granting
revealaccess to exactly the secrets it mounts: your session-key secret, the start-script secret, and your OpenAI-key secret only when you configure one.
This template does not create a GVC. You must deploy it into an existing GVC.
Prerequisites
One opaque secret must exist before you install. The key that signs every session and JWT is a long-lived credential, so it is not a value — a value would sit in the Helm release for the life of the install.1
Create the session signing key secret
Generate a random key and store it as the secret’s payload:Set
auth.secretKeyName to the name you used.2
Keep it forever
Back the key up somewhere safe outside Control Plane. It is never rotated: replacing it invalidates every issued session and JWT, logging every user out.
License awareness — Open WebUI ships under the “Open WebUI License” (BSD-3-Clause plus a branding-protection clause). It is free to self-host and run in production at any scale, but you must keep the “Open WebUI” branding visible in the UI unless your deployment serves 50 or fewer users, or you obtain enterprise permission. See Important Notes.
Once the secret exists, install the template using your preferred method:
UI
Browse, install, and manage templates visually
CLI
Manage templates from your terminal
Terraform
Declare templates in your Terraform configurations
Pulumi
Declare templates in your Pulumi programs
First Run
A default install is closed on every side: the canonical endpoint returns403 to the internet, and internalAccess.type: none blocks other workloads in the GVC. Claim the admin account through a port-forward first, then publish the UI.
1
Install with the defaults
Install with
auth.secretKeyName pointing at the secret you created, and leave publicAccess.enabled: false and auth.enableSignup: false alone. Wait for the workload to report ready:2
Register the admin account over a port-forward
Forward the UI to your own machine:Then open The response carries
http://localhost:8080, which shows Open WebUI’s “create admin account” screen. Port forwarding reaches the workload even though it is closed to both the internet and the GVC, and the account you create there is the administrator.If you would rather not leave the terminal, the same registration works over the container’s own loopback address:"role":"admin". A second registration attempt returns 403, because only the first account is exempt from auth.enableSignup: false.3
Publish the UI
Now that the admin account is claimed, upgrade the release with
publicAccess.enabled: true and sign in at the canonical endpoint. Allow up to a couple of minutes for the firewall change to take effect — a measured toggle moved through 403 → 503 → 200 over about 143 seconds.Configuration
The defaultvalues.yaml for this template:
Instance & Resources
image— The Open WebUI container image.resources— CPU and memory for the container. RAG loads a local embedding model into RAM on first use, so keep memory at or above the default.volumeset.capacity— Volume size in GiB (minimum 10) for the SQLite database, uploads, RAG vector store, and cache.
Backup
Scheduled, crash-consistent snapshots of the data volume, managed by the platform — no cloud account or bucket is required. See Backing Up for how snapshots work and Restoring a Backup for the manual restore procedure.backup.enabled— Take periodic snapshots of the data volume (defaulttrue).backup.schedule— Cron expression in UTC (default0 3 * * *, daily at 03:00). The platform does not accept schedules more frequent than hourly.backup.retention— How long each snapshot is kept, e.g.7d,720h,30d.
Authentication
auth.secretKeyName— Name of the opaque secret holding the session and JWT signing key. It must exist before you install (see Prerequisites) and must never change afterward.auth.enableSignup— Whether users can create their own accounts (defaultfalse). The first account on a fresh install is exempt, so a default install is still usable — that is how you create the admin in First Run.
Model Backends
At least one backend is needed to actually chat. The Ollama backend is on by default; the OpenAI-compatible backend is off until you supply a key secret. You can enable both.ollama.enabled— Connect to an existing Ollama workload in this GVC (defaulttrue).ollama.workloadName— The Ollama workload’s name in this GVC. The base URL is derived ashttp://{workloadName}.{gvc}.cpln.local:{port}.ollama.port— The Ollama API port (default11434).openai.baseUrl— Any OpenAI-compatible endpoint (defaulthttps://api.openai.com/v1). The workload’s outbound firewall is open, so hosted providers such asapi.openai.comare reachable.openai.apiKeySecretName— Name of your pre-created opaque secret holding the API key (see Prerequisites). Empty (default) leaves the OpenAI backend off, and the policy grants no access to any key secret.
Access
customDomain— Full URL of a custom domain, e.g.https://chat.example.com. The scheme is required; the chart fails the render without it. Empty (default) uses the canonical*.cpln.appendpoint.publicAccess.enabled— Serve the UI over public HTTPS on the canonical*.cpln.appendpoint (defaultfalse). While it is off, external requests are rejected at the edge with403and only in-GVC callers reach the workload, perinternalAccess.internalAccess.type— Internal firewall scope for in-GVC callers of the Open WebUI API:
An access change takes effect at the edge after a short propagation delay — allow up to a couple of minutes before concluding a firewall knob did not work.
Connecting
Using a Model Backend
Deploy the Ollama template into the same GVC and pull at least one model, then install Open WebUI withollama.workloadName set to that workload’s name — its models appear in the model picker automatically. To use a hosted provider instead, create the API-key secret (see Prerequisites), set openai.apiKeySecretName, and Open WebUI lists that provider’s models.
If a configured Ollama backend is unreachable the UI still boots and simply shows no Ollama models — an empty model list is the symptom of a wrong ollama.workloadName. Confirm it names a ready Ollama workload in the same GVC.
Backing Up
Backups are scheduled volume snapshots managed by the platform — no cloud account or bucket is required. On the configured cron schedule the platform takes a crash-consistent snapshot of the data volume; SQLite recovers cleanly from one. Snapshots are pruned automatically afterbackup.retention, and a final snapshot is always taken when the release is uninstalled.
- Default schedule — Daily at 03:00 UTC (
backup.schedule: "0 3 * * *"), kept for 7 days (backup.retention: 7d). - Minimum interval — The platform does not accept schedules more frequent than hourly.
Snapshots live in the platform storage layer alongside the volume, not off-site. They protect against data corruption and accidental changes, but losing the whole GVC would lose them too.
Restoring a Backup
There is no automated restore.backup.enabled only takes snapshots; recovering from one is a manual, deliberate operation you run yourself. Restore is in-place on the release’s own volume set: the platform provisions a fresh volume from the chosen snapshot and swaps it in, then the workload restarts to remount it.
1
Find the snapshot to restore
List snapshots and note the
name, location, and volumeIndex of the one you want:2
Restore it in place
Provision a fresh volume from the snapshot and swap it in. The workload restarts to remount it:A measured restore took about 2.5 minutes end to end, of which roughly 40 seconds was workload downtime.
3
Verify
Once the workload is ready again, sign in and confirm your chats and settings are present.
Important Notes
- Create the session-key secret before installing, and never change it.
auth.secretKeyNameonly names the secret; the workload wedges waiting on one that does not exist. The key signs every session and JWT, so replacing it logs every user out. - The first account registered becomes the administrator. That is why the UI ships private with sign-ups closed — an unclaimed admin account on a public URL belongs to whoever finds it first. Claim it over a port-forward before turning
publicAccess.enabledon; see First Run. auth.enableSignupis only read while no account exists. After the first account it is stored inwebui.dband the stored value wins, so a laterhelm upgradecan neither open nor close sign-ups. Use Admin Settings → Users instead.ollama.*,openai.*andcustomDomainapply at install, then persist in the app database. A laterhelm upgradeis ignored and the old backend keeps working, so there is no symptom to warn you. Change model connections from the admin UI under Settings → Connections.customDomaindoes not create a domain. It setsWEBUI_URLonly; create the Control Plane domain and its DNS separately, or the hostname will not resolve while the install reports success.- Restoring a snapshot is manual and loses post-snapshot data, including accounts created after it was taken. See Restoring a Backup.
- Single replica, by design. The embedded SQLite is single-writer and the volume set is per-replica, so the workload is pinned to one replica with no
replicasknob. A restart or upgrade is a brief full outage of about a minute — including the firsthelm upgradeafter an install, which re-applies the workload even when nothing changed. - Data lives only on the volume set. Uninstall deletes it (a final snapshot is taken first); a reinstall starts empty, including the admin account. Your own prerequisite secrets are not deleted, since the chart does not own them.
- Ollama unreachable is non-fatal. The UI boots and shows no Ollama models rather than failing, so check the model list after install.
- License / branding clause — You must keep the “Open WebUI” branding visible in the UI unless your deployment serves 50 or fewer users, or you have enterprise permission. Removing the branding outside those cases violates the license; it is not a template setting.
External References
Open WebUI on GitHub
Upstream source repository
Open WebUI Documentation
Official documentation and getting-started guides
Environment Variable Reference
Full list of supported configuration variables
License
The Open WebUI License and its branding clause
Ollama Template
Deploy the in-GVC Ollama model backend
Open WebUI Template
View the source files, default values, and chart definition