From 42ad7bce5d0a73f5e43ad2b43bf3fef2b0b5dfd5 Mon Sep 17 00:00:00 2001 From: cruizba Date: Mon, 25 Apr 2022 01:42:51 +0200 Subject: [PATCH] deployment: Infrastructure changes to allow coturn in media nodes --- .../enterprise/master-node/docker-compose.yml | 3 ++ ...penvidu-server-pro-no-market.yaml.template | 16 +++++++ .../media-node/docker-compose.yml | 1 + .../media-node/install_media_node.sh | 3 ++ .../pro/docker-compose/media-node/media_node | 1 + .../openvidu-server-pro/docker-compose.yml | 3 ++ .../server/config/OpenviduConfig.java | 42 ++++++++----------- 7 files changed, 44 insertions(+), 25 deletions(-) diff --git a/openvidu-server/deployments/enterprise/master-node/docker-compose.yml b/openvidu-server/deployments/enterprise/master-node/docker-compose.yml index 69486c01..8ea62763 100644 --- a/openvidu-server/deployments/enterprise/master-node/docker-compose.yml +++ b/openvidu-server/deployments/enterprise/master-node/docker-compose.yml @@ -48,6 +48,9 @@ services: - OPENVIDU_PRO_CLUSTER=true - OPENVIDU_PRO_KIBANA_HOST=${OPENVIDU_PRO_KIBANA_HOST:-http://127.0.0.1/kibana} - OPENVIDU_PRO_ELASTICSEARCH_HOST=${OPENVIDU_PRO_ELASTICSEARCH_HOST:-http://127.0.0.1:9200} + - OPENVIDU_PRO_COTURN_IN_MEDIA_NODES=${OPENVIDU_PRO_COTURN_IN_MEDIA_NODES:-false} + - OPENVIDU_PRO_COTURN_PORT_MEDIA_NODES=${OPENVIDU_PRO_COTURN_PORT_MEDIA_NODES:-443} + - OPENVIDU_PRO_COTURN_PUBLIC_IP_AUTODISCOVER=${OPENVIDU_PRO_COTURN_PUBLIC_IP_AUTODISCOVER:-auto-ipv4} - WAIT_KIBANA_URL=${OPENVIDU_PRO_KIBANA_HOST:-http://127.0.0.1/kibana} - DOTENV_PATH=${PWD} - SUPPORT_DEPRECATED_API=false diff --git a/openvidu-server/deployments/pro/aws/cfn-openvidu-server-pro-no-market.yaml.template b/openvidu-server/deployments/pro/aws/cfn-openvidu-server-pro-no-market.yaml.template index 72856916..2e0f2861 100644 --- a/openvidu-server/deployments/pro/aws/cfn-openvidu-server-pro-no-market.yaml.template +++ b/openvidu-server/deployments/pro/aws/cfn-openvidu-server-pro-no-market.yaml.template @@ -669,6 +669,22 @@ Resources: FromPort: 22 ToPort: 22 CidrIpv6: ::/0 + - IpProtocol: tcp + FromPort: 443 + ToPort: 443 + CidrIp: 0.0.0.0/0 + - IpProtocol: tcp + FromPort: 443 + ToPort: 443 + CidrIpv6: ::/0 + - IpProtocol: udp + FromPort: 443 + ToPort: 443 + CidrIp: 0.0.0.0/0 + - IpProtocol: udp + FromPort: 443 + ToPort: 443 + CidrIpv6: ::/0 - IpProtocol: tcp FromPort: 3000 ToPort: 3000 diff --git a/openvidu-server/deployments/pro/docker-compose/media-node/docker-compose.yml b/openvidu-server/deployments/pro/docker-compose/media-node/docker-compose.yml index 9ceb3a47..2076a503 100644 --- a/openvidu-server/deployments/pro/docker-compose/media-node/docker-compose.yml +++ b/openvidu-server/deployments/pro/docker-compose/media-node/docker-compose.yml @@ -27,6 +27,7 @@ services: - METRICBEAT_IMAGE=docker.elastic.co/beats/metricbeat-oss:7.8.0 - FILEBEAT_IMAGE=docker.elastic.co/beats/filebeat-oss:7.8.0 - OPENVIDU_RECORDING_IMAGE=openvidu/openvidu-recording:2.19.0 + - COTURN_IMAGE=openvidu/openvidu-coturn:7.0.0-dev1 - NO_COLOR=true ports: - 3000:3000 diff --git a/openvidu-server/deployments/pro/docker-compose/media-node/install_media_node.sh b/openvidu-server/deployments/pro/docker-compose/media-node/install_media_node.sh index 5d8367e2..3ce0de4a 100755 --- a/openvidu-server/deployments/pro/docker-compose/media-node/install_media_node.sh +++ b/openvidu-server/deployments/pro/docker-compose/media-node/install_media_node.sh @@ -12,6 +12,7 @@ IMAGES=( "docker.elastic.co/beats/metricbeat" "openvidu/media-node-controller" "openvidu/mediasoup-controller" + "openvidu/openvidu-coturn" ) # Support docker compose v1 and v2 @@ -247,11 +248,13 @@ upgrade_media_node() { METRICBEAT_IMAGE="$(grep METRICBEAT_IMAGE docker-compose.yml | cut -d"=" -f2)" FILEBEAT_IMAGE="$(grep FILEBEAT_IMAGE docker-compose.yml | cut -d"=" -f2)" OPENVIDU_RECORDING_IMAGE="$(grep OPENVIDU_RECORDING_IMAGE docker-compose.yml | cut -d"=" -f2)" + COTURN_IMAGE="$(grep COTURN_IMAGE docker-compose.yml | cut -d"=" -f2)" docker pull "$KMS_IMAGE" || fatal "Error while pulling docker image: $KMS_IMAGE" docker pull "$MEDIASOUP_IMAGE" || fatal "Error while pulling docker image: $MEDIASOUP_IMAGE" docker pull "$METRICBEAT_IMAGE" || fatal "Error while pulling docker image: $METRICBEAT_IMAGE" docker pull "$FILEBEAT_IMAGE" || fatal "Error while pulling docker image: $FILEBEAT_IMAGE" docker pull "$OPENVIDU_RECORDING_IMAGE" || fatal "Error while pulling docker image: $OPENVIDU_RECORDING_IMAGE" + docker pull "$COTURN_IMAGE" || fatal "Error while pulling docker image: $COTURN_IMAGE" docker-compose pull || true printf '\n => Stopping Media Node...' diff --git a/openvidu-server/deployments/pro/docker-compose/media-node/media_node b/openvidu-server/deployments/pro/docker-compose/media-node/media_node index 7fe625a5..7bef7d9b 100755 --- a/openvidu-server/deployments/pro/docker-compose/media-node/media_node +++ b/openvidu-server/deployments/pro/docker-compose/media-node/media_node @@ -18,6 +18,7 @@ IMAGES=( "docker.elastic.co/beats/metricbeat" "openvidu/media-node-controller" "openvidu/mediasoup-controller" + "openvidu/openvidu-coturn" ) docker_command_by_container_image() { diff --git a/openvidu-server/deployments/pro/docker-compose/openvidu-server-pro/docker-compose.yml b/openvidu-server/deployments/pro/docker-compose/openvidu-server-pro/docker-compose.yml index 08ae872f..1bc89afc 100644 --- a/openvidu-server/deployments/pro/docker-compose/openvidu-server-pro/docker-compose.yml +++ b/openvidu-server/deployments/pro/docker-compose/openvidu-server-pro/docker-compose.yml @@ -47,6 +47,9 @@ services: - OPENVIDU_PRO_ELASTICSEARCH_HOST=${OPENVIDU_PRO_ELASTICSEARCH_HOST:-http://127.0.0.1:9200} - WAIT_KIBANA_URL=${OPENVIDU_PRO_KIBANA_HOST:-http://127.0.0.1/kibana} - DOTENV_PATH=${PWD} + - OPENVIDU_PRO_COTURN_IN_MEDIA_NODES=${OPENVIDU_PRO_COTURN_IN_MEDIA_NODES:-false} + - OPENVIDU_PRO_COTURN_PORT_MEDIA_NODES=${OPENVIDU_PRO_COTURN_PORT_MEDIA_NODES:-443} + - OPENVIDU_PRO_COTURN_PUBLIC_IP_AUTODISCOVER=${OPENVIDU_PRO_COTURN_PUBLIC_IP_AUTODISCOVER:-auto-ipv4} logging: options: max-size: "${DOCKER_LOGS_MAX_SIZE:-100M}" diff --git a/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java b/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java index 527279e9..30b0a217 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java +++ b/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java @@ -160,14 +160,9 @@ public class OpenviduConfig { private Integer openviduStreamsVideoMinSendBandwidth; - /** - * Map which relates used Coturn IP per Media Node. - * Depending on which media node will be used for the session, - * a coturn IP should be sent to the browser and Kurento. - */ - private ConcurrentHashMap mapKmsUriCoturnIp = new ConcurrentHashMap<>(); + protected String coturnIp; - private int coturnPort; + protected int coturnPort; private String coturnSharedSecretKey; @@ -341,7 +336,7 @@ public class OpenviduConfig { } public String getCoturnIp(String kmsUri) { - return this.mapKmsUriCoturnIp.get(kmsUri); + return this.coturnIp; } public int getCoturnPort() { @@ -623,8 +618,7 @@ public class OpenviduConfig { kmsUrisList = checkKmsUris(); checkCoturnIp(); - - checkCoturnPort(); + coturnPort = checkPort("COTURN_PORT"); checkWebhook(); @@ -647,30 +641,28 @@ public class OpenviduConfig { } private void checkCoturnIp() { - if (this.getKmsUris().isEmpty()) { - throw new IllegalArgumentException("'KMS_URIS' should contain at least one KMS url"); - } - String firstKmsWsUri = this.getKmsUris().get(0); String property = "COTURN_IP"; - String coturnIp = asOptionalIPv4OrIPv6(property); - if (coturnIp == null || coturnIp.isEmpty()) { + coturnIp = checkIp(property); + + if (coturnIp == null || this.coturnIp.isEmpty()) { try { - coturnIp = new URL(this.getFinalUrl()).getHost(); - this.mapKmsUriCoturnIp.put(firstKmsWsUri, coturnIp); + this.coturnIp = new URL(this.getFinalUrl()).getHost(); } catch (MalformedURLException e) { log.error("Can't get Domain name from OpenVidu public Url: " + e.getMessage()); } - } else { - this.mapKmsUriCoturnIp.put(firstKmsWsUri, coturnIp); } } - private void checkCoturnPort() { - String property = "COTURN_PORT"; - coturnPort = this.asNonNegativeInteger(property); - if (coturnPort <= 0 || coturnPort > 65535) { - addError("COTURN_PORT", "COTURN PORT is out of valid ports range (0-65535)"); + protected String checkIp(String property) { + return asOptionalIPv4OrIPv6(property); + } + + protected int checkPort(String property) { + int port = this.asNonNegativeInteger(property); + if (port <= 0 || port > 65535) { + addError(property, property + " is out of valid ports range (0-65535)"); } + return port; } private void checkWebhook() {