feat: add Oryx (SRS) media streaming template

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Mauricio Siu
2026-07-14 14:06:04 -06:00
parent c60bfa8c72
commit af8b535d34
5 changed files with 129 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
version: "3.8"
services:
oryx:
image: ossrs/oryx:5.15.20
restart: unless-stopped
ports:
# RTMP, WebRTC and SRT are not HTTP protocols, so Traefik cannot route
# them through the domain. They must be published directly on the host
# (same approach as the poste.io template with its mail ports). Use the
# server IP (not the domain) for these protocols.
- "1935:1935" # RTMP ingest/playback (TCP)
- "8000:8000/udp" # WebRTC media transport (UDP)
- "10080:10080/udp" # SRT ingest/playback (UDP)
volumes:
- oryx-data:/data
volumes:
oryx-data: {}

View File

@@ -0,0 +1,29 @@
# Oryx (SRS Stack)
Oryx is an all-in-one video streaming server built on [SRS](https://github.com/ossrs/srs), with a web console for managing streams, recording, forwarding, transcoding and virtual live streaming.
## First login
Open the domain assigned to this service. On the first visit Oryx asks you to **create the admin password** — set it right away, since anyone who reaches the page first can claim the instance. The password (and all other state) is stored in the `oryx-data` volume, so it survives restarts and upgrades.
## Publishing streams
The web console (Scenarios > Streaming) shows ready-to-copy URLs that include your stream secret. The streaming protocols are **not HTTP**, so Traefik cannot route them through your domain — they are published directly on the server's host ports instead. Use the **server IP address** (not the domain) for these:
| Protocol | URL format | Host port |
| --- | --- | --- |
| RTMP (OBS, ffmpeg) | `rtmp://SERVER_IP/live/livestream?secret=xxx` | `1935/tcp` |
| SRT | `srt://SERVER_IP:10080?streamid=#!::r=live/livestream,secret=xxx,m=publish` | `10080/udp` |
| WebRTC (WHIP) | `https://your-domain/rtc/v1/whip/?app=live&stream=livestream&secret=xxx` | signaling via domain, media via `8000/udp` |
Make sure your server firewall / cloud security group allows `1935/tcp`, `8000/udp` and `10080/udp`. Because these are fixed host ports, only one Oryx instance can run per server.
## Playback
HTTP-based playback goes through your domain (HTTPS via Traefik):
- HLS: `https://your-domain/live/livestream.m3u8`
- HTTP-FLV: `https://your-domain/live/livestream.flv`
- WebRTC (WHEP): available from the console's preview page; media flows over `8000/udp`.
If WebRTC playback or publishing connects but produces no media, verify that UDP port `8000` is reachable from the client — WebRTC media bypasses the reverse proxy entirely.

52
blueprints/oryx/logo.svg Normal file
View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<svg viewBox="0 0 64 32" height="32px" width="64px" id="svg2" version="1.1" xmlns="http://www.w3.org/2000/svg">
<defs id="defs6">
<linearGradient id="linearGradient28" spreadMethod="pad" gradientTransform="matrix(148.91527,0,0,-148.91527,151.81076,224.17897)" gradientUnits="userSpaceOnUse" y2="0" x2="1" y1="0" x1="0">
<stop id="stop24" offset="0" style="stop-opacity:1;stop-color:#3caae1"/>
<stop id="stop26" offset="1" style="stop-opacity:1;stop-color:#b65c9e"/>
</linearGradient>
<linearGradient id="linearGradient48" spreadMethod="pad" gradientTransform="matrix(155.05911,0,0,-155.05911,49.431911,216.24139)" gradientUnits="userSpaceOnUse" y2="0" x2="1" y1="0" x1="0">
<stop id="stop44" offset="0" style="stop-opacity:1;stop-color:#2ca0d4"/>
<stop id="stop46" offset="1" style="stop-opacity:1;stop-color:#305ba7"/>
</linearGradient>
<clipPath id="clipPath58" clipPathUnits="userSpaceOnUse">
<path id="path56" d="M 0,350.158 H 350.158 V 0 H 0 Z"/>
</clipPath>
</defs>
<g transform="matrix(0.172146, 0, 0, -0.188192, -9.741413, 53.288761)" id="g10" style="">
<g id="g12" style="" transform="matrix(0.654687, 0, 0, 0.654687, 47.49966, 55.96529)">
<g id="g14">
<g id="g20">
<g id="g22">
<path id="path30" style="fill:url(#linearGradient28);stroke:none" d="m 151.811,280.659 54.062,-54.064 14.238,14.586 c 13.253,11.772 33.681,8.665 42.764,-6.48 v 0 c 6.949,-11.585 4.152,-27.659 -6.248,-35.919 v 0 c -11.647,-9.249 -27.453,-8.66 -37.707,1.501 v 0 c -8.318,8.241 -16.529,16.588 -24.814,24.861 v 0 c -13.578,13.558 -26.814,27.483 -40.842,40.56 v 0 c -0.155,0.144 -0.318,0.269 -0.474,0.412 v 0 c 1.246,-1.658 40.823,-54.57 51.701,-97.422 v 0 c 14.746,-10.175 31.762,-12.852 50.25,-8.006 v 0 c 35.557,9.319 55.709,47.52 41.276,82.815 v 0 c -9.385,22.952 -27.32,35.949 -52.141,38.356 v 0 c -15.155,1.471 -27.697,-2.422 -38.597,-9.506 v 0 l -8.305,8.306 c -6.236,6.235 -14.409,9.353 -22.581,9.353 v 0 c -8.173,0 -16.346,-3.118 -22.582,-9.353"/>
</g>
</g>
</g>
</g>
<g id="g32" style="" transform="matrix(0.653075, 0, 0, 0.653075, 48.56073, 55.406696)">
<g id="g34">
<g id="g40">
<g id="g42">
<path id="path50" style="fill:url(#linearGradient48);stroke:none" d="m 50.99,234 c -1.85,-8.185 -1.733,-14.379 -1.264,-20.194 v 0 c 2.822,-30.213 29.126,-54.494 59.465,-55.353 v 0 c 13.788,-0.391 25.237,3.439 35.23,9.815 v 0 l 8.671,-8.669 c 12.471,-12.471 32.691,-12.471 45.163,0 v 0 l -52.152,52.151 c -0.639,0.65 -1.262,1.284 -1.904,1.935 v 0 c -4.061,-4.127 -8.071,-8.229 -12.109,-12.304 v 0 c -7.927,-8.003 -17.355,-11.004 -28.326,-8.029 v 0 C 92.462,196.418 84.207,206.453 83.4,217.68 v 0 c -0.881,12.257 5.312,23.099 16.04,28.075 v 0 c 10.826,5.024 23.504,2.646 32.091,-5.942 v 0 c 21.291,-21.289 42.367,-42.8 63.987,-63.751 v 0 c 2.884,-2.793 5.882,-5.235 8.973,-7.368 v 0 c -16.324,63.52 -50.455,95.764 -51.701,97.422 v 0 c -12.077,11.041 -26.76,16.121 -41.224,16.121 v 0 C 84.3,282.238 57.808,264.189 50.99,234"/>
</g>
</g>
</g>
</g>
<g id="g52" style="" transform="matrix(0.797304, 0, 0, 0.797304, 194.474228, 136.918259)">
<g clip-path="url(#clipPath58)" id="g54">
<g transform="translate(126.2779,90.4397)" id="g60">
<path id="path62" style="fill:#494545;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 h -19.449 c -3.396,0.381 -5.093,2.049 -5.093,5.005 l 0.132,0.879 c 0.731,2.487 2.385,3.731 4.961,3.731 H 5.357 c 1.2,0 2.327,0.16 3.381,0.484 4.479,1.843 6.717,5.005 6.717,9.483 0,0.233 -0.073,0.351 -0.219,0.351 h -35.783 c -2.458,0 -5.034,-0.776 -7.727,-2.328 -4.419,-3.453 -6.629,-7.361 -6.629,-11.721 0,-2.167 0.337,-4.289 1.009,-6.366 2.752,-6.586 8.109,-9.879 16.069,-9.879 h 18.09 c 3.395,-0.352 5.092,-2.005 5.092,-4.961 L 5.226,-16.2 c -0.732,-2.488 -2.387,-3.732 -4.961,-3.732 h -24.807 c -1.199,0 -2.326,-0.175 -3.381,-0.527 -4.477,-1.815 -6.717,-4.962 -6.717,-9.439 0,-0.264 0.074,-0.396 0.22,-0.396 H 1.362 c 2.458,0 5.034,0.79 7.728,2.371 4.419,3.453 6.629,7.361 6.629,11.723 0,2.371 -0.337,4.404 -1.011,6.102 C 12.075,-3.365 7.172,0 0,0"/>
</g>
<g transform="translate(257.773,80.342)" id="g64">
<path id="path66" style="fill:#494545;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c -2.633,6.732 -7.536,10.098 -14.708,10.098 h -19.449 c -3.396,0.381 -5.093,2.048 -5.093,5.005 l 0.131,0.878 c 0.732,2.488 2.386,3.732 4.962,3.732 h 24.805 c 1.201,0 2.328,0.16 3.381,0.483 4.48,1.844 6.717,5.005 6.717,9.484 0,0.233 -0.072,0.35 -0.218,0.35 h -35.783 c -2.458,0 -5.035,-0.775 -7.727,-2.327 -4.419,-3.453 -6.63,-7.361 -6.63,-11.722 0,-2.167 0.337,-4.289 1.01,-6.366 2.751,-6.586 8.108,-9.879 16.069,-9.879 h 18.089 c 3.395,-0.351 5.092,-2.005 5.092,-4.961 l -0.13,-0.878 c -0.733,-2.488 -2.387,-3.731 -4.962,-3.731 H -39.25 c -1.2,0 -2.327,-0.176 -3.381,-0.527 -4.477,-1.816 -6.717,-4.962 -6.717,-9.44 0,-0.263 0.073,-0.395 0.22,-0.395 h 35.781 c 2.459,0 5.035,0.79 7.728,2.371 4.419,3.453 6.63,7.361 6.63,11.722 C 1.011,-3.731 0.674,-1.698 0,0"/>
</g>
<g transform="translate(160.6578,100.5822)" id="g68">
<path id="path70" style="fill:#494545;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 h 7.033 v 5.847 c 0,1.153 0.634,2.204 1.654,2.741 1.021,0.537 2.245,0.467 3.195,-0.185 L 20.445,2.54 C 21.284,1.965 21.787,1.017 21.791,0 h 2.004 c 2.986,0 4.77,-1.713 5.356,-5.138 L 29.02,-5.839 c -0.674,-3.015 -2.416,-4.523 -5.225,-4.523 H 0 Z m 23.531,-20.108 c 2.518,0 5.182,0.834 7.991,2.503 4.594,3.306 6.894,7.507 6.894,12.6 0,4.126 -1.626,7.815 -4.874,11.064 -3.103,2.545 -5.956,3.82 -8.562,3.82 H -9.528 l -0.22,-0.265 v -49.217 l 0.133,-0.13 c 2.048,0 3.832,0.482 5.356,1.448 2.838,2.107 4.259,4.317 4.259,6.63 v 20.722 l 26.648,-26.518 c 1.288,-1.99 3.66,-2.986 7.114,-2.986 3.891,0.235 5.84,0.908 5.84,2.02 v 0.22 c 0,0.146 -5.944,6.176 -17.826,18.089 z"/>
</g>
<g transform="translate(180.5738,101.9846)" id="g72">
<path id="path74" style="fill:#494545;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -8.563,5.863 c -0.323,0.222 -0.688,0.333 -1.055,0.333 -0.299,0 -0.598,-0.072 -0.878,-0.22 -0.627,-0.33 -1,-0.95 -1,-1.659 V -7.41 c 0,-0.708 0.373,-1.327 1,-1.657 0.627,-0.332 1.349,-0.289 1.933,0.111 L 0,-3.092 c 0.518,0.354 0.815,0.918 0.815,1.545 C 0.815,-0.918 0.518,-0.354 0,0"/>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

22
blueprints/oryx/meta.json Normal file
View File

@@ -0,0 +1,22 @@
{
"id": "oryx",
"name": "Oryx",
"version": "5.15.20",
"description": "Oryx (formerly SRS Stack) is an all-in-one, open-source video streaming server with a web console. It ingests RTMP, WebRTC (WHIP) and SRT streams and plays them back over HLS, HTTP-FLV and WebRTC (WHEP), with built-in recording, forwarding, transcoding and virtual live streaming.",
"logo": "logo.svg",
"links": {
"github": "https://github.com/ossrs/oryx",
"website": "https://ossrs.io/",
"docs": "https://ossrs.io/lts/en-us/docs/v6/doc/getting-started-oryx",
"docker": "https://hub.docker.com/r/ossrs/oryx"
},
"tags": [
"streaming",
"video",
"rtmp",
"webrtc",
"srt",
"hls",
"media-server"
]
}

View File

@@ -0,0 +1,8 @@
[variables]
main_domain = "${domain}"
[config]
[[config.domains]]
serviceName = "oryx"
port = 2022
host = "${main_domain}"