SRT Stream Manager.
The manual.
UDP and multicast in, SRT out – monitored around the clock. Everything you need to install, operate and maintain the CiegoLink Stream container.
What it does
CiegoLink Stream receives a TV signal as UDP or multicast (MPEG-TS) and forwards it as SRT to a cable network, a partner or a playout. Every stream is monitored continuously – separately for input and output.
Bitrate in Mbit/s, detected within seconds when the source stops.
Bitrate, packets/s, round-trip time, lost and retransmitted packets, receiver IP.
Input lost, no receiver or destination unreachable – in the UI and by e-mail.
Streams restart automatically. The web app can be restarted or updated without interrupting any stream.
Installation
You need a Linux server (Ubuntu 22.04 / 24.04 recommended) with internet access for the first build.
- Copy and unpack the package on the server.
cd ~ unzip ciegolink-stream.zip cd ciegolink-stream chmod +x run.sh host-setup.sh - Prepare the server – once per server. Installs Docker if missing, keeps containers running during Docker updates, enlarges UDP buffers and limits log sizes.
sudo bash host-setup.sh - Set token and port in
docker-compose.yml. Check first that the port is free:sudo ss -tulpn | grep 8090(no output = free).ADMIN_TOKEN: "choose-a-long-secret" PORT: "8090" - Build and start. Wait for
Uvicorn running on http://0.0.0.0:8090, then pressCtrl+C.docker compose up -d --build docker compose logs -f - Open the firewall if one is active.
sudo ufw allow 8090/tcp sudo ufw allow 9000:9100/udp # SRT ports you plan to use
First login
- Open
http://<server-ip>:8090in a browser. - Click Admin (top right) and enter the token from
docker-compose.yml. - The admin buttons appear: New stream, Settings, Log out.
Without logging in, anybody who can reach the page sees the stream status (read-only). Passphrases, stream IDs and receiver IPs are never shown publicly.
Creating a stream
Click New stream. The dialog has two columns: the essentials on the left, options on the right.
General
| Field | Description |
|---|---|
| Name | Display name, e.g. Channel 1 |
| SRT mode | Listener – the receiver connects to this server. Caller – this server connects to the receiver. |
| Cable network | e.g. Sunrise, Swisscom, Digital Cable Group – suggestions appear while typing |
| Role | Main or Backup |
Input · UDP / multicast
| Field | Description |
|---|---|
| Input IP | Network card that receives the signal. Default uses the value from Settings. |
| Multicast address | Only for multicast, e.g. 239.1.1.1. Leave empty for unicast. |
| Port | UDP port of the incoming signal |
Output · SRT
| Field | Description |
|---|---|
| Output IP | Listener: interface the receiver connects to (Default = all interfaces) |
| Destination host | Caller: address of the receiver |
| Local interface | Caller: network card used for the outgoing connection |
| Port | SRT port (empty = same as the input port) |
SRT options
| Field | Description |
|---|---|
| Stream ID | Optional SRT stream ID (letters and digits) |
| Latency | SRT latency in ms, e.g. 2000 for internet links. Empty = default. |
| Encryption | None, Generate (random passphrase) or Custom (10–79 characters). The receiver needs the same passphrase. |
| Constant bitrate | Smooths the output bitrate |
| Start after saving | Starts the stream immediately |
Receiver in listener mode: the receiver connects as caller to srt://<server-ip>:<port> with the same latency, passphrase and stream ID.
Reading the stream list
Every stream is one row. Input and output each have their own coloured dot: green = OK, red = no data or not running, orange = waiting for receiver / connecting, grey = unknown or stopped.
| Column | Shows |
|---|---|
| Status | Overall state – see below |
| Name | Name, Main/Backup, AES if encrypted, cable network, mode, latency, uptime |
| Input UDP | Port, address, current bitrate or No data |
| Output SRT | Port, receiver or destination, bitrate · packets/s · RTT, lost / retransmitted packets |
| Chart | Last 10 minutes: input (teal line), output (light dashed line), red marks = lost or retransmitted packets. Hover for details. |
Status values
| Status | Meaning | What to do |
|---|---|---|
| Live | Input receives data and a receiver is connected | – |
| Starting | Stream starting, input not yet determined | Wait a few seconds |
| No input | No UDP data arrives | Check source / encoder, routing, multicast group, input interface |
| No output | Input OK, but no receiver connected (listener) or destination unreachable (caller) | Check receiver, firewall, port, passphrase |
| Unstable | Restarted 3+ times within 10 minutes | Open the stream log |
| Down | Process not running, restarting automatically | Open the stream log |
| Stopped | Stopped by an operator | Start it again |
The red line under a faulty stream explains the cause, e.g. Input lost – no UDP data on 239.1.1.9 @ 10.0.0.5:5004. Filter with All / Live / Faulty / Stopped or search by name, port, IP, cable network or role.
Controlling streams
| Button | Action |
|---|---|
| Restart | Restarts the stream – the receiver reconnects automatically |
| Stop | Stops the stream (asks for confirmation) |
| Start | Starts a stopped stream |
| Delete | Deletes a stopped stream |
| Edit | Changes settings – a running stream restarts with the new values |
| Log | Last 100 log lines of the stream; older lines are removed automatically |
Alarms
Open the Alarms tab. The red number on the tab shows how many streams are currently faulty.
- Critical input lost, no output, stream down, peer unreachable
- Warning receiver disconnected, process restarted, peer reports a fault
- Recovered the stream is OK again
Use the filter buttons and the search field (stream name or message). 20 alarms are shown per page; up to 1000 are kept.
Settings
Monitoring
| Setting | Description |
|---|---|
| Check interval | How often peers are checked and the status file is written (minutes) |
| Alarm delay | How long a fault must last before an alarm / e-mail (seconds). If input is missing for 60 s or more, the stream restarts once to re-join the source. 0 disables this restart. |
| Peer instances | Other CiegoLink Stream servers to watch, e.g. http://10.0.0.2:8090 |
Default interfaces
Input and output IP used by all streams set to Default. Running streams use new values after their next restart.
Admin token
Enter the current token and twice the new token (min. 8 characters), then Change token. You stay logged in.
Maintenance
Restart app restarts only the web interface and the monitoring. Streams keep running without interruption.
Alarm mail (SMTP)
| Field | Example |
|---|---|
| SMTP host / port | mail.example.com / 587 (STARTTLS) or 465 (SSL) |
| User / password | Mailbox login |
| From / To | Sender address / one or more recipients, comma-separated |
| Exclude keywords | Alarms containing these words are not mailed |
Send test mail saves the settings and sends a test message. Click Save to apply.
Status API
These addresses work without login and can be used by dashboards, partners or monitoring tools:
| Address | Content |
|---|---|
/api/status.json | All streams with state, cause, bitrates, packets, RTT and 10-minute history |
/api/alarms | Alarms – filter with ?level=critical&q=channel&limit=50 |
/api/health | 200 = all OK, 503 = fault – ideal for Uptime Kuma or similar |
curl http://<server>:8090/api/health
curl "http://<server>:8090/api/alarms?level=critical&limit=20"
The full technical API (creating streams, settings, admin endpoints) is documented in README.md and interactively at /api/docs.
Main & backup
For real 24/7 availability run two servers – ideally at two locations.
- Install CiegoLink Stream on both servers.
- Create the same stream on both: role Main on server A, Backup on server B.
- In Settings → Peer instances, enter server B on server A and server A on server B.
- Configure the receiver (cable network) with both SRT sources.
If one server fails, the other reports Peer unreachable and sends an e-mail.
Maintenance
Update the web interface – no interruption
Replace the files in app/ and web/, then Settings → Restart app. The running version is shown at the bottom of the page (e.g. v1.1.0 · engine 3.45-4798).
Update the container – short interruption
Only needed when the Dockerfile changes. All streams stop for a few seconds – use a maintenance window.
cd ~/ciegolink-stream
docker compose up -d --build
Backup & restore
Everything (streams, settings, alarms, token) is in the data/ folder. To restore, unpack it into the project folder and run docker compose up -d.
tar czf ciegolink-backup-$(date +%F).tgz data/
Useful commands
docker compose ps # status – should be "Up (healthy)"
docker compose logs -f # application log
docker compose restart # restart container (interrupts streams briefly)
docker stats ciegolink-stream # CPU / memory
Removing
docker compose down # remove containers, data is kept
docker compose down --rmi all # also remove the image
sudo rm -rf ./data # delete all streams and settings
data/ removes all streams, settings and alarms permanently. Make a backup first.Troubleshooting
| Problem | Solution |
|---|---|
| Page does not load | docker compose ps – container running? Port free? Firewall open? Correct IP (LAN / VPN)? |
| Container keeps restarting | Log shows address already in use: change PORT in docker-compose.yml, then docker compose up -d |
| No input | Is the source sending? sudo tcpdump -i any -n udp port 5000 -c 5. For multicast check the input interface. |
| No output (listener) | Receiver must call srt://<server-ip>:<port>; UDP port open; same passphrase, stream ID and latency |
| No output (caller) | Destination reachable? Port open on the receiver side? |
| Lost / retransmitted packets | Increase latency (e.g. 2000–4000 ms for internet links), check bandwidth |
| Token forgotten | rm data/.admin_token && docker compose restart – the token from docker-compose.yml applies again |
| host-setup.sh not found | Run it with sudo bash host-setup.sh |