📚 Docs

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.