Upgrade
Last updated on September 7, 2026
You upgrade by re-running the deploy script. It pulls the Docker images from the stable release channel, applies any database migrations, and restarts the stack. Data and auto-generated secrets in .env are preserved across the upgrade.
Back up your data before upgrading. Downgrades are not supported, so a backup is the only way to roll back. See Backups.
Release channels
TofuPilot cloud releases continuously, and every release publishes a versioned Docker image. Self-hosted instances follow a separate stable channel instead of tracking each release:
- stable is the default. About once a month, a version that has run in production is promoted to the channel. Running the deploy script with no options installs or upgrades to the current stable release. Security fixes and critical bug fixes are promoted out of cycle when needed.
- A pinned version opts out of the channel. Passing
--version <version>installs that exact release, including releases newer than the current stable one. Use--list-versionsto see what is available; the stable release is marked in the listing.
If your instance runs a version newer than the current stable release, for example after pinning a recent version, re-running the script keeps your version and the instance rejoins the channel at the next promotion. Each stable promotion ships with release notes describing what changed for users and what changed operationally.
Upgrade to the stable release
SSH into your server, change to the directory that holds your .env, and run:
curl -fsSL https://www.tofupilot.com/deploy | bashThe script reports the new running version to Orbit once the upgrade finishes. You can also re-deploy or trigger an upgrade from the instance menu in Orbit.
Pin a specific version
To install a fixed version instead of the stable release, for example a newer release that has not been promoted yet, list the available versions:
curl -fsSL https://www.tofupilot.com/deploy | bash -s -- --list-versionsThen pass the version explicitly. Downgrades are rejected; re-running the currently installed version is accepted, which you can use to repair an install:
curl -fsSL https://www.tofupilot.com/deploy | bash -s -- --version <version>Enable realtime views
Realtime updates over WebSocket were added in 2.33. When you upgrade an instance created before that version, add the realtime subdomain so live station status and telemetry, dashboard updates, and streaming build logs work:
- Create a DNS A record for
CENTRIFUGO_DOMAIN_NAMEpointing to your server. It defaults torealtime.<DOMAIN_NAME>(e.g.realtime.tofupilot.yourcompany.com). - Re-run the deploy script. It provisions the
tofupilot-centrifugocontainer and generates theCENTRIFUGO_*secrets in.envautomatically. - Confirm the realtime server is up:
docker compose logs tofupilot-centrifugo --tail 50- Verify the endpoint is reachable over TLS. A
400response is expected — it means the certificate issued and the server is waiting for a WebSocket upgrade:
curl -s -o /dev/null -w '%{http_code}' https://<CENTRIFUGO_DOMAIN_NAME>/connection/websocketThe rest of the application works without the realtime subdomain; only the live views fall back to manual refresh. See Realtime views not updating for troubleshooting.
Verify the upgrade
Check that every container is running and the dashboard reports the new version:
docker compose psdocker compose logs tofupilot-dashboard --tail 100If a container fails to start, inspect its logs with docker compose logs <container> and see Troubleshooting.
How is this guide?