Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

README.md

Autoscaling Stream Managers 2.0 with autoscaling nodes (autoscale) - Example

In the following example, Terraform module will automates the infrastructure provisioning of the Autoscale Stream Managers 2.0 with Red5 Pro (SM2.0) Autoscaling node group (origins, edges, transcoders, relays)

stream_manager_public_hostname: Set this to the DNS name clients use for Stream Manager (e.g. sm.example.com). It sets Traefik’s host, the admin UI API base, and outputs such as stream_manager_url_https. Use a concrete FQDN, not a wildcard. Point DNS at the load balancer hostname from outputs. For TLS, https_ssl_certificate_domain_name may be a wildcard (e.g. *.example.com) or an ACM primary name if that certificate covers this hostname.

Terraform Deployed Resources (autoscale)

  • VPC
  • Public subnet
  • Firewall
  • Firewall for Stream Manager 2.0
  • Firewall for Kafka Instance
  • Firewall for Red5 Pro (SM2.0) Autoscaling nodes
  • SSH key pair (use existing or create a new one)
  • Standalone Kafka instance
  • Stream Manager 2.0 instance image
  • Stream Manager 2.0 instance based on node count
  • Node Balancer Configuration
  • Attaching Node Balancer for Stream Manager 2.0 instances
  • SSL certificate for Noad Balancer. Options:
    • none - Load Balancer without HTTPS and SSL certificate. Only HTTP on port 80
    • imported-auto - Load Balancer with HTTPS and imported SSL certificate. HTTP on port 80, HTTPS on port 443
  • Red5 Pro (SM2.0) node instance image (origins, edges, transcoders, relays)
  • Red5 Pro (SM2.0) Autoscaling node group (origins, edges, transcoders, relays)

Example main.tf (autoscale)

terraform {
  required_version = ">= 1.7.5"
  
  required_providers {
    linode = {
      source  = "linode/linode"
      version = ">= 2.32.0"
    }
    random = {
      source = "hashicorp/random"
    }
  }
}

provider "linode" {
  token = "<linode token>"
}

module "red5pro" {
  source                = "../../"
  type                  = "autoscale"                                         # Deployment type: standalone, cluster, autoscale
  name                  = "red5pro-auto"                                      # Name to be used on all the resources as identifier
  linode_region         = "us-lax"                                            # Deployment region
  ubuntu_version        = "22.04"                                             # Ubuntu version for Red5 Pro servers  
  path_to_red5pro_build = "./red5pro-server-0.0.0.b0-release.zipp"            # Absolute path or relative path to Red5 Pro server ZIP file
  linode_api_token      = "<linode token>"                                    # Linode API token from Linode Cloud  

  # SSH key configuration
  ssh_key_use_existing               = false                                              # true - use existing SSH key, false - create new SSH key
  ssh_key_name_existing              = "example-key"                                      # SSH key name existing in LINODE
  ssh_key_existing_private_key_path  = "PATH/TO/SSH/PRIVATE/KEY/example_private_key.pem"  # Path to existing SSH private key

  # VPC configuration
  vpc_use_existing            = false                 # Use existing VPC or create a new one. true = use existing, false = create new
  vpc_name_existing           = "example-vpc"         # VPC name of existing VPC if vpc_create is false
  subnet_name_existing        = "example-subnet"      # Subnet name of existing subnet if subnet_create is false

  # Red5 Pro general configuration
  red5pro_license_key         = "1111-2222-3333-4444" # Red5 Pro license key (https://account.red5.net/login)
  red5pro_api_enable          = true                  # true - enable Red5 Pro server API, false - disable Red5 Pro server API (https://www.red5.net/docs/development/api/overview/)
  red5pro_api_key             = "example_key"         # Red5 Pro server API key (https://www.red5.net/docs/development/api/overview/)

  # Kafka standalone instance configuration
  kafka_standalone_instance_type        = "g6-dedicated-8"              # Linode Instance type for Kafka standalone instance

  # Stream Manager 2.0 instance configuration
  stream_manager_instance_type          = "g6-dedicated-4"           # Linode Instance type for Stream Manager
  stream_manager_auth_user              = "example_user"             # Stream Manager 2.0 authentication user name
  stream_manager_auth_password          = "example_password"         # Stream Manager 2.0 authentication passwordssword
  stream_manager_count                  = 1                          # Stream Manager 2.0 instance count
  stream_manager_proxy_user             = "example_proxy_user"       # Stream Manager 2.0 proxy user name
  stream_manager_proxy_password         = "example_proxy_password"   # Stream Manager 2.0 proxy password
  stream_manager_spatial_user           = "example_spatial_user"     # Stream Manager 2.0 spatial user name
  stream_manager_spatial_password       = "example_spatial_password" # Stream Manager 2.0 spatial password
  stream_manager_version                = "latest"                   # Stream Manager 2.0 docker images version (latest, 14.1.0, 14.1.1, etc.) - https://hub.docker.com/r/red5pro/as-admin/tags
  stream_manager_public_hostname        = "sm.example.com"           # Required: public FQDN for Traefik, admin UI, and HTTPS URLs (not a wildcard). Point DNS A/alias at the load balancer DNS name from outputs.

  # Stream Manager 2.0 Load Balancer HTTPS (SSL) certificate configuration
  https_ssl_certificate = "none" # none - do not use HTTPS/SSL certificate, imported - import existing HTTPS/SSL certificate

  # Example of imported HTTPS/SSL certificate configuration - please uncomment and provide your domain name, certificate and key paths
  # https_ssl_certificate             = "imported"
  # https_ssl_certificate_domain_name = "red5pro.example.com"              # Cert domain name (may be *.example.com); must cover stream_manager_public_hostname
  # https_ssl_certificate_cert_path   = "/PATH/TO/SSL/CERT/fullchain.pem"  # Path to certificate fullchain file
  # https_ssl_certificate_key_path    = "/PATH/TO/SSL/KEY/privkey.pem"     # Path to certificate privkey file


  # Red5 Pro autoscaling Node image configuration
  node_image_create             = true                  # Default: true for Autoscaling and Cluster, true - create new Red5 Pro Node image, false - do not create new Red5 Pro Node image
  node_image_instance_type      = "g6-dedicated-4"      # Instance type for Red5 Pro Node image

  # Extra configuration for Red5 Pro autoscaling nodes
  # Webhooks configuration - (Optional) https://www.red5.net/docs/special/webhooks/overview/
  node_config_webhooks = {
    enable           = false,
    target_nodes     = ["origin", "edge", "transcoder"],
    webhook_endpoint = "https://test.webhook.app/api/v1/broadcast/webhook"
  }
  # Round trip authentication configuration - (Optional) https://www.red5.net/docs/special/authplugin/simple-auth/
  node_config_round_trip_auth = {
    enable                   = false,
    target_nodes             = ["origin", "edge", "transcoder"],
    auth_host                = "round-trip-auth.example.com",
    auth_port                = 443,
    auth_protocol            = "https://",
    auth_endpoint_validate   = "/validateCredentials",
    auth_endpoint_invalidate = "/invalidateCredentials"
  }
  # Restreamer configuration - (Optional) https://www.red5.net/docs/special/restreamer/overview/
  node_config_restreamer = {
    enable               = false,
    target_nodes         = ["origin", "transcoder"],
    restreamer_tsingest  = true,
    restreamer_ipcam     = true,
    restreamer_whip      = true,
    restreamer_srtingest = true
  }
  # Social Pusher configuration - (Optional) https://www.red5.net/docs/development/social-media-plugin/rest-api/
  node_config_social_pusher = {
    enable       = false,
    target_nodes = ["origin", "edge", "transcoder"],
  }

  # Red5 Pro autoscaling Node group - (Optional)
  node_group_create                    = true                      # Linux or Mac OS only. true - create new Node group, false - not create new Node group
  node_group_origins_min               = 1                         # Number of minimum Origins
  node_group_origins_max               = 20                        # Number of maximum Origins
  node_group_origins_instance_type     = "g6-dedicated-2"          # Origins Linode Instance Type
  node_group_origins_volume_size       = 50                        # Volume size in GB for Origins
  node_group_origins_connection_limit  = 20                        # Maximum number of publishers to the origin server
  node_group_edges_min                 = 1                         # Number of minimum Edges
  node_group_edges_max                 = 40                        # Number of maximum Edges
  node_group_edges_instance_type       = "g6-dedicated-2"          # Edges Linode Instance Type
  node_group_edges_volume_size         = 50                        # Volume size in GB for Edges
  node_group_edges_connection_limit    = 200                       # Maximum number of subscribers to the edge server
  node_group_transcoders_min           = 0                         # Number of minimum Transcoders
  node_group_transcoders_max           = 20                        # Number of maximum Transcoders
  node_group_transcoders_instance_type = "g6-dedicated-2"          # Transcoders Linode Instance Type
  node_group_transcoders_volume_size   = 50                        # Volume size in GB for Transcoders
  node_group_transcoders_connection_limit = 20                     # Maximum number of publishers to the transcoder server
  node_group_relays_min                = 0                         # Number of minimum Relays
  node_group_relays_max                = 20                        # Number of maximum Relays
  node_group_relays_instance_type      = "g6-dedicated-2"          # Relays Linode Instance Type
  node_group_relays_volume_size        = 50                        # Volume size in GB for Relays
}

output "module_output" {
  value = module.red5pro
}