Frictionless use of the powerful RIST protocol
8.5K
Containerized RIST stream/tunnel/mux manager with a web UI, built on top of librist.
rubenc2/rist_platform1.0.4latest -> 1.0.41.0.4.rc9 was promoted)1.0.4.rc* (current), 1.0.4.b* (historical), historical 1.0.3.b* / 1.0.3.rc* (promoted to stable)librist version:
1.0.4): 0.2.121.0.3): 0.2.11linux/amd64, linux/arm641.0.4/latest): sha256:3c654d1cd3dc6d0d814cec6c118d4e7e05cc1559d26099804e830d8ded9335091.0.4.rc9): sha256:d022d947cbed8778572f734dcbe0362b450ea433cdb4bcd6d008520242dc185enetwork_mode: host (recommended; required for TUN/TAP flows)Current release: 1.0.4
Status: promoted to stable and latest.
Validation checklist (current state):
AWS + local hosts).1.0.4.librist 0.2.12 with compatibility path for 0.2.11.Tx/Rx) moved into the metadata line for better badge/status readability on crowded cards.loopback-bound emit/join controls).green/orange/red) with /api/system/cpu backend endpoint.1.0.4 (sha256:3c654d1cd3dc6d0d814cec6c118d4e7e05cc1559d26099804e830d8ded933509)
1.0.4 release-candidate track to stable.latest now points to 1.0.4.1.0.4.rc9 UX polish that lets operators close an already-open details pane by clicking the same stream/tunnel/mux card again.1.0.3 (sha256:14577e3424c5319faf1ede9e8d29827820b6ca28a9b943322e34b0e835f763b4)
1.0.3 pre-release track to stable (b1..b10, rc1..rc3).rc3 UX polish:
Settings > Test Stream save shows immediate Saving... feedback and click-guard behavior.Settings > Tools interface selector hides Docker/virtual interfaces for cleaner choices.1.0.2 (sha256:38d22a530f2b14adf6f609f412736622a14b1adfaf4e694e9b614b29e0a05c78)
1.0.2.b1 through 1.0.2.rc3 changes.0 in optional mode.Bug fixes:
error latch caused by transient librist timeout warning lines (for example: Listening peer 1 timed out after ... ms) during startup/reconnect windows.error even while bitrate/RTT/log stats continued to update normally.1.0.1 behavior: runtime auto-recovers error -> connected when fresh metrics/log evidence confirms the peer session is established.~5m,Reset Graph From Now flushes persisted historical graph data for the selected item.Operational:
Bug fixes:
1h, 12h, 24h, 48h): axis now stays anchored to the selected full time window (ending at now), instead of collapsing to recent sample span.1.0.0: payload uses items as the only series field.Enhancements:
window, step).Live, 1h, 12h, 24h, 48h) with live-forward behavior at window-dependent granularity.STATS_RETENTION_DAYS, STATS_RETENTION_CLEANUP_INTERVAL_SECONDS).Operational:
network_mode: host.latest is intended to track the current stable release tag.Known issue reference (RTT):
librist telemetry can intermittently emit corrupted RTT/AVG RTT samples on some paths (for example very large invalid values), which can create unrealistic dashboard spikes.1.0.3: prefer raw rtt when present, reject invalid/out-of-range RTT samples, and keep the last-known-good RTT in the UI path.MAX_VALID_RTT_MS (default 100000).ristsender / ristreceiver processes./data/rist_manager.db.This project is built on top of librist.
librist is maintained by Sergio Ammirata (SipRadius) and contributors in the VideoLAN project:
GPL-3.0-or-later.(c) 2026 RIST Connection Manager contributors.librist: BSD-2-ClauseFFmpeg: LGPL/GPL components (this image uses GPL-enabled FFmpeg build)x264: GPL-2.0-or-laterTHIRD_PARTY_LICENSES.md in the repository for more detail.This is the current compose format used by the project for Linux deployments.
services:
rist-manager:
image: rubenc2/rist_platform:1.0.4
container_name: rist_platform
network_mode: host
build:
context: .
dockerfile: Dockerfile
args:
LIBRIST_VERSION: ${LIBRIST_VERSION:-v0.2.12}
environment:
LIBRIST_VERSION: ${LIBRIST_VERSION:-0.2.12}
LIBRIST_AVAILABLE_VERSIONS: ${LIBRIST_AVAILABLE_VERSIONS:-0.2.11,0.2.12}
DATA_DIR: /data
FRONTEND_DIR: /app/frontend
ACCESS_SESSION_TTL_SECONDS: ${ACCESS_SESSION_TTL_SECONDS:-43200}
HTTP_PORT: ${HTTP_PORT:-8080}
TLS_ENABLED: ${TLS_ENABLED:-1}
TLS_PORT: ${TLS_PORT:-8443}
TLS_CERT_FILE: ${TLS_CERT_FILE:-/data/tls/tls.crt}
TLS_KEY_FILE: ${TLS_KEY_FILE:-/data/tls/tls.key}
TLS_HOSTNAMES: ${TLS_HOSTNAMES:-localhost,127.0.0.1}
WATCH_COPY_START_TIMEOUT_S: ${WATCH_COPY_START_TIMEOUT_S:-10}
WATCH_PLAYABLE_MIN_SEGMENTS: ${WATCH_PLAYABLE_MIN_SEGMENTS:-2}
WATCH_SEGMENT_STALE_AFTER_S: ${WATCH_SEGMENT_STALE_AFTER_S:-15}
RECEIVER_WATCH_TAP_BASE_PORT: ${RECEIVER_WATCH_TAP_BASE_PORT:-17000}
RECEIVER_WATCH_TAP_PORT_SPAN: ${RECEIVER_WATCH_TAP_PORT_SPAN:-20000}
TEST_STREAM_PRIMARY_PORT: ${TEST_STREAM_PRIMARY_PORT:-15000}
TEST_STREAM_WATCH_PORT: ${TEST_STREAM_WATCH_PORT:-15001}
TEST_STREAM_DISTRIBUTION_MODE: ${TEST_STREAM_DISTRIBUTION_MODE:-multicast}
TEST_STREAM_MULTICAST_GROUP: ${TEST_STREAM_MULTICAST_GROUP:-239.255.42.99}
TEST_STREAM_MULTICAST_HOST_LOCAL_ONLY: ${TEST_STREAM_MULTICAST_HOST_LOCAL_ONLY:-1}
TEST_STREAM_MULTICAST_MIFACE: ${TEST_STREAM_MULTICAST_MIFACE:-lo}
TEST_STREAM_MULTICAST_LOCALADDR: ${TEST_STREAM_MULTICAST_LOCALADDR:-127.0.0.1}
TEST_STREAM_MULTICAST_TTL: ${TEST_STREAM_MULTICAST_TTL:-1}
MAX_VALID_RTT_MS: ${MAX_VALID_RTT_MS:-100000}
STATS_RETENTION_DAYS: ${STATS_RETENTION_DAYS:-14}
STATS_RETENTION_CLEANUP_INTERVAL_SECONDS: ${STATS_RETENTION_CLEANUP_INTERVAL_SECONDS:-3600}
LIVE_STATS_BUFFER_LIMIT: ${LIVE_STATS_BUFFER_LIMIT:-12000}
RECONNECT_INCIDENT_WINDOW_SECONDS: ${RECONNECT_INCIDENT_WINDOW_SECONDS:-30}
AUDIT_LOG_ENABLED: ${AUDIT_LOG_ENABLED:-1}
AUDIT_LOG_RETENTION_DAYS: ${AUDIT_LOG_RETENTION_DAYS:-30}
AUDIT_LOG_CLEANUP_INTERVAL_SECONDS: ${AUDIT_LOG_CLEANUP_INTERVAL_SECONDS:-3600}
AUDIT_LOG_MAX_ROWS: ${AUDIT_LOG_MAX_ROWS:-500000}
AUDIT_LOG_DOWNLOAD_MAX_ROWS: ${AUDIT_LOG_DOWNLOAD_MAX_ROWS:-50000}
STREAM_LOG_MAX_MB: ${STREAM_LOG_MAX_MB:-100}
volumes:
- rist_manager_data:/data
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
- ${GPU_DRIVER_DEVICE:-/dev/dri:/dev/dri}
restart: unless-stopped
volumes:
rist_manager_data:
GPU_DRIVER_DEVICE defaults to /dev/dri:/dev/dri. Override it for hosts that expose a specific render node path.
TEST_STREAM_DISTRIBUTION_MODE=multicast), so one generated test feed can be attached to one or many sender streams.TEST_STREAM_MULTICAST_HOST_LOCAL_ONLY=1TEST_STREAM_MULTICAST_MIFACE=loTEST_STREAM_MULTICAST_LOCALADDR=127.0.0.1TEST_STREAM_DISTRIBUTION_MODE=legacy and recreate the container (restores single-sender unicast assignment behavior).-c:v copy -c:a copy-hls_time 4-hls_list_size 3-hls_flags delete_segments+append_listsine=frequency=440:beep_factor=4),service_provider=RIST, service_name=RIST_Test.docker compose pull
docker compose up -d
UI/API endpoints:
http://<host>:8080https://<host>:8443 (self-signed by default)Optional bridge-mode startup (secondary / non-TUN testing):
docker compose -f docker-compose.yml -f docker-compose.bridge.yml up -d
Bridge mode is intended for non-TUN testing workflows only.
docker-compose.bridge.yml8080/tcp, 8443/tcp12000-12003/udpRecommended bridge-mode lifecycle:
docker compose -f docker-compose.yml -f docker-compose.bridge.yml down
docker compose -f docker-compose.yml -f docker-compose.bridge.yml pull
docker compose -f docker-compose.yml -f docker-compose.bridge.yml up -d
docker compose -f docker-compose.yml -f docker-compose.bridge.yml ps
Operational guidance:
udp://@:12000).ports: mappings.Run the container with network_mode: host because RIST transport depends on direct UDP behavior and predictable endpoint binding:
port and port+1)./dev/net/tun) so interface lifecycle and traffic are handled at host network scope.GPU_DRIVER_DEVICE=/dev/dri:/dev/dri) for VAAPI.Bridge mode may work for limited non-TUN tests, but host networking is the intended deployment model.
From Settings in the web UI you can customize:
png, jpg, webp, gif, svg).HTTP_PORT (default 8080)TLS_ENABLED (default 1)TLS_PORT (default 8443)TLS_CERT_FILE (default /data/tls/tls.crt)TLS_KEY_FILE (default /data/tls/tls.key)TLS_HOSTNAMES (default localhost,127.0.0.1)LIBRIST_VERSION (default 0.2.12)LIBRIST_AVAILABLE_VERSIONS (default 0.2.11,0.2.12)DATA_DIR (default /data)FRONTEND_DIR (default /app/frontend)ACCESS_SESSION_TTL_SECONDS (default 43200)WATCH_COPY_START_TIMEOUT_S (default 10)WATCH_PLAYABLE_MIN_SEGMENTS (default 2)WATCH_SEGMENT_STALE_AFTER_S (default 15)RECEIVER_WATCH_TAP_BASE_PORT (default 17000)RECEIVER_WATCH_TAP_PORT_SPAN (default 20000)TEST_STREAM_PRIMARY_PORT (default 15000)TEST_STREAM_WATCH_PORT (default 15001)TEST_STREAM_DISTRIBUTION_MODE (default multicast, options: multicast, legacy)TEST_STREAM_MULTICAST_GROUP (default 239.255.42.99)TEST_STREAM_MULTICAST_HOST_LOCAL_ONLY (default 1)TEST_STREAM_MULTICAST_MIFACE (default lo)TEST_STREAM_MULTICAST_LOCALADDR (default 127.0.0.1)TEST_STREAM_MULTICAST_TTL (default 1)MAX_VALID_RTT_MS (default 100000)GPU_DRIVER_DEVICE (default /dev/dri:/dev/dri)STATS_RETENTION_DAYS (default 14)STATS_RETENTION_CLEANUP_INTERVAL_SECONDS (default 3600)LIVE_STATS_BUFFER_LIMIT (default 12000)AUDIT_LOG_ENABLED (default 1)AUDIT_LOG_RETENTION_DAYS (default 30)AUDIT_LOG_CLEANUP_INTERVAL_SECONDS (default 3600)AUDIT_LOG_MAX_ROWS (default 500000)AUDIT_LOG_DOWNLOAD_MAX_ROWS (default 50000)RECONNECT_INCIDENT_WINDOW_SECONDS (default 30)STREAM_LOG_MAX_MB (default 100)Important behavior:
LIBRIST_VERSION in compose build.args determines the librist source tag compiled into the image.LIBRIST_VERSION should match the compiled version so UI/API version reporting is accurate.LIBRIST_AVAILABLE_VERSIONS controls the Library selector list.target_version in UI does not switch binaries until the image is rebuilt.How to adopt a new librist release (example 0.2.12):
.env):LIBRIST_VERSION=v0.2.12
LIBRIST_AVAILABLE_VERSIONS=0.2.11,0.2.12
docker compose down
docker compose build --no-cache rist-manager
docker compose up -d
curl -s http://<host>:8080/api/system/librist
If you use prebuilt Docker Hub images, env vars alone cannot replace the bundled librist binary. Use an image tag that already includes the new librist release, or rebuild locally with updated LIBRIST_VERSION.
Stored in volume rist_manager_data mounted at /data:
rist_manager.db (config + runtime metadata)tls/ (certificate/key when auto-generated)logs/streams/stream_<id>.log (full per-session stream logs)network_mode: host).CAP_NET_ADMIN./dev/net/tun./dev/dri:/dev/dri.GPU_DRIVER_DEVICE (example: /dev/dri/renderD128:/dev/dri/renderD128).port and port+1).GET /api/healthGET /openapi.jsonGET /docs/api/connections/{id}/stats, /api/tunnels/{id}/stats):
itemsContent type
Image
Digest
sha256:dbd63e688…
Size
219.2 MB
Last updated
about 2 months ago
docker pull rubenc2/rist_platform:1.0.5-dev5