/srs-cloud

SRS Cloud is a video cloud solution that is lightweight, open-source, and based on Go, Reactjs, SRS, FFmpeg, WebRTC, etc.

Primary LanguageJavaScriptMIT LicenseMIT

SRS-Cloud

A lightweight open-source video cloud based on Nodejs, SRS, FFmpeg, WebRTC, etc.

Usage

Run srs-cloud in one docker:

docker run --rm -it -p 2022:2022 -p 1935:1935/tcp -p 1985:1985/tcp \
  -p 8080:8080/tcp -p 8000:8000/udp -p 10080:10080/udp --name srs-cloud \
  ossrs/srs-cloud:platform-1

Note: Please use registry.cn-hangzhou.aliyuncs.com/ossrs/srs-cloud:platform-1 in China.

Then open http://localhost:2022/mgmt in browser.

Then open http://localhost:2022/mgmt in browser.

All data will be reset when restarting, so please mount volumes if want to save data to local disk:

docker run --rm -it -p 2022:2022 -p 1935:1935/tcp -p 1985:1985/tcp \
  -p 8080:8080/tcp -p 8000:8000/udp -p 10080:10080/udp --name srs-cloud \
  -v $HOME/db:/data ossrs/srs-cloud:platform-1

You have the option to modify the volumes for srs-cloud and direct them to different directories.

  • /data The global data directory.
    • redis The redis data directory, the publish secret and record configuration.
    • srs-cloud The data directory for srs-cloud
      • config The mgmt password and cloud configuration.
      • record The record storage directory, save record files.
      • vlive The storage directory for virtual live, save video files.

You can use environment variables to modify the settings.

  • MGMT_PASSWORD: The mgmt administrator password.
  • REACT_APP_LOCALE: The i18n config for ui, en or zh, default to zh.

Note: Kindly utilize the command such as docker run -e REACT_APP_LOCALE=en to modify the environment.

To access additional environment variables, please refer to the Environments section.

FAQ

  1. English FAQ
  2. 中文 FAQ

Tutorials

Other more use scenarios is on the way, please read this post.

Architecture

The architecture of srs-cloud by mermaid

flowchart LR;
  nginx --> mgmt(mgmt<br/>by Go);
  mgmt --> SRS --> Hooks(platform/hooks) --> StreamAuth & DVR & VoD;
  DVR --> COS;
  mgmt --> FFmpeg(platform/ffmpeg);
  mgmt --- Platform(platform by Go);
  SRS --- FFmpeg(platform/ffmpeg);
  mgmt --> Upgrade --> Release;
  mgmt --> TencentCloud(platform/TencentCloud) --> CAM[CAM/COS/VoD];
  mgmt --> Prometheus --- NodeExporter;
  mgmt --> Docker;
  mgmt --> Env[(.env<br/>credentials.txt)];
  mgmt --> Redis[(Redis KV)];

Note: It's a single node, also light-weighted, video cloud for tiny company, personal user and starter.

flowchart LR;
  nginx --> mgmt(mgmt<br/>by Go);
  aaPanel --> mgmt;
  aaPanel --> nginx;

Note: This is an optional workflow for user to use aaPanel to deploy srs-cloud.

Ports

The ports allocated:

Module TCP Ports UDP Ports Notes
SRS 1935, 1985, 8080,
8088, 1990, 554,
8936
8000, 8935, 10080,
1989
See SRS ports
platform 2024 - Mount at /terraform/v1/mgmt/, /terraform/v1/hooks/, /terraform/v1/ffmpeg/ and /terraform/v1/tencent/
releases 2023 - Mount at /terraform/v1/releases
mgmt 2022 - Mount at /mgmt/ and /terraform/v1/mgmt/
node-exporter 9100 - -
redis 56379 - -

Note: Hooks(2021) has been migrated to platform(2024).

Note: FFmpeg(2019) has been migrated to platform(2024).

Note: TencentCloud(2020) has been migrated to platform(2024).

Features

The features that we're developing:

  • A mgmt support authentication and automatic updates.
  • Run SRS in docker, query status by docker and SRS API.
  • Support publish by RTMP/WebRTC, play by RTMP/HTTP-FLV/HLS/WebRTC.
  • SRS container use docker logs json-file and rotate for logging.
  • Support high-resolution and realtime(200~500ms) live streaming by SRT.
  • Run SRS hooks in docker, to callback by SRS server.
  • Support publish by SRT, play by RTMP/HTTP-FLV/HLS/WebRTC/SRT.
  • Support DVR to tencent cloud storage, see #1193.
  • Change redis port and use randomly password.
  • Support integrity with tencent cloud VoD.
  • Forward stream to multiple platforms, see #2676.
  • Support WordPress Plugin or here.
  • Support Typecho Plugin.
  • Support aaPanel to install on any linux.
  • Support DVR to local disk.
  • Support upgrade to latest version manually.
  • Support HTTPS by let's encrypt with certbot.
  • Support GB28181 by SRS 5.0 container.
  • Support live streaming transcoding by FFmpeg, see #2869.
  • Support virtual live streaming, covert file or other resource to live.
  • Support WebRTC face to face chat, see #2857.
  • Support WebRTC video chat room, see #2924.
  • Support a set of tools for developer, see #2891.
  • Collect logs of mgmt and containers together.
  • Stop, restart and upgrade containers.
  • Support logrotate to manage the logs.
  • Enhance prometheus API with authentication.
  • Integrate with prometheus and node-exporter.

APIs

Mgmt:

  • /terraform/v1/host/versions Public version api.
  • /terraform/v1/host/exec Exec command sync, response the stdout and stderr.
  • /terraform/v1/releases Version management for all components.

Platform:

  • /terraform/v1/mgmt/versions Public version api.
  • /terraform/v1/mgmt/init Whether mgmt initialized.
  • /terraform/v1/mgmt/check Check whether system is ok.
  • /terraform/v1/mgmt/token System auth with token.
  • /terraform/v1/mgmt/login System auth with password.
  • /terraform/v1/mgmt/status Query the version of mgmt.
  • /terraform/v1/mgmt/envs Query the envs of mgmt.
  • /terraform/v1/mgmt/containers Query and upgrade SRS container.
  • /terraform/v1/mgmt/bilibili Query the video information.
  • /terraform/v1/mgmt/beian/query Query the beian information.
  • /terraform/v1/mgmt/beian/update Update the beian information.
  • /terraform/v1/mgmt/secret/query Query the api secret for OpenAPI.
  • /terraform/v1/mgmt/secret/token Create token for OpenAPI.
  • /terraform/v1/mgmt/nginx/hls Update NGINX config, to enable HLS delivery.
  • /terraform/v1/mgmt/upgrade Upgrade the mgmt to latest version.

Also by platform module:

  • /terraform/v1/hooks/srs/verify Hooks: Verify the stream request URL of SRS.
  • /terraform/v1/hooks/srs/secret/query Hooks: Query the secret to generate stream URL.
  • /terraform/v1/hooks/srs/secret/update Hooks: Update the secret to generate stream URL.
  • /terraform/v1/hooks/srs/secret/disable Hooks: Disable the secret for authentication.
  • /terraform/v1/hooks/srs/hls Hooks: Handle the on_hls event.
  • /terraform/v1/hooks/record/query Hooks: Query the Record pattern.
  • /terraform/v1/hooks/record/apply Hooks: Apply the Record pattern.
  • /terraform/v1/hooks/record/remove Hooks: Remove the Record files.
  • /terraform/v1/hooks/record/files Hooks: List the Record files.
  • /terraform/v1/hooks/record/hls/:uuid.m3u8 Hooks: Generate HLS/m3u8 url to preview or download.
  • /terraform/v1/hooks/record/hls/:uuid/index.m3u8 Hooks: Serve HLS m3u8 files.
  • /terraform/v1/hooks/record/hls/:dir/:m3u8/:uuid.ts Hooks: Serve HLS ts files.
  • /terraform/v1/hooks/dvr/apply Hooks: Apply the DVR pattern.
  • /terraform/v1/hooks/dvr/query Hooks: Query the DVR pattern.
  • /terraform/v1/hooks/dvr/files Hooks: List the DVR files.
  • /terraform/v1/hooks/dvr/hls/:uuid.m3u8 Hooks: Generate HLS/m3u8 url to preview or download.
  • /terraform/v1/hooks/vod/query Hooks: Query the VoD pattern.
  • /terraform/v1/hooks/vod/apply Hooks: Apply the VoD pattern.
  • /terraform/v1/hooks/vod/files Hooks: List the VoD files.
  • /terraform/v1/hooks/vod/hls/:uuid.m3u8 Hooks: Generate HLS/m3u8 url to preview or download.
  • /terraform/v1/tencent/cam/secret Tencent: Setup the CAM SecretId and SecretKey.
  • /terraform/v1/ffmpeg/forward/secret FFmpeg: Setup the forward secret to live streaming platforms.
  • /terraform/v1/ffmpeg/forward/streams FFmpeg: Query the forwarding streams.

Market:

  • /api/ SRS: HTTP API of SRS media server.
  • /rtc/ SRS: HTTP API for WebERTC of SRS media server.
  • /*/*.(flv|m3u8|ts|aac|mp3) SRS: Media stream for HTTP-FLV, HLS, HTTP-TS, HTTP-AAC, HTTP-MP3.

Static Files:

  • /tools/ A set of H5 tools, like simple player, xgplayer, etc, serve by mgmt.
  • /console/ The SRS console, serve by mgmt.
  • /players/ The SRS player, serve by mgmt.
  • /mgmt/ The ui for mgmt, serve by mgmt.

Removed API:

  • /terraform/v1/mgmt/strategy Toggle the upgrade strategy.
  • /prometheus Prometheus: Time-series database and monitor.
  • /terraform/v1/mgmt/nginx/proxy Setup a reverse proxy location.
  • /terraform/v1/mgmt/dns/lb HTTP-DNS for hls load balance.
  • /terraform/v1/mgmt/dns/backend/update HTTP-DNS: Update the backend servers for hls load balance.
  • /terraform/v1/mgmt/nginx/homepage Setup the homepage redirection.
  • /terraform/v1/mgmt/window/query Query the upgrade time window.
  • /terraform/v1/mgmt/window/update Update the upgrade time window.
  • /.well-known/acme-challenge/ HTTPS verify mount for letsencrypt.
  • /terraform/v1/mgmt/ssl Config the system SSL config.
  • /terraform/v1/mgmt/letsencrypt Config the let's encrypt SSL.
  • /terraform/v1/mgmt/pubkey Update the access for platform administrator pubkey.

Depends

The software we depend on:

  • Docker, apt-get install -y docker.io
    • Redis, apt-get install -y redis
    • Nginx, apt-get install -y nginx
      • SSL: mgmt/containers/ssl
  • Certbot, docker --name certbot
    • Verify webroot: mgmt/containers/www/.well-known/acme-challenge/
    • Cert files: mgmt/containers/etc/letsencrypt/live/
  • SRS, docker --name srs-server
    • Config: mgmt/containers/conf/srs.conf mount as /usr/local/srs/conf/lighthouse.conf
    • Volume: mgmt/containers/objs/nginx/html mount as /usr/local/srs/objs/nginx/html
  • srs-hooks, docker --name srs-hooks
    • Volume: mgmt/containers/objs/nginx/html mount as /usr/local/mgmt/containers/objs/nginx/html
  • tencent-cloud, docker --name tencent-cloud
    • CAM Authentication by secretId and secretKey.
  • ffmpeg, docker --name ffmpeg

Environments

The optional environments defined by mgmt/.env:

  • CLOUD: dev|bt|aapanel|droplet|docker, The cloud platform name, DEV for development.
  • REGION: ap-guangzhou|ap-singapore|sgp1, The region for upgrade source.
  • SOURCE: github|gitee, The source code for upgrading.
  • REGISTRY: docker.io|registry.cn-hangzhou.aliyuncs.com, The docker registry.
  • MGMT_LISTEN: The listen port for mgmt HTTP server. Default: 2022
  • PLATFORM_LISTEN: The listen port for platform HTTP server. Default: 2024
  • SRS_DOCKERIZED: true|false Indicates the OS is in docker.

For mgmt to start platform in docker, because it can't access redis which is started by platform:

  • PLATFORM_DOCKER: Whether run platform in docker. Default: true
  • MGMT_DOCKER: Whether run mgmt in docker. Default: false

For testing the specified service:

  • NODE_ENV: development|production, if development, use local redis; otherwise, use mgmt.srs.local in docker.
  • LOCAL_RELEASE: true|false, whether use local release service.

For github actions to control the containers:

  • SRS_DOCKER: srs to enfore use ossrs/srs docker image.
  • USE_DOCKER: true|false, if false, disable all docker containers.
  • SRS_UTEST: true|false, if true, running in utest mode.

For mgmt and containers to connect to redis:

  • REDIS_PASSWORD: The redis password.
  • REDIS_PORT: The redis port.

Environments for react ui:

  • PUBLIC_URL: The mount prefix.
  • BUILD_PATH: The output build path, default to build.

Note: The env for react must start with REACT_APP_, please read this post.

Removed variables in .env:

  • SRS_PLATFORM_SECRET: The mgmt api secret for token generating and verifying.

Please restart service when .env changed.

Develop All in macOS

Start redis by docker:

docker run --name redis -d --rm -it -v $HOME/db/redis:/data -p 6379:6379 redis

Start SRS in macOS:

(cd platform && ~/git/srs/trunk/objs/srs -c containers/conf/srs.release-local.conf)

Run the mgmt backend, or run in GoLand:

(cd mgmt && bash auto/init_global && PLATFORM_DOCKER=false go run .)

Run the platform backend, or run in GoLand:

(cd platform && go run .)

Run the platform react ui, or run in WebStorm:

(cd platform/ui && npm install && npm start)

Access the browser: http://localhost:3000

Develop All in One Docker

Run srs-cloud in a docker.

First, build image:

docker build -t platform-dev -f platform/Dockerfile.dev .

Then start the development docker:

docker run --rm -it -p 2022:2022 -p 2024:2024 --name platform -v $(pwd):/usr/local/srs-cloud \
  --add-host redis:127.0.0.1 --env REDIS_HOST=127.0.0.1 --add-host mgmt.srs.local:127.0.0.1 \
  --env CLOUD=DOCKER --env MGMT_DOCKER=true --env SRS_DOCKERIZED=true --env NODE_ENV=development \
  -p 1935:1935/tcp -p 1985:1985/tcp -p 8080:8080/tcp -p 8000:8000/udp -p 10080:10080/udp \
  platform-dev bash

Note: We don't use the /data as global storage.

Start redis and SRS only in docker:

bash auto/init_mgmt && bash auto/start_redis && bash auto/start_srs

Build and run mgmt only in docker:

cd /usr/local/srs-cloud/mgmt && make && ./mgmt

Build and run platform only in docker:

docker exec -it platform bash -c 'make && ./platform'

Stop redis and SRS:

docker exec -it platform bash -c 'bash auto/stop_redis && bash auto/stop_srs'

It's the same as production online.

Release

Release bugfix:

  • For mgmt: ./auto/mgmt_platform_pub.sh
  • Then test the specified version of mgmt.

Note: The features might need to be updated.

Release version for BT and aaPanel:

Note: The BT forum and FAQ might need to be updated.

To refresh current tag for mgmt and platform:

  • Run ./auto/mgmt_platform_pub.sh -refresh

The upgrade feature has been disabled, which means we no longer update the version API, nor do we update the releases/version.go file, and we don't use ./auto/releases_pub.sh.

2022.11