Test Station Operations

Realtime and Deploys on Self-Hosted TofuPilot

Add the Centrifugo realtime server and the Docker-in-Docker deployer to a self-hosted TofuPilot instance for live status and Git-push deployments.

JJulien Buteau
advanced6 min de lecture27 mai 2026

Self-hosted TofuPilot ships two services that bring it to cloud parity: a realtime server and a deployer. Realtime flips stations online the moment they connect and streams runs live; the deployer builds your procedure bundle from Git and streams the build log while it runs. Both come down with the deploy script. This guide shows what they need and how to confirm they are working.

This is for existing self-hosted instances adding these services. Cloud TofuPilot (tofupilot.app) has both on already, and fresh self-hosted instances now get them by default from the Configure and Deploy reference docs. Once realtime and the deployer are running, you can move your benches off the v1.0 desktop app with Migrate a Station from v1.0 to TofuPilot CLI.

What you get

  • Realtime. Live station status, telemetry, and run streaming to the operator UI and dashboard, plus streaming build logs. Without it the app still works, but live views fall back to manual refresh.
  • Deployer. The Git-push deployment pipeline: link a procedure to a repo, push, and the bundle builds and rolls out to your stations. Without it the rest of the stack works, but the build pipeline is unavailable, so Stations v2.0 cannot get their bundles.

Step 1: Add the realtime subdomain

A self-hosted instance needs three subdomains. The third carries the realtime traffic. Create a DNS A record pointing at your server:

realtime.tofupilot.yourcompany.com A <your-server-ip>

In .env, the realtime host defaults to realtime.<DOMAIN_NAME>, so if your app runs at tofupilot.yourcompany.com you can leave it unset. To use a different host, set CENTRIFUGO_DOMAIN_NAME. The deploy script generates the realtime and deployer secrets on first run and reuses them after, so you do not manage them by hand.

Step 2: Run Docker as root (for the deployer)

The deployer builds in a sandbox that needs a privileged container, which only standard (root) Docker allows. Under rootless Docker the deployer stays down and the build pipeline is unavailable, while everything else, including realtime, works normally. If you need the build pipeline, install Docker the standard way, not rootless.

Step 3: Deploy

Re-run the deploy script. The license key is already in .env, so you do not pass it again:

curl -fsSL https://tofupilot.sh/deploy | bash

The script brings up the realtime and deployer containers alongside the rest of the stack and requests a TLS certificate for the realtime subdomain automatically. Confirm everything is running:

docker compose ps

Step 4: Verify

Realtime: open the dashboard and watch a station's status, or trigger a run and watch phases stream. Status should flip and runs should update with no page refresh.

Deployer: link a procedure to a Git repo, push to the auto-deploy branch, and open the deployment. The build log should scroll live as the bundle builds, then the artifact rolls out to your stations.

If realtime stays disconnected, the cause is almost always the subdomain: confirm the realtime. A record resolves to your server, its TLS certificate issued, and port 443 is open for it just like the app.

Mettez ce guide en pratique