Server Deploy Guide

Limit X โ€” Server Stack Deployment

The host side of the stack: the docs site and the dash (UI + relay), on server2. Everything is Docker, offline at runtime, zero network calls after deploy. The robot is the producer; this box is observe-only.

drag to orbit ยท scroll to zoom
LOADING LIMIT
STEP 1 ยท ๐Ÿ–ฅ๏ธ HOST
Server deployment โ€” this page
limit-docs :3010 ยท limit-dash :80 (UI) + :9000/udp (ingest)
โ†’
STEP 2 ยท ๐Ÿค– ROBOT
Robot deployment
limit-robot on the Jetson AGX Thor ยท aarch64

โ†’ Robot Deploy โ€” the other half of this stack, on the Jetson AGX Thor

Server deployment ๐Ÿ–ฅ๏ธ host x86-64

The host (Server2, 192.168.0.83) runs two containers โ€” the docs site and the dash (UI + relay). No database or backend services in the telemetry pipeline itself โ€” anything else on the box (e.g. a SQL server on :1433) is separate infrastructure, not part of this stack.

Before you start

  1. Two machines on the same L2 network โ€” the host and the robot (Jetson AGX Thor). No internet needed at runtime.
  2. Docker Engine installed and sudo-free for the deploy user on both machines.
  3. Images: production-limit-docs-docker and production-limit-dash-docker (both x86-64) on the host; production-limit-robot-docker (aarch64) on the Jetson. All three are untagged โ€” no :1.0 tag exists.
  4. Ports free on the host: 3010 (docs, published โ€” on this fleet :3000 is taken by Gitea), 80 (dash UI, via --net host), 9000/udp (telemetry in from the robot), 8000 (relay API, localhost only).
โš Architecture rule: x86-64 images run only on the host, production-limit-robot-docker (aarch64) only on the Jetson. docker load of the wrong image on the wrong machine fails immediately โ€” and the only thing that crosses the wire is UDP JSON telemetry (robot โ†’ host, port 9000). The stack is observe-only: there is no command channel in either direction.

Air-gapped image transfer

bash ยท save โ†’ transport โ†’ load
# 1. on the machine that BUILT the image
docker save production-limit-dash-docker -o limit-dash.tar
# 2. copy limit-dash.tar to the target (USB stick, sftp, whatever)
# 3. on the TARGET machine
docker load -i limit-dash.tar
docker images | grep production-limit   # confirm names + arch before you run

Docs site (this site, port 3010)

bash ยท docs
docker run -d \
  --name limit-docs \
  --restart unless-stopped \
  -p 3010:3000 \
  production-limit-docs-docker

Limit Dash (host port 80)

bash ยท dash
docker run -d \
  --name limit-dash \
  --restart unless-stopped \
  --net host \
  production-limit-dash-docker

Verify

  1. curl http://192.168.0.83/ โ€” dashboard HTML.
  2. curl http://192.168.0.83/api/health โ€” relay reports alive.
  3. curl -I http://192.168.0.83:3010/ โ€” the docs site (this one) answers 200.
  4. Open http://192.168.0.83 โ€” tiles are grey/stale until the robot starts; flip SIM and they light up with synthetic data, proving the pipeline.

Day-to-day

TaskCommand
follow the logsdocker logs -f limit-dash (or limit-docs)
restart a piecedocker restart limit-dash
change the dash UI portnginx listens on :80 via host networking; to move it, run bridge-mode instead: docker run -d --name limit-dash -p 8080:80 -p 9000:9000/udp production-limit-dash-docker
stop the host stackdocker stop limit-dash limit-docs
โœฆStop order: robot first, then the host stack. The robot is the producer and holds the physical state; the dashboard can drop off any time. See the Robot Deploy page for the other side.