Install Walter
Walter On-Prem ships with a dedicated walter-onprem CLI. The public docs site
publishes the bootstrap script, the CLI binaries, the bundle archive, and the
release manifest operators need for install and upgrade flows.
The bootstrap shell script is now intentionally thin: it only downloads the
correct walter-onprem binary for the current machine and then execs
walter-onprem install ....
Requirements
- Docker with Compose support (
docker composeordocker-compose) - A Walter registry username and token, communicated separately
- A hostname or IP address clients will use to reach Walter
Verify Compose before you start:
docker compose version
# or:
docker-compose version
If docker compose version fails on Debian, Ubuntu, or Raspberry Pi OS, install docker-compose-plugin. If your environment already standardizes on the standalone docker-compose binary, Walter can use that too.
License keys and LLM settings are optional at boot. You can enter them in the browser after Walter starts.
One-command install
For the fastest first boot:
curl -fsSL https://onprem.walterops.com/install/install-walter.sh | bash
The installer:
- Downloads the correct
walter-onprembinary for the current machine - Resolves the latest stable Walter release from
/releases/manifest.v1.json - Downloads the Walter On-Prem bundle into
~/walter-onprem - Verifies checksums before touching the existing install
- If
~/walter-onpremalready exists, moves it to a timestamped backup before unpacking the new bundle - Restores the prior
~/walter-onprem/.env.deployinto the new bundle directory when present - Prompts for the deployment mode and explains what
internal-tlsandpublic-tlsmean - Prompts for the host clients will use to reach Walter
- For fresh
internal-tlsinstalls, asks whether to keep the default published host ports80/443 - Reuses existing Docker auth or prompts for the GHCR username and token Walter provided separately
- Writes or updates
~/walter-onprem/.env.deploy - Pulls the Walter image
- Starts the Docker Compose stack
A normal reinstall is not a clean wipe. walter-onprem install moves the
existing ~/walter-onprem bundle aside to a timestamped backup, restores the
previous .env.deploy when present, and leaves Docker named volumes in place.
If you need a truly fresh install, remove the Compose volumes too. See
Troubleshooting.
When the stack is up, open https://<the host you entered>.
After install, ~/walter-onprem/bin/walter-onprem doctor reruns the local
preflight and config checks without changing anything.
If you prefer a fully non-interactive install, pass --mode, --host, and either preconfigure Docker auth or pass --registry-username and --registry-token.
The bundle-managed defaults are:
internal-tls: publishes Walter on host ports80and443public-tls: requires standard public80/443for Let's Encrypt
If you need non-default published ports, use internal-tls and pass --https-port and, if needed, --http-port.
The CLI refuses to refresh a non-empty install directory unless it already
looks like a Walter On-Prem install. Use --force only when you are
intentionally adopting a custom path and understand that Walter will move the
existing directory aside before writing the new bundle.
What the installer asks
With no flags, walter-onprem install asks for the minimum it cannot safely guess:
- deployment mode:
internal-tlsfor private networks with Walter's generated internal CA, orpublic-tlsfor a public DNS hostname with Let's Encrypt - the host clients will use to reach Walter
- for fresh
internal-tlsinstalls, whether to keep the default published host ports80/443 - the GHCR username and token Walter provided separately, if Docker is not already authenticated
Pressing Enter at the deployment-mode prompt chooses internal-tls.
Useful flags
# Public hostname with automatic Let's Encrypt
curl -fsSL https://onprem.walterops.com/install/install-walter.sh | \
bash -s -- --mode public-tls --host walter.example.com
# Private TLS with Walter's generated internal CA
curl -fsSL https://onprem.walterops.com/install/install-walter.sh | \
bash -s -- --mode internal-tls --host 192.168.1.50
Use a hostname or IP address that client machines already resolve. If you use a made-up internal name, you must also provide matching internal DNS or /etc/hosts entries on every client. For small private deployments, using the server's private IP is often the simplest option.
# Private TLS on a non-default published HTTPS port
curl -fsSL https://onprem.walterops.com/install/install-walter.sh | \
bash -s -- --mode internal-tls --host 192.168.1.50 --https-port 8443
# Pin an exact Walter release
curl -fsSL https://onprem.walterops.com/install/install-walter.sh | \
bash -s -- --to <supported-release>
# Use an exact image tag instead of the release manifest
curl -fsSL https://onprem.walterops.com/install/install-walter.sh | \
bash -s -- --image ghcr.io/matchylabs/walter:<supported-release>
# Preseed license and LLM settings
curl -fsSL https://onprem.walterops.com/install/install-walter.sh | \
bash -s -- \
--host 192.168.1.50 \
--license-key "<provided-license-key>" \
--llm-base-url https://api.openai.com/v1 \
--llm-api-key "<provided-api-key>"
Manual CLI install
If you prefer not to pipe the bootstrap script into bash, download the binary explicitly:
curl -fsSL https://onprem.walterops.com/downloads/walter-onprem-linux-arm64 -o walter-onprem
curl -fsSL https://onprem.walterops.com/downloads/walter-onprem-linux-arm64.sha256 -o walter-onprem.sha256
sha256sum -c walter-onprem.sha256
# or: shasum -a 256 -c walter-onprem.sha256
chmod +x walter-onprem
./walter-onprem versions
./walter-onprem install
Replace the binary name with the correct platform if you are not on Linux arm64.
Trust the internal CA
internal-tls uses Walter's generated internal certificate authority. That keeps traffic encrypted, but browsers and turf hosts need to trust the generated CA before the experience feels smooth.
Walter's turf bootstrap flow carries that CA forward for the installed agent, so agents can keep verifying wss traffic after the first bootstrap. Browsers still need manual CA trust if you want a warning-free experience.
For a quick first boot, expect your browser to warn about the certificate until that CA is trusted. If you want a clean browser experience without manual trust steps, use public-tls with a real DNS hostname and public 80/443 reachability.
If you run internal-tls on a non-default published HTTPS port, include that port in the browser URL and pass --https-port during install so Walter generates the same origin for turf bootstrap commands.
What happens next
After first boot:
- Enter your Walter license key if it was not preseeded
- Create your admin account
- Enter your LLM provider details if they were not preseeded
- Add your first turf from the Walter sidebar