A self-hosted web interface for managing multiple RTMP inputs and relay destinations.
1.0K
A lightweight, self-hosted RTMP relay with a web interface. Send video from OBS, a PlayStation 4/5 or Xbox streaming setup, a camera, a hardware encoder, or any other RTMP-capable source, then relay it to multiple streaming platforms simultaneously.
Documentation and source: github.com/raykimurayyz/nginx-rtmp

/app and /live routes.Create a Docker-managed volume and start the container:
docker volume create nginx-rtmp-data
docker run -d \
--name nginx-rtmp \
--restart unless-stopped \
--security-opt no-new-privileges:true \
--cap-drop ALL \
--read-only \
--tmpfs /tmp:rw,noexec,nosuid,size=64m \
-p 1935:1935 \
-p 8080:8080 \
-v nginx-rtmp-data:/data \
raykimurayyz/nginx-rtmp:latest
Open the management page:
http://YOUR_DOCKER_HOST:8080
Create or edit input routes, then add the server URL and stream key—or a complete RTMP push URL—supplied by each destination platform. Select which routes should relay to each destination.
Configure OBS or another publisher with the default generic route:
Server: rtmp://YOUR_DOCKER_HOST:1935/live
Stream key: main
For a compatible PlayStation interception workflow, use rtmp://YOUR_DOCKER_HOST:1935/app. You can create additional application paths in the browser.
Start streaming. Each input is automatically relayed to its selected, enabled destinations.
Create compose.yaml:
services:
nginx-rtmp:
image: raykimurayyz/nginx-rtmp:latest
container_name: nginx-rtmp
restart: unless-stopped
ports:
- "1935:1935"
- "8080:8080"
volumes:
- nginx-rtmp-data:/data
read_only: true
tmpfs:
- /tmp:rw,noexec,nosuid,size=64m
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
volumes:
nginx-rtmp-data:
Start it:
docker compose up -d
Check its status and logs:
docker compose ps
docker compose logs -f
The application stores input routes, server settings, destinations, and secrets in:
/data/config.json
Mount /data from a named volume as shown above. The volume exists independently of the container, so configuration remains available after the image or container is replaced. A backup of the previous valid configuration is kept at /data/config.json.backup, and older version 1 configurations are migrated automatically.
Do not run docker compose down -v unless you intentionally want to delete the saved configuration.
Stream keys are stored as plain text inside the volume because NGINX needs them to connect to destination platforms. Protect access to the Docker host and its volumes.
With Docker Compose:
docker compose pull
docker compose up -d
The existing nginx-rtmp-data volume is reused automatically.
For reproducible deployments, replace latest in your Compose file with a complete version tag such as v0.2.0.
| Port | Purpose |
|---|---|
1935/tcp | RTMP input from OBS, a game-console streaming setup, a camera, an encoder, or another RTMP-capable source |
8080/tcp | Web management interface and API |
The raw NGINX statistics endpoint listens only inside the container and is not published.
latest — most recently published stable versionvX.Y.Z — immutable application releaselinux/amd64linux/arm64The image includes a built-in HTTP health check. View the current state with:
docker inspect --format '{{.State.Health.Status}}' nginx-rtmp
rtmp:// destinations. RTMPS, SRT, transcoding, and platform-specific signing are not included.8080 directly to the public internet.The image builds verified, unmodified releases of NGINX and nginx-rtmp-module on Alpine Linux.
The original RTMP Relay Manager code is licensed under the MIT License. NGINX and nginx-rtmp-module retain their respective BSD 2-Clause licenses. The corresponding license texts are included in the image under /usr/share/licenses/.
For complete usage instructions, security details, development information, and third-party notices, visit:
Content type
Image
Digest
sha256:ca451cf75…
Size
22.4 MB
Last updated
23 days ago
docker pull raykimurayyz/nginx-rtmp