Open WebUI PaaS assistant
The public webui app at https://webui.prototype.imeme.name has its own
account login, separate from the SSH-approved browser shell. Signup is
disabled; administrators add and approve users. Only approve fully trusted
platform operators, not isolated tenants.
Administrator bootstrap
An empty webui_admin_email inherits the effective letsencrypt_email.
An empty webui_admin_password generates an initial password. On the private
operator workstation retrieve it with:
bash scripts/terraform.sh output -raw webui_admin_email
bash scripts/terraform.sh output -raw webui_admin_password
Store the password securely; never paste it into chat or source control.
Bootstrap applies only to a new, empty user database. Rotate an existing
account's password through WebUI, not by changing Terraform's initial value.
The private Terraform state retains generated secrets and the OpenRouter key.
Credentials are installed root-only in /etc/dokku/paas/webui-bootstrap.env
over SSH, never in Git, cloud-init or an image.
Chat and terminal tools
The shared base model uses OpenRouter directly at
https://openrouter.ai/api/v1 with the exact ID
~deepseek/deepseek-v4-flash-latest. Select the preconfigured paas assistant
and PaaS terminal in the chat terminal selector. API chat clients must send
terminal_id: "paas-terminal"; model metadata alone does not attach tools to
bare API requests. A configured model is not proof of a successful tool call.
The assistant can write source, test it and deploy through the existing private
Open Terminal API and shared Dokku SSH identity. It should confirm the target,
inspect existing apps before writes, ask before disruptive/destructive actions,
and test the actual deployed URL. Every public app gets automatic Let's Encrypt
from the post-deploy hook. On certificate failure the operator fixes DNS/port
80 and runs sudo paas-enable-https <app>; never claim HTTPS until verified.
Use https://shell.prototype.imeme.name/ for a separate interactive terminal.
Ordinary chat tool calls require approval: review commands and reject unwanted actions. These prompts are not an access-control boundary. Other API routes, sockets, administrators and direct terminal clients have different controls. Approved users share platform-wide deployment authority. All apps receive the same private terminal API credential; WebUI grants cannot isolate this workspace from app-level access. The terminal itself has no public route.
Persistence, backup and recovery
Terminal source under /app is ephemeral; preserve it in a separate durable
Git repository, not merely the Dokku deploy remote. WebUI accounts, chats,
configuration and uploads persist on the host at
/var/lib/dokku/data/storage/webui, mounted at /app/backend/data.
Daily root cron writes local WebUI archives under
/var/backups/dokku/webui, with 7-day retention by default. An operator can
run sudo paas-webui-backup [directory] [days] (optional positional arguments).
The helper uses SQLite's online snapshot API rather than copying a live
database and its WAL. Archives are root-only and sensitive. Local backups
are lost with the host or disk; arrange secure off-host copies separately.
Test recovery on an isolated disposable installation: stop only that test
WebUI app, inspect and extract the selected archive into its empty data volume,
restore UID/GID 32767 and restrictive permissions, retain the matching
WEBUI_SECRET_KEY, then restart and verify accounts/chats/uploads.
Do not extract backups over a live production data directory. Plan a reviewed
production restore separately with a fresh backup and rollback path.
HTTPS and troubleshooting
The app proxy permits /health for health/ACME checks but rejects other
requests unless trusted nginx reports HTTPS. nginx must overwrite
X-Forwarded-Proto; clients must not access the container port directly.
If certificate setup fails, the installer disables WebUI's public proxy rather
than publishing its login over HTTP. Resolve DNS/port-80 issues and rerun the
installer; renewal is scheduled through cron.
For chat failures check WebUI logs, OpenRouter model access/credit and
connectivity, the private terminal /health and authenticated API connectivity,
and HTTPS. Never log API keys or authorization headers. See
Web shell for separate browser authentication and shared trust.