Quick start
CCNVR is a network video recorder that does everything in a single process: device onboarding, live view, recording storage and playback.
Pick one of the three deployment methods below. The first visit always opens the setup wizard — set the language, local addresses and admin password there.
| Method | Best for | Artifact |
|---|---|---|
| Windows | Desktops, industrial PCs | ccnvr-windows-amd64.zip |
| Linux | Production, auto-start on boot | ccnvr-linux-amd64-<version>.tar.gz |
| Docker | Servers, NAS, quick trials | Image ccnvr/ccnvr:latest |
Windows deployment
- Extract
ccnvr-windows-amd64.zipto any directory. - Double-click
start.bat. - Open
http://127.0.0.1:16188.
To stop: double-click stop.bat.
- Use
start.bat, do not double-clickccnvr.exedirectly.start.batalso launches the watchdog process, which restarts the service after a crash. - Do not kill
ccnvr.exealone from Task Manager — the watchdog will bring it back. Always stop withstop.bat, which terminates both the watchdog and MediaServer. - Windows Firewall prompts on first start — you must allow it, otherwise other machines on the LAN cannot reach it.
- Only Windows system DLLs are required; no .NET or VC++ runtime needed.
Linux deployment
1. Extract and start
tar -xzf ccnvr-linux-amd64-<version>.tar.gz
cd ccnvr-linux-amd64
sudo ./start.sh
The start script prints the access address of every NIC on the machine. Open http://<ip>:16188.
2. Common commands
./start.sh # Start in background (survives terminal close)
./stop.sh # Stop
./start.sh status # Process status and health check
sudo ./start.sh service # Install systemd service: auto-start + auto-restart
Upgrades are done in the web console under System info → Version & upgrade — no need to extract the package over the existing files.
- Root is required. RTSP defaults to port 554, a privileged port (<1024) that a normal user cannot bind. Run
sudo ./start.sh, orsudo setcap 'cap_net_bind_service=+ep' ./MediaServer/MediaServerto run without sudo afterwards. - Do not mix sudo and a normal user. Once started with sudo,
configs/config.tomlis owned by root and a normal-user start can no longer read it. Always use sudo, or fix it withsudo chown -R $(id -un):$(id -gn) .. - Requires glibc ≥ 2.31: Ubuntu 20.04+ / Debian 11+ / CentOS Stream 9+.
- A static ffmpeg ships in the package — nothing to install.
Docker deployment
docker run -d --name ccnvr --restart always \
-p 16188:16188 \
-p 15060:15060 -p 15060:15060/udp \
-p 31100-31200:31100-31200 -p 31100-31200:31100-31200/udp \
-p 3702:3702/udp \
-v /opt/ccnvr/data:/opt/media/bin/configs \
ccnvr/ccnvr:latest
Then open http://<host-ip>:16188.
Add -p 2554:2554 -p 1935:1935 only if you need RTSP / RTMP distribution (both are off by default).
- You must mount
/opt/media/bin/configs. Config, database, device records, machine ID and the license file all live there. Without the mount they are lost when the container is recreated, and the license has to be reissued. - GB28181 device registration uses UDP 15060. Mapping only TCP makes devices report "registration timeout" forever, with nothing in the server log.
- ONVIF auto-discovery relies on LAN multicast, so it cannot find devices on a bridge network. Use
--network hoston Linux (then drop all-pflags). Docker Desktop on Windows / macOS does not support host networking — add cameras by RTSP URL instead. - Recordings are written inside the container by default. To keep them on the host, add
-v /opt/ccnvr/records:/opt/media/bin/records.
First-run setup
The first visit opens the setup wizard:
- Language
- Network — GB28181 SIP advertised IP (LAN IP for local deployments, public IP for internet-facing ones), media server IP (
127.0.0.1is fine for a local install) - Product name
- Admin password — default account
admin, passwordadmin; the default password cannot be kept
The wizard does not appear again.
Upload the .lic file under System info → License; it takes effect immediately without a restart. Without a license, CCNVR runs as the free edition (5 channels by default). Channels beyond the licensed count can still be managed and deleted, but not previewed or played back.
Ports
On a cloud server, open these in the provider's security group as well as the host firewall — the security group is the most commonly missed step.
| Purpose | Port | Protocol | Required |
|---|---|---|---|
| Web console + ONVIF SOAP | 16188 | TCP | Yes |
| GB28181 SIP signaling | 15060 | TCP + UDP | For GB28181 |
| GB28181 media | 31100-31200 | TCP + UDP | For GB28181 |
| ONVIF WS-Discovery | 3702 | UDP | Optional |
| RTSP distribution | 2554 | TCP | Optional |
| RTMP distribution | 1935 | TCP | Optional |
The media API (16198) is for internal use only — do not expose it.
Optional ports are off by default; enable them under Settings → Stream distribution. Web playback, snapshots and recording do not depend on them.
Troubleshooting
| Symptom | Cause |
|---|---|
| GB28181 devices keep timing out and the server logs no SIP traffic at all | UDP 15060 is not open in the security group / firewall |
| ONVIF devices are not discovered on the LAN | Docker is on a bridge network; switch to --network host |
| Device registers but shows no video | RTP range (31100-31200) UDP is blocked, or Sip.Host / Media.SDPIP is not set to the public IP |
License upload returns invalid | No license public key built into the server, or the license does not match this device code |
Linux start says it cannot read config.toml | A previous sudo start changed the file owner to root |