Install from source
This is the complete supported path while release images are still unpublished.
1. Check the worker
Section titled “1. Check the worker”Use a Linux host or VM with:
- Docker Engine and Docker Compose v2;
- Git and OpenSSL;
- enough CPU and memory for the chosen encoder, resolution and concurrent-session limit;
/dev/video0for the camera path, or an X11 display for the desktop path.
docker versiondocker compose versiontest -S /var/run/docker.sock2. Clone the repositories side by side
Section titled “2. Clone the repositories side by side”mkdir tomo-streaming-localcd tomo-streaming-local
git clone https://github.com/Tomo-Social/tomo-streaming-control-plane.gitgit clone https://github.com/Tomo-Social/tomo-stream-server.gitgit clone https://github.com/Tomo-Social/tomo-streaming-self-hosted.gitExpected layout:
tomo-streaming-local/├── tomo-stream-server/├── tomo-streaming-control-plane/└── tomo-streaming-self-hosted/3. Build the runtime images
Section titled “3. Build the runtime images”From tomo-streaming-local/:
docker build \ -t tomo-streaming-control-plane:local \ ./tomo-streaming-control-plane
docker build \ -f ./tomo-stream-server/Dockerfile.av \ -t tomo-av-stream-server:local \ ./tomo-stream-serverConfirm both tags exist:
docker image inspect tomo-streaming-control-plane:local >/dev/nulldocker image inspect tomo-av-stream-server:local >/dev/nullThe retro Dockerfile additionally downloads and builds Libretro cores. It is not required for the camera/desktop quickstart.
4. Configure self-hosting
Section titled “4. Configure self-hosting”cd tomo-streaming-self-hostedcp .env.example .envopenssl rand -base64 32Edit .env:
TOMO_STREAMING_CONTROL_PLANE_IMAGE=tomo-streaming-control-plane:localTOMO_AV_STREAM_SERVER_IMAGE=tomo-av-stream-server:localTOMO_STREAM_API_KEY=replace-with-the-generated-secretSTREAM_SERVER_SIGNALING_URL=ws://localhost:8090/signalingMAX_STREAM_SESSIONS=2TOMO_STREAM_INSTANCE_ID=local-workerFor a camera worker:
CAMERA_DEVICE_HOST=/dev/video0For a desktop worker:
X11_SOCKET_HOST=/tmp/.X11-unixPULSE_SOCKET_HOST=/run/user/1000/pulseKeep unused capture variables empty.
5. Start the control plane
Section titled “5. Start the control plane”docker compose up -ddocker compose psdocker compose logs -f control-planeThe control plane publishes port 8090, mounts the Docker socket and launches one host-networked stream-server container for each session.
Start with one 720p session, observe host CPU and memory, then set MAX_STREAM_SESSIONS from measured capacity rather than an assumed per-stream value.
When the service reports healthy, proceed to Verify your setup.