Linux (bare-metal)
For always-on servers without Docker: camera.ui installs from npm and runs as a systemd service. Ubuntu 24.04 (or newer) is the tested baseline. See System requirements.
Prerequisites
64-bit Linux (x64 or arm64) with systemd
Node.js 24, e.g. via NodeSource:
bashcurl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash - sudo apt-get install -y nodejs
That's it. Everything else (FFmpeg, go2rtc, and a portable Python runtime for the detection plugins) camera.ui downloads and manages itself.
Install
sudo npm install -g camera.ui
sudo cameraui install --user camerauicameraui install creates the service user if it doesn't exist, registers a systemd service named cameraui and starts it on boot. The first start downloads and installs the server, so give it a few minutes and follow along with sudo cameraui logs --user cameraui in a second terminal. The web UI then runs on https://<host>:3443.
If the service user needs GPU access for hardware acceleration, add it to your distribution's video/render groups. --group video only applies when the install creates the user. For an existing user, run sudo usermod -aG video cameraui and restart the service.
Worker mode
To run this machine as a worker for another camera.ui server, add --worker to the install command:
sudo cameraui install --user cameraui --workerThe flag is stored with the service, so the machine comes back up as a worker after a reboot. Generate a pairing code on the main server, put the snippet into this machine's config file as described on the workers page, then run sudo cameraui restart --user cameraui.
Managing the service
cameraui status # service state
sudo cameraui logs --user cameraui # tail the logs
sudo cameraui restart --user cameraui # also: start / stop
sudo cameraui update-server # update to the latest server release
sudo cameraui update-server 1.2.3 # or pin a specific versionThe service runs as its own user, so everything except status needs sudo and the same --user you installed with. If you installed with -H <path>, pass that instead.
The Updates page does the same from the web interface; update-server is the CLI equivalent.
Data
Everything lives in the service user's home under ~/.camera.ui (config, database, recordings, TLS certs). That's the directory to back up. A different location can be set with -H <path> during install.
Hardware acceleration
Video acceleration is automatic, but on bare metal the host provides the drivers that the Docker images would otherwise bundle:
- Intel GPU:
sudo apt install intel-media-va-driver-non-free(VA-API/QSV). For OpenVINO or OpenCL inference on the GPU, also install the OpenCL runtime:sudo apt install ocl-icd-libopencl1 intel-opencl-icd - AMD GPU:
sudo apt install mesa-va-drivers - NVIDIA: the regular driver (e.g.
sudo ubuntu-drivers install); the Container Toolkit is Docker-only, you don't need it here. CUDA detection with the ONNX plugin additionally needs the CUDA 12 libraries and cuDNN 9 on the system (from NVIDIA's apt repo:sudo apt install cuda-libraries-12-8 cudnn9-cuda-12). The Docker image ships these, bare metal does not - Coral Edge TPU: the
libedgetpuruntime plus (for PCIe/M.2) the gasket kernel driver, see the Coral section - Hailo: the kernel driver, see the Hailo section
No device passthrough is needed anywhere. Bare metal sees the hardware directly, and camera.ui picks it up automatically. The detection plugins log what they found (Available devices: …).
Uninstall
sudo cameraui uninstall # removes the systemd service
sudo npm remove -g camera.uiThe data directory (~/.camera.ui) is left untouched.