Code Monkey home page Code Monkey logo

srs-cloud's Introduction

SRS-Cloud

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

Usage

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 nodejs);
  subgraph SRS;
    SRSR[SRS 4.0<br/>Stable];
    SRSD[SRS 5.0<br/>Develop];
  end
  mgmt --> SRS --> Hooks --> StreamAuth & DVR & VoD;
  DVR --> COS;
  mgmt --> FFmpeg;
  mgmt --- platform;
  SRS --- FFmpeg;
  mgmt --> Upgrade --> Release;
  mgmt --> Certbot --> HTTPS;
  mgmt --> 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 nodejs);
  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/
releases 2023 - Mount at /terraform/v1/releases
mgmt 2022 - Mount at /mgmt/ and /terraform/v1/mgmt/
hooks 2021 - Mount at /terraform/v1/hooks/
tencent-cloud 2020 - Mount at /terraform/v1/tencent/
ffmpeg 2019 - Mount at /terraform/v1/ffmpeg/
prometheus 9090 - Mount at /prometheus/
node-exporter 9100 - -
redis 56379 - -

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.
  • Integrate with prometheus and node-exporter.
  • 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 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.

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.
  • /.well-known/acme-challenge/ HTTPS verify mount for letsencrypt.

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/upgrade Upgrade the mgmt to latest version.
  • /terraform/v1/mgmt/strategy Toggle the upgrade strategy.
  • /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.
  • /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/window/query Query the upgrade time window.
  • /terraform/v1/mgmt/window/update Update the upgrade time window.
  • /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/nginx/homepage Setup the homepage redirection.
  • /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.

Market:

  • /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.
  • /prometheus Prometheus: Time-series database and monitor.
  • /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.

Depends

The software we depend on:

  • Docker, yum install -y docker
  • Redis, yum install -y redis
  • Nginx, yum 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
  • Prometheus, docker --name prometheus
    • Config: mgmt/containers/conf/prometheus.yml
    • Data directory: mgmt/containers/data/prometheus
  • NodeExporter, docker --name node-exporter

Upgrade Workflow

When upgrading automatically or manually by user:

  • bash upgrade for each upgrade.
  • bash auto/upgrade_region to setup the source by region.
  • git checkout to checkout to specified tag or branch.
  • bash upgrade_living to run with the updated scripts.
  • bash auto/upgrade_prepare do upgrade for previous images.
  • bash auto/upgrade_nginx to upgrade the nginx configuration.
  • bash auto/foreach_run to setup swap and redis configuration.
  • bash auto/upgrade_ui to upgrade the ui.
  • systemctl restart srs-terraform to restart the mgmt service.

When system start, check the flag SRS_FIRST_BOOT in redis, if not set:

  • Always restart container platform to use the correct image version, which should be same to mgmt.
  • Restart containers for the host ip might change.

They are not mutually exclusive. To force to upgrade to a branch:

~lighthouse/redis-cli hset SRS_UPGRADING force main
systemctl restart srs-terraform

Note: Please set the upgrade window to [0, 24] to allow upgrade full time.

It will trigger the upgrading process immediately.

System Boot

When system boot:

  • Restart the mgmt service by systemctl start srs-terraform
  • Execute script bootstrap at mgmt
  • Run script auto/foreach_run at mgmt
  • Start application by node . at mgmt

System Setup

When user setup the system, the admin password for the first boot:

  • Setup the MGMT_PASSWORD in .env
  • Restat all containers that depends on .env

Environments

The optional environments defined by mgmt/.env:

  • MGMT_PASSWORD: The mgmt administrator password.
  • SRS_PLATFORM_SECRET: The mgmt api secret for token generating and verifying.
  • 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.

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.

Develop

Install dependencies:

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

Run the mgmt backend:

(cd mgmt && npm start)

Run the platform backend:

(cd platform && npm start)

Run the platform react ui:

(cd platform/ui && npm start)

Access the browser: http://localhost:3000

Release

Release bugfix:

  • For mgmt or platform: ./mgmt/auto/pub.sh
  • For ffmpeg: ./ffmpeg/auto/pub.sh
  • For hooks: ./hooks/auto/pub.sh
  • For tencent: ./tencent/auto/pub.sh

Release stable version:

  • For stable version(MUST update the stable verison manually) in releases/releases.js then run: ./releases/auto/pub.sh

Release major or minor version:

  • For github release(MUST update the version manually) in auto/publication.sh then run: ./auto/publication.sh

Note: The github release also trigger packager for BT or aaPanel.

2022.11

srs-cloud's People

Contributors

winlinvip avatar limjoe avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.