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

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

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

Architecture

The architecture of srs-cloud by mermaid

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

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

Ports

The ports allocated:

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
    • FFmpeg and ffprobe tools in ossrs/srs:node-av

Environments

The optional environments defined by mgmt/.env:

  • MGMT_PASSWORD: The mgmt administrator password.
  • CLOUD: 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.
  • REACT_APP_LOCALE: The i18n config for ui, en or zh, default to zh.

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.

Run All in One Docker

Run srs-cloud in one docker:

代码语言:javascript
复制
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 \
  ossrs/srs-cloud:platform-1

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:

代码语言:javascript
复制
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
-v $HOME/db:/data ossrs/srs-cloud:platform-1

The volumes for srs-cloud:

  • /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 change the volumes to other directories.

Develop All in macOS

Start redis by brew:

代码语言:javascript
复制
brew services start redis

Start SRS in macOS:

代码语言:javascript
复制
(cd platform && ~/git/srs/trunk/objs/srs -c containers/conf/srs.release-local.conf)

Run the mgmt backend, or run in GoLand:

代码语言:javascript
复制
(cd mgmt && bash auto/init_global && PLATFORM_DOCKER=false go run .)

Run the platform backend, or run in GoLand:

代码语言:javascript
复制
(cd platform && go run .)

Run the platform react ui, or run in WebStorm:

代码语言:javascript
复制
(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:

代码语言:javascript
复制
docker build -t platform-dev -f platform/Dockerfile.dev .

Then start the development docker:

代码语言:javascript
复制
docker run --rm -it -p 2022:2022 -p 2024:2024 --name platform 
-v (pwd):/usr/local/srs-cloud -v HOME/db:/data
--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

Start redis and SRS only in docker:

代码语言:javascript
复制
bash auto/init_mgmt && bash auto/start_redis && bash auto/start_srs

Build and run mgmt only in docker:

代码语言:javascript
复制
cd /usr/local/srs-cloud/mgmt && make && ./mgmt

Build and run platform only in docker:

代码语言:javascript
复制
docker exec -it platform bash -c 'make && ./platform'

Stop redis and SRS:

代码语言:javascript
复制
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.
  • Finally, run ./auto/releases_pub.sh if test ok.

Note: The features might need to be updated.

Release version for BT and aaPanel:

  • MUST update the version manually in auto/bt_aapanel_pub.sh, scripts/setup-bt/info.json and scripts/setup-aapanel/info.json
  • Then run ./auto/bt_aapanel_pub.sh
  • Finally, download bt-srs_cloud.zip then submit to bt.cn

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

To refresh current tag for mgmt:

  • Run ./scripts/refresh-current-tag.sh

Note: It does not update the tag for release.

Deprecated

Release stable version:

  • MUST update the stable version manually in releases/version.go
  • Then run ./auto/releases_pub.sh

Note: We disable the upgrade feature, so should never update the stable version.

2022.11