2025-04-22 11:46:24 +02:00
{
"$schema" : "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#" ,
"contentVersion" : "1.0.0.0" ,
"metadata" : {
"_generator" : {
"name" : "bicep" ,
"version" : "0.34.44.8038" ,
2025-04-23 13:26:33 +02:00
"templateHash" : "17778352672321762008"
2025-04-22 11:46:24 +02:00
}
} ,
"parameters" : {
"stackName" : {
"type" : "string" ,
"metadata" : {
"description" : "Stack name"
}
} ,
"certificateType" : {
"type" : "string" ,
"defaultValue" : "selfsigned" ,
"allowedValues" : [
"selfsigned" ,
"owncert" ,
"letsencrypt"
] ,
"metadata" : {
"description" : "[selfsigned] Not recommended for production use. If you don't have a FQDN, (DomainName parameter) you can use this option to generate a self-signed certificate.\n[owncert] Valid for productions environments. If you have a FQDN, (DomainName parameter)\nand an Elastic IP, you can use this option to use your own certificate.\n[letsencrypt] Valid for production environments. If you have a FQDN, (DomainName parameter)\nand an Elastic IP, you can use this option to generate a Let's Encrypt certificate.\n"
}
} ,
"publicIpAddress" : {
"type" : "string" ,
"defaultValue" : "" ,
"metadata" : {
"description" : "Previously created Public IP address for the OpenVidu Deployment. Blank will generate a public IP"
}
} ,
"publicIpAddressResourceName" : {
"type" : "string" ,
"defaultValue" : "" ,
"metadata" : {
"description" : "Name of the PublicIPAddress resource in your azure if you have a resource of publicIPAddress"
}
} ,
"domainName" : {
"type" : "string" ,
"defaultValue" : "" ,
"metadata" : {
"description" : "Domain name for the OpenVidu Deployment. Blank will generate default domain"
}
} ,
"ownPublicCertificate" : {
"type" : "string" ,
"defaultValue" : "" ,
"metadata" : {
"description" : "If certificate type is 'owncert', this parameter will be used to specify the public certificate"
}
} ,
"ownPrivateCertificate" : {
"type" : "string" ,
"defaultValue" : "" ,
"metadata" : {
"description" : "If certificate type is 'owncert', this parameter will be used to specify the private certificate"
}
} ,
"letsEncryptEmail" : {
"type" : "string" ,
"defaultValue" : "" ,
"metadata" : {
"description" : "If certificate type is 'letsencrypt', this email will be used for Let's Encrypt notifications"
}
} ,
"turnDomainName" : {
"type" : "string" ,
"defaultValue" : "" ,
"metadata" : {
"description" : "(Optional) Domain name for the TURN server with TLS. Only needed if your users are behind restrictive firewalls"
}
} ,
"turnOwnPublicCertificate" : {
"type" : "string" ,
"defaultValue" : "" ,
"metadata" : {
"description" : "(Optional) This setting is applicable if the certificate type is set to 'owncert' and the TurnDomainName is specified."
}
} ,
"turnOwnPrivateCertificate" : {
"type" : "string" ,
"defaultValue" : "" ,
"metadata" : {
"description" : "(Optional) This setting is applicable if the certificate type is set to 'owncert' and the TurnDomainName is specified."
}
} ,
"instanceType" : {
"type" : "string" ,
"defaultValue" : "Standard_B2s" ,
"allowedValues" : [
"Standard_B1s" ,
"Standard_B1ms" ,
"Standard_B2s" ,
"Standard_B2ms" ,
"Standard_B4ms" ,
"Standard_B8ms" ,
"Standard_D2_v3" ,
"Standard_D4_v3" ,
"Standard_D8_v3" ,
"Standard_D16_v3" ,
"Standard_D32_v3" ,
"Standard_D48_v3" ,
"Standard_D64_v3" ,
"Standard_D2_v4" ,
"Standard_D4_v4" ,
"Standard_D8_v4" ,
"Standard_D16_v4" ,
"Standard_D32_v4" ,
"Standard_D48_v4" ,
"Standard_D64_v4" ,
"Standard_D96_v4" ,
"Standard_D2_v5" ,
"Standard_D4_v5" ,
"Standard_D8_v5" ,
"Standard_D16_v5" ,
"Standard_D32_v5" ,
"Standard_D48_v5" ,
"Standard_D64_v5" ,
"Standard_D96_v5" ,
"Standard_F2" ,
"Standard_F4" ,
"Standard_F8" ,
"Standard_F16" ,
"Standard_F32" ,
"Standard_F64" ,
"Standard_F72" ,
"Standard_F2s_v2" ,
"Standard_F4s_v2" ,
"Standard_F8s_v2" ,
"Standard_F16s_v2" ,
"Standard_F32s_v2" ,
"Standard_F64s_v2" ,
"Standard_F72s_v2" ,
"Standard_E2_v3" ,
"Standard_E4_v3" ,
"Standard_E8_v3" ,
"Standard_E16_v3" ,
"Standard_E32_v3" ,
"Standard_E48_v3" ,
"Standard_E64_v3" ,
"Standard_E96_v3" ,
"Standard_E2_v4" ,
"Standard_E4_v4" ,
"Standard_E8_v4" ,
"Standard_E16_v4" ,
"Standard_E32_v4" ,
"Standard_E48_v4" ,
"Standard_E64_v4" ,
"Standard_E2_v5" ,
"Standard_E4_v5" ,
"Standard_E8_v5" ,
"Standard_E16_v5" ,
"Standard_E32_v5" ,
"Standard_E48_v5" ,
"Standard_E64_v5" ,
"Standard_E96_v5" ,
"Standard_M64" ,
"Standard_M128" ,
"Standard_M208ms_v2" ,
"Standard_M416ms_v2" ,
"Standard_L4s_v2" ,
"Standard_L8s_v2" ,
"Standard_L16s_v2" ,
"Standard_L32s_v2" ,
"Standard_L64s_v2" ,
"Standard_L80s_v2" ,
"Standard_NC6" ,
"Standard_NC12" ,
"Standard_NC24" ,
"Standard_NC24r" ,
"Standard_ND6s" ,
"Standard_ND12s" ,
"Standard_ND24s" ,
"Standard_ND24rs" ,
"Standard_NV6" ,
"Standard_NV12" ,
"Standard_NV24" ,
"Standard_H8" ,
"Standard_H16" ,
"Standard_H16r" ,
"Standard_H16mr" ,
"Standard_HB120rs_v2" ,
"Standard_HC44rs" ,
"Standard_DC2s" ,
"Standard_DC4s" ,
"Standard_DC2s_v2" ,
"Standard_DC4s_v2" ,
"Standard_DC8s_v2" ,
"Standard_DC16s_v2" ,
"Standard_DC32s_v2" ,
"Standard_A1_v2" ,
"Standard_A2_v2" ,
"Standard_A4_v2" ,
"Standard_A8_v2" ,
"Standard_A2m_v2" ,
"Standard_A4m_v2" ,
"Standard_A8m_v2"
] ,
"metadata" : {
"description" : "Specifies the azure vm size for your OpenVidu instance"
}
} ,
"adminUsername" : {
"type" : "string" ,
"metadata" : {
"description" : "Username for the Virtual Machine."
}
} ,
"adminSshKey" : {
"type" : "securestring" ,
"metadata" : {
"description" : "SSH Key or password for the Virtual Machine."
}
2025-04-23 13:26:33 +02:00
} ,
"containerName" : {
"type" : "string" ,
"defaultValue" : "" ,
"metadata" : {
"description" : "Name of the bucket where OpenVidu will store the recordings. If not specified, a default bucket will be created."
}
2025-04-22 11:46:24 +02:00
}
} ,
"variables" : {
"copy" : [
{
"name" : "allPartsValid" ,
"count" : "[length(variables('domainParts'))]" ,
"input" : "[and(and(and(and(and(greaterOrEquals(length(variables('domainParts')[copyIndex('allPartsValid')]), 1), lessOrEquals(length(variables('domainParts')[copyIndex('allPartsValid')]), 63)), not(empty(variables('domainParts')[copyIndex('allPartsValid')]))), equals(variables('domainParts')[copyIndex('allPartsValid')], toLower(variables('domainParts')[copyIndex('allPartsValid')]))), not(contains(variables('domainParts')[copyIndex('allPartsValid')], '--'))), empty(replace(variables('domainParts')[copyIndex('allPartsValid')], '[a-z0-9-]', '')))]"
}
] ,
"isEmptyIp" : "[equals(parameters('publicIpAddress'), '')]" ,
"ipSegments" : "[split(parameters('publicIpAddress'), '.')]" ,
"isFourSegments" : "[equals(length(variables('ipSegments')), 4)]" ,
"seg1valid" : "[if(variables('isEmptyIp'), true(), and(greaterOrEquals(int(variables('ipSegments')[0]), 0), lessOrEquals(int(variables('ipSegments')[0]), 255)))]" ,
"seg2valid" : "[if(variables('isEmptyIp'), true(), and(greaterOrEquals(int(variables('ipSegments')[1]), 0), lessOrEquals(int(variables('ipSegments')[1]), 255)))]" ,
"seg3valid" : "[if(variables('isEmptyIp'), true(), and(greaterOrEquals(int(variables('ipSegments')[2]), 0), lessOrEquals(int(variables('ipSegments')[2]), 255)))]" ,
"seg4valid" : "[if(variables('isEmptyIp'), true(), and(greaterOrEquals(int(variables('ipSegments')[3]), 0), lessOrEquals(int(variables('ipSegments')[3]), 255)))]" ,
"isValidIP" : "[and(and(and(and(and(not(variables('isEmptyIp')), variables('isFourSegments')), variables('seg1valid')), variables('seg2valid')), variables('seg3valid')), variables('seg4valid'))]" ,
"isEmptyDomain" : "[equals(parameters('domainName'), '')]" ,
"domainParts" : "[split(parameters('domainName'), '.')]" ,
"validNumberParts" : "[greaterOrEquals(length(variables('domainParts')), 2)]" ,
"isDomainValid" : "[and(and(not(variables('isEmptyDomain')), variables('validNumberParts')), not(contains(variables('allPartsValid'), false())))]" ,
"networkSettings" : {
"privateIPaddressNetInterface" : "10.0.0.5" ,
"vNetAddressPrefix" : "10.0.0.0/16" ,
"subnetAddressPrefix" : "10.0.0.0/24" ,
"netInterfaceName" : "[format('{0}-netInteface', parameters('stackName'))]" ,
"vNetName" : "[format('{0}-vnet', parameters('stackName'))]" ,
"subnetName" : "default"
} ,
"openviduVMSettings" : {
"vmName" : "[format('{0}-VM-CE', parameters('stackName'))]" ,
"osDiskType" : "StandardSSD_LRS" ,
"ubuntuOSVersion" : {
"publisher" : "Canonical" ,
"offer" : "0001-com-ubuntu-server-jammy" ,
"sku" : "22_04-lts-gen2" ,
"version" : "latest"
} ,
"linuxConfiguration" : {
"disablePasswordAuthentication" : true ,
"ssh" : {
"publicKeys" : [
{
"path" : "[format('/home/{0}/.ssh/authorized_keys', parameters('adminUsername'))]" ,
"keyData" : "[parameters('adminSshKey')]"
}
]
}
}
} ,
"keyVaultName" : "[format('{0}-keyvault', parameters('stackName'))]" ,
"location" : "[resourceGroup().location]" ,
"tenantId" : "[subscription().tenantId]" ,
"deploymentUser" : "[deployer().objectId]" ,
"installScriptTemplate" : "#!/bin/bash -x\nOPENVIDU_VERSION=main\nDOMAIN=\n\napt-get update && apt-get install -y \\\n curl \\\n unzip \\\n jq \\\n wget\n\n# Configure Domain\nif [[ \"${domainName}\" == '' ]]; then\n [ ! -d \"/usr/share/openvidu\" ] && mkdir -p /usr/share/openvidu\n DOMAIN=${fqdn}\n echo ${fqdn} > /usr/share/openvidu/old-host-name\nelse\n DOMAIN=${domainName}\nfi\n\nDOMAIN=\"$(/usr/local/bin/store_secret.sh save DOMAIN-NAME \"$DOMAIN\")\"\n\nREDIS_PASSWORD=\"$(/usr/local/bin/store_secret.sh generate REDIS-PASSWORD)\"\nMONGO_ADMIN_USERNAME=\"$(/usr/local/bin/store_secret.sh save MONGO-ADMIN-USERNAME \"mongoadmin\")\"\nMONGO_ADMIN_PASSWORD=\"$(/usr/local/bin/store_secret.sh generate MONGO-ADMIN-PASSWORD)\"\nMONGO_REPLICA_SET_KEY=\"$(/usr/local/bin/store_secret.sh generate MONGO-REPLICA-SET-KEY)\"\nMINIO_ACCESS_KEY=\"$(/usr/local/bin/store_secret.sh save MINIO-ACCESS-KEY \"minioadmin\")\"\nMINIO_SECRET_KEY=\"$(/usr/local/bin/store_secret.sh generate MINIO-SECRET-KEY)\"\nDASHBOARD_ADMIN_USERNAME=\"$(/usr/local/bin/store_secret.sh save DASHBOARD-ADMIN-USERNAME \"dashboardadmin\")\"\nDASHBOARD_ADMIN_PASSWORD=\"$(/usr/local/bin/store_secret.sh generate DASHBOARD-ADMIN-PASSWORD)\"\nGRAFANA_ADMIN_USERNAME=\"$(/usr/local/bin/store_secret.sh save GRAFANA-ADMIN-USERNAME \"grafanaadmin\")\"\nGRAFANA_ADMIN_PASSWORD=\"$(/usr/local/bin/store_secret.sh generate GRAFANA-ADMIN-PASSWORD)\"\nDEFAULT_APP_USERNAME=\"$(/usr/local/bin/store_secret.sh save DEFAULT-APP-USERNAME \"calluser\")\"\nDEFAULT_APP_PASSWORD=\"$(/usr/local/bin/store_secret.sh generate DEFAULT-APP-PASSWORD)\"\nDEFAULT_APP_ADMIN_USERNAME=\"$(/usr/local/bin/store_secret.sh save DEFAULT-APP-ADMIN-USERNAME \"calladmin\")\"\nDEFAULT_APP_ADMIN_PASSWORD=\"$(/usr/local/bin/store_secret.sh generate DEFAULT-APP-ADMIN-PASSWORD)\"\nLIVEKIT_API_KEY=\"$(/usr/local/bin/store_secret.sh generate LIVEKIT-API-KEY \"API\" 12)\"\nLIVEKIT_API_SECRET=\"$(/usr/local/bin/store_secret.sh generate LIVEKIT-API-SECRET)\"\nENABLED_MODULES=\"$(/usr/local/bin/store_secret.sh save ENABLED-MODULES \"observability,app\")\"\n\n# Base command\nINSTALL_COMMAND=\"sh <(curl -fsSL http://get.openvidu.io/community/singlenode/$OPENVIDU_VERSION/install.sh)\"\n\n# Common arguments\nCOMMON_ARGS=(\n \"--no-tty\"\n \"--install\"\n \"--environment=azure\"\n \"--deployment-type=single_node\"\n \"--domain-name=$DOMAIN\"\n \"--enabled-modules='$ENABLED_MODULES'\"\n \"--redis-password=$REDIS_PASSWORD\"\n \"--mongo-admin-user=$MONGO_ADMIN_USERNAME\"\n \"--mongo-admin-password=$MONGO_ADMIN_PASSWORD\"\n \"--mongo-replica-set-key=$MONGO_REPLICA_SET_KEY\"\n \"--minio-access-key=$MINIO_ACCESS_KEY\"\n \"--minio-secret-key=$MINIO_SECRET_KEY\"\n \"--dashboard-admin-user=$DASHBOARD_ADMIN_USERNAME\"\n \"--dashboard-admin-password=$DASHBOARD_ADMIN_PASSWORD\"\n \"--grafana-admin-user=$GRAFANA_ADMIN_USERNAME\"\n \"--grafana-admin-password=$GRAFANA_ADMIN_PASSWORD\"\n \"--default-app-user=$DEFAULT_APP_USERNAME\"\n \"--default-app-password=$DEFAULT_APP_PASSWORD\"\n \"--default-app-admin-user=$DEFAULT_APP_ADMIN_USERNAME\"\n \"--default-app-admin-password=$DEFAULT_APP_ADMIN_PASSWORD\"\n \"--livekit-api-key=$LIVEKIT_API_KEY\"\n \"--livekit-api-secret=$LIVEKIT_API_SECRET\"\n)\n\n# Turn with TLS\nif [[ \"${turnDomainName}\" != '' ]]; then\n LIVEKIT_TURN_DOMAIN_NAME=$(/usr/local/bin/store_secret.sh save LIVEKIT-TURN-DOMAIN-NAME \"${turnDomainName}\")\n COMMON_ARGS+=(\n \"--turn-domain-name=$LIVEKIT_TURN_DOMAIN_NAME\"\n )\nfi\n\n# Certificate arguments\nif [[ \"${certificateType}\" == \"selfsigned\" ]]; then\n CERT_ARGS=(\n \"--certificate-type=selfsigned\"\n )\nelif [[ \"${certificateType}\" == \"letsencrypt\" ]]; then\n LETSENCRYPT_EMAIL=$(/usr/local/bin/store_secret.sh save LETSENCRYPT-EMAIL \"${letsEncryptEmail}\")\n CERT_ARGS=(\n \"--certificate-type=letsencrypt\"\n \"--letsencrypt-email=${letsEncryptEmail}\" \ n ) \ n e l s e \ n # D o w n l o a d o w n c e r t f i l e s \ n m k d i r - p / t m p / o w n c e r t \ n w g e t - O / t m p / o w n c e r t / f u l l c h a i n . p e m $ { o w n P u b l i c C e r t i f i c a t e } \ n w g e t - O / t m p / o w n c e r t / p r i v k e y . p e m $ { o w n P r i
"after_installScriptTemplate" : "#!/bin/bash\nset -e\n\naz login --identity --allow-no-subscriptions > /dev/null\n\n# Generate URLs\nDOMAIN=$(az keyvault secret show --vault-name ${keyVaultName} --name DOMAIN-NAME --query value -o tsv)\nDASHBOARD_URL=\"https://${DOMAIN}/dashboard/\"\nGRAFANA_URL=\"https://${DOMAIN}/grafana/\"\nMINIO_URL=\"https://${DOMAIN}/minio-console/\"\n\n# Update shared secret\naz keyvault secret set --vault-name ${keyVaultName} --name DOMAIN-NAME --value $DOMAIN\naz keyvault secret set --vault-name ${keyVaultName} --name DASHBOARD-URL --value $DASHBOARD_URL\naz keyvault secret set --vault-name ${keyVaultName} --name GRAFANA-URL --value $GRAFANA_URL\naz keyvault secret set --vault-name ${keyVaultName} --name MINIO-URL --value $MINIO_URL\n\naz keyvault secret show --vault-name ${keyVaultName} --name MINIO-URL\n\nif [[ $? -ne 0 ]]; then\n echo \"Error updating keyvault\"\nfi\n" ,
"update_config_from_secretScriptTemplate" : "#!/bin/bash -x\nset -e\n\naz login --identity --allow-no-subscriptions > /dev/null\n\n# Installation directory\nINSTALL_DIR=\"/opt/openvidu\"\nCONFIG_DIR=\"${INSTALL_DIR}/config\"\n\n# Replace DOMAIN_NAME\nexport DOMAIN=$(az keyvault secret show --vault-name ${keyVaultName} --name DOMAIN-NAME --query value -o tsv)\nif [[ -n \"$DOMAIN\" ]]; then\n sed -i \"s/DOMAIN_NAME=.*/DOMAIN_NAME=$DOMAIN/\" \"${CONFIG_DIR}/openvidu.env\"\nelse\n exit 1\nfi\n\n# Replace LIVEKIT_TURN_DOMAIN_NAME\nexport LIVEKIT_TURN_DOMAIN_NAME=$(az keyvault secret show --vault-name ${keyVaultName} --name LIVEKIT-TURN-DOMAIN-NAME --query value -o tsv)\nif [[ -n \"$LIVEKIT_TURN_DOMAIN_NAME\" ]]; then\n sed -i \"s/LIVEKIT_TURN_DOMAIN_NAME=.*/LIVEKIT_TURN_DOMAIN_NAME=$LIVEKIT_TURN_DOMAIN_NAME/\" \"${CONFIG_DIR}/openvidu.env\"\nfi\n\nif [[ ${certificateType} == \"letsencrypt\" ]]; then\n export LETSENCRYPT_EMAIL=$(az keyvault secret show --vault-name ${keyVaultName} --name LETSENCRYPT-EMAIL --query value -o tsv)\n sed -i \"s/LETSENCRYPT_EMAIL=.*/LETSENCRYPT_EMAIL=$LETSENCRYPT_EMAIL/\" \"${CONFIG_DIR}/openvidu.env\"\nfi\n\n# Get the rest of the values\nexport REDIS_PASSWORD=$(az keyvault secret show --vault-name ${keyVaultName} --name REDIS-PASSWORD --query value -o tsv)\nexport MONGO_ADMIN_USERNAME=$(az keyvault secret show --vault-name ${keyVaultName} --name MONGO-ADMIN-USERNAME --query value -o tsv)\nexport MONGO_ADMIN_PASSWORD=$(az keyvault secret show --vault-name ${keyVaultName} --name MONGO-ADMIN-PASSWORD --query value -o tsv)\nexport MONGO_REPLICA_SET_KEY=$(az keyvault secret show --vault-name ${keyVaultName} --name MONGO-REPLICA-SET-KEY --query value -o tsv)\nexport DASHBOARD_ADMIN_USERNAME=$(az keyvault secret show --vault-name ${keyVaultName} --name DASHBOARD-ADMIN-USERNAME --query value -o tsv)\nexport DASHBOARD_ADMIN_PASSWORD=$(az keyvault secret show --vault-name ${keyVaultName} --name DASHBOARD-ADMIN-PASSWORD --query value -o tsv)\nexport MINIO_ACCESS_KEY=$(az keyvault secret show --vault-name ${keyVaultName} --name MINIO-ACCESS-KEY --query value -o tsv)\nexport MINIO_SECRET_KEY=$(az keyvault secret show --vault-name ${keyVaultName} --name MINIO-SECRET-KEY --query value -o tsv)\nexport GRAFANA_ADMIN_USERNAME=$(az keyvault secret show --vault-name ${keyVaultName} --name GRAFANA-ADMIN-USERNAME --query value -o tsv)\nexport GRAFANA_ADMIN_PASSWORD=$(az keyvault secret show --vault-name ${keyVaultName} --name GRAFANA-ADMIN-PASSWORD --query value -o tsv)\nexport LIVEKIT_API_KEY=$(az keyvault secret show --vault-name ${keyVaultName} --name LIVEKIT-API-KEY --query value -o tsv)\nexport LIVEKIT_API_SECRET=$(az keyvault secret show --vault-name ${keyVaultName} --name LIVEKIT-API-SECRET --query value -o tsv)\nexport DEFAULT_APP_USERNAME=$(az keyvault secret show --vault-name ${keyVaultName} --name DEFAULT-APP-USERNAME --query value -o tsv)\nexport DEFAULT_APP_PASSWORD=$(az keyvault secret show --vault-name ${keyVaultName} --name DEFAULT-APP-PASSWORD --query value -o tsv)\nexport DEFAULT_APP_ADMIN_USERNAME=$(az keyvault secret show --vault-name ${keyVaultName} --name DEFAULT-APP-ADMIN-USERNAME --query value -o tsv)\nexport DEFAULT_APP_ADMIN_PASSWORD=$(az keyvault secret show --vault-name ${keyVaultName} --name DEFAULT-APP-ADMIN-PASSWORD --query value -o tsv)\nexport ENABLED_MODULES=$(az keyvault secret show --vault-name ${keyVaultName} --name ENABLED-MODULES --query value -o tsv)\n\n\n# Replace rest of the values\nsed -i \"s/REDIS_PASSWORD=.*/REDIS_PASSWORD=$REDIS_PASSWORD/\" \"${CONFIG_DIR}/openvidu.env\"\nsed -i \"s/MONGO_ADMIN_USERNAME=.*/MONGO_ADMIN_USERNAME=$MONGO_ADMIN_USERNAME/\" \"${CONFIG_DIR}/openvidu.env\"\nsed -i \"s/MONGO_ADMIN_PASSWORD=.*/MONGO_ADMIN_PASSWORD=$MONGO_ADMIN_PASSWORD/\" \"${CONFIG_DIR}/openvidu.env\"\nsed -i \"s/MONGO_REPLICA_SET_KEY=.*/MONGO_REPLICA_SET_KEY=$MONGO_REPLICA_SET_KEY/\" \"${CONFIG_DIR}/openvidu.env\"\nsed -i \"s/DASHBOARD_ADMIN_USERNAME=.*/DASHBOARD_ADMIN_USERNAME=$DASHBOARD_ADMIN_USERNAME/\" \"${CONFIG_DIR}/openvidu.env\"\nsed -i \" s / D A S H B O A R D _ A D M I N
"update_secret_from_configScriptTemplate" : "#!/bin/bash\nset -e\n\naz login --identity --allow-no-subscriptions > /dev/null\n\n# Installation directory\nINSTALL_DIR=\"/opt/openvidu\"\nCONFIG_DIR=\"${INSTALL_DIR}/config\"\n\nif [[ ${certificateType} == \"letsencrypt\" ]]; then\n LETSENCRYPT_EMAIL=\"$(/usr/local/bin/get_value_from_config.sh LETSENCRYPT_EMAIL \"${CONFIG_DIR}/openvidu.env\")\"\n az keyvault secret set --vault-name ${keyVaultName} --name \"LETSENCRYPT-EMAIL\" --value $LETSENCRYPT_EMAIL\nfi\n\n# Get current values of the config\nREDIS_PASSWORD=\"$(/usr/local/bin/get_value_from_config.sh REDIS_PASSWORD \"${CONFIG_DIR}/openvidu.env\")\"\nDOMAIN_NAME=\"$(/usr/local/bin/get_value_from_config.sh DOMAIN_NAME \"${CONFIG_DIR}/openvidu.env\")\"\nLIVEKIT_TURN_DOMAIN_NAME=\"$(/usr/local/bin/get_value_from_config.sh LIVEKIT_TURN_DOMAIN_NAME \"${CONFIG_DIR}/openvidu.env\")\"\nMONGO_ADMIN_USERNAME=\"$(/usr/local/bin/get_value_from_config.sh MONGO_ADMIN_USERNAME \"${CONFIG_DIR}/openvidu.env\")\"\nMONGO_ADMIN_PASSWORD=\"$(/usr/local/bin/get_value_from_config.sh MONGO_ADMIN_PASSWORD \"${CONFIG_DIR}/openvidu.env\")\"\nMONGO_REPLICA_SET_KEY=\"$(/usr/local/bin/get_value_from_config.sh MONGO_REPLICA_SET_KEY \"${CONFIG_DIR}/openvidu.env\")\"\nMINIO_ACCESS_KEY=\"$(/usr/local/bin/get_value_from_config.sh MINIO_ACCESS_KEY \"${CONFIG_DIR}/openvidu.env\")\"\nMINIO_SECRET_KEY=\"$(/usr/local/bin/get_value_from_config.sh MINIO_SECRET_KEY \"${CONFIG_DIR}/openvidu.env\")\"\nDASHBOARD_ADMIN_USERNAME=\"$(/usr/local/bin/get_value_from_config.sh DASHBOARD_ADMIN_USERNAME \"${CONFIG_DIR}/openvidu.env\")\"\nDASHBOARD_ADMIN_PASSWORD=\"$(/usr/local/bin/get_value_from_config.sh DASHBOARD_ADMIN_PASSWORD \"${CONFIG_DIR}/openvidu.env\")\"\nGRAFANA_ADMIN_USERNAME=\"$(/usr/local/bin/get_value_from_config.sh GRAFANA_ADMIN_USERNAME \"${CONFIG_DIR}/openvidu.env\")\"\nGRAFANA_ADMIN_PASSWORD=\"$(/usr/local/bin/get_value_from_config.sh GRAFANA_ADMIN_PASSWORD \"${CONFIG_DIR}/openvidu.env\")\"\nLIVEKIT_API_KEY=\"$(/usr/local/bin/get_value_from_config.sh LIVEKIT_API_KEY \"${CONFIG_DIR}/openvidu.env\")\"\nLIVEKIT_API_SECRET=\"$(/usr/local/bin/get_value_from_config.sh LIVEKIT_API_SECRET \"${CONFIG_DIR}/openvidu.env\")\"\nDEFAULT_APP_USERNAME=\"$(/usr/local/bin/get_value_from_config.sh CALL_USER \"${CONFIG_DIR}/app.env\")\"\nDEFAULT_APP_PASSWORD=\"$(/usr/local/bin/get_value_from_config.sh CALL_SECRET \"${CONFIG_DIR}/app.env\")\"\nDEFAULT_APP_ADMIN_USERNAME=\"$(/usr/local/bin/get_value_from_config.sh CALL_ADMIN_USER \"${CONFIG_DIR}/app.env\")\"\nDEFAULT_APP_ADMIN_PASSWORD=\"$(/usr/local/bin/get_value_from_config.sh CALL_ADMIN_SECRET \"${CONFIG_DIR}/app.env\")\"\nENABLED_MODULES=\"$(/usr/local/bin/get_value_from_config.sh ENABLED_MODULES \"${CONFIG_DIR}/openvidu.env\")\" \ n \ n \ n # U p d a t e s h a r e d s e c r e t \ n a z k e y v a u l t s e c r e t s e t - - v a u l t - n a m e $ { k e y V a u l t N a m e } - - n a m e R E D I S - P A S S W O R D - - v a l u e $ R E D I S _ P A S S W O R D \ n a z k e y v a u l t s e c r e t s e t - - v a u l t - n a m e $ { k e y V a u l t N a m e } - - n a m e D O M A I N - N A M E - - v a l u e $ D O M A I N _ N A M E \ n a z k e y v a u l t s e c r e t s e t - - v a u l t - n a m e $ { k e y V a u l t N a m e } - - n a m e L I V E K I T - T U R N - D O M A I N - N A M E - - v a l u e $ L I V E K I T _ T U R N _ D O M A I N _ N A M E \ n a z k e y v a u l t s e c r e t s e t - - v a u l t - n a m e $ { k e y V a u l t N a m e } - - n a m e M O N G O - A D M I N - U S E R N A M E - - v a l u e $ M O N G O _ A D M I N _ U S E R N A M E \ n a z k e y v a u l t s e c r e t s e t - - v a u l t - n a m e $ { k e y V a u l t N a m e } - - n a m e M O N G O - A D M I N - P A S S W O R D - - v a l u e $ M O N G O _ A D M I N _ P A S S W O R D \ n a z k e y v a u l t s e c r e t s e t - - v a u l t - n a m e $ { k e y V a u l t N a m e } - - n a m e M O N G O - R E P L I C A - S E T - K E Y - - v a l u e $ M O N G O _ R E P L I C A _ S E T _ K E Y \ n a z k e y v a u l t s e c r e t s e t - - v a u l t - n a m e $ { k e y V a u l t N a m e } - - n a m e M I N I O - A C C E S S - K E Y - - v a l u e $ M I N I O _ A C C E S S _ K E Y \ n a z k e y v a u l t s e c r e t s e t - - v a u l t - n a m e $ { k e y V a u l t N a m e } - - n a m e M I N I O - S E C R E T - K E Y - - v a l u e $ M I N I O _ S E C R E T _ K E Y \ n a z k e y v a u l t s e c r e t s e t - - v a u l t - n a m e $ { k e y V a u l t N a m e } - - n a m e D A S H B O A R D - A D M I N - U S E R N A M E - - v a l u e $ D A S H B O A R D _ A D M I N _ U S E R N A M E \ n a z k e y v a u l t s e c r e t s e t - - v a u l t - n a m e $ { k e y V a u l t N a m e } - - n a m e D A S H B O A R D - A D M I N - P A S S W O R D - - v a l u e $ D A S H B O A R D _ A D M I N _ P A S S W O R D \ n a z k e y v a u l t s e c r e t s e t - - v a u l t - n a m e $ { k e y V a u l t N a m e } - - n a m e G R A F A N A - A D M I N - U S E R N A M E - - v a l u e $ G R A F A N A _ A D M I N _ U S E R N A M E \ n a z k e y v a u l t s e c r e t s e t - - v a u l t - n a m e $ { k e y V a u l t N a m e } - - n a m e G R A F A N A - A D M I N - P A S S W O R D -
"get_value_from_configScript" : "#!/bin/bash -x\nset -e\n\n# Function to get the value of a given key from the environment file\nget_value() {\n local key=\"$1\"\n local file_path=\"$2\"\n\n # Use grep to find the line with the key, ignoring lines starting with #\n # Use awk to split on '=' and print the second field, which is the value\n local value=$(grep -E \"^\\s*$key\\s*=\" \"$file_path\" | awk -F= '{print $2}' | sed 's/#.*//; s/^\\s*//; s/\\s*$//')\n\n # If the value is empty, return \"none\"\n if [ -z \"$value\" ]; then\n echo \"none\"\n else\n echo \"$value\"\n fi\n}\n\n# Check if the correct number of arguments are supplied\nif [ \"$#\" -ne 2 ]; then\n echo \"Usage: $0 <key> <file_path>\"\n exit 1\nfi\n\n# Get the key and file path from the arguments\nkey=\"$1\"\nfile_path=\"$2\"\n\n# Get and print the value\nget_value \"$key\" \"$file_path\"\n" ,
"store_secretScriptTemplate" : "#!/bin/bash\nset -e\n\naz login --identity --allow-no-subscriptions > /dev/null\n\n# Modes: save, generate\n# save mode: save the secret in the secret manager\n# generate mode: generate a random password and save it in the secret manager\nMODE=\"$1\"\n\nif [[ \"$MODE\" == \"generate\" ]]; then\n SECRET_KEY_NAME=\"$2\"\n PREFIX=\"${3:-}\"\n LENGTH=\"${4:-44}\"\n RANDOM_PASSWORD=\"$(openssl rand -base64 64 | tr -d '+/=\\n' | cut -c -${LENGTH})\"\n RANDOM_PASSWORD=\"${PREFIX}${RANDOM_PASSWORD}\"\n az keyvault secret set --vault-name ${keyVaultName} --name $SECRET_KEY_NAME --value $RANDOM_PASSWORD > /dev/null\n if [[ $? -ne 0 ]]; then\n echo \"Error generating secret\"\n fi\n echo \"$RANDOM_PASSWORD\"\nelif [[ \"$MODE\" == \"save\" ]]; then\n SECRET_KEY_NAME=\"$2\"\n SECRET_VALUE=\"$3\"\n az keyvault secret set --vault-name ${keyVaultName} --name $SECRET_KEY_NAME --value $SECRET_VALUE > /dev/null\n if [[ $? -ne 0 ]]; then\n echo \"Error generating secret\"\n fi\n echo \"$SECRET_VALUE\"\nelse\n exit 1\nfi\n" ,
"check_app_ready" : "#!/bin/bash\nwhile true; do\n HTTP_STATUS=$(curl -Ik http://localhost:7880 | head -n1 | awk '{print $2}')\n if [ $HTTP_STATUS == 200 ]; then\n break\n fi\n sleep 5\ndone\n" ,
"restart" : "#!/bin/bash -x\nset -e\n# Stop all services\nsystemctl stop openvidu\n\n# Update config from secret\n/usr/local/bin/update_config_from_secret.sh\n\n# Start all services\nsystemctl start openvidu\n" ,
"base64get_value_from_config" : "[base64(variables('get_value_from_configScript'))]" ,
"base64check_app_ready" : "[base64(variables('check_app_ready'))]" ,
"base64restart" : "[base64(variables('restart'))]" ,
2025-04-23 13:26:33 +02:00
"userDataTemplate" : "#!/bin/bash -x\nset -eu -o pipefail\n\necho ${base64install} | base64 -d > /usr/local/bin/install.sh\nchmod +x /usr/local/bin/install.sh\n\n# after_install.sh\necho ${base64after_install} | base64 -d > /usr/local/bin/after_install.sh\nchmod +x /usr/local/bin/after_install.sh\n\n# update_config_from_secret.sh\necho ${base64update_config_from_secret} | base64 -d > /usr/local/bin/update_config_from_secret.sh\nchmod +x /usr/local/bin/update_config_from_secret.sh\n\n# update_secret_from_config.sh\necho ${base64update_secret_from_config} | base64 -d > /usr/local/bin/update_secret_from_config.sh\nchmod +x /usr/local/bin/update_secret_from_config.sh\n\n# get_value_from_config.sh\necho ${base64get_value_from_config} | base64 -d > /usr/local/bin/get_value_from_config.sh\nchmod +x /usr/local/bin/get_value_from_config.sh\n\n# store_secret.sh\necho ${base64store_secret} | base64 -d > /usr/local/bin/store_secret.sh\nchmod +x /usr/local/bin/store_secret.sh\n\necho ${base64check_app_ready} | base64 -d > /usr/local/bin/check_app_ready.sh\nchmod +x /usr/local/bin/check_app_ready.sh\n\necho ${base64restart} | base64 -d > /usr/local/bin/restart.sh\nchmod +x /usr/local/bin/restart.sh\n\n# Install azure cli\ncurl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash\n\naz login --identity --allow-no-subscriptions\n\napt-get update && apt-get install -y\n\nexport HOME=\"/root\"\n\n# Install OpenVidu\n/usr/local/bin/install.sh || { echo \"[OpenVidu] error installing OpenVidu\"; exit 1; }\n\n# Start OpenVidu\nsystemctl start openvidu || { echo \"[OpenVidu] error starting OpenVidu\"; exit 1; }\n\n# Update shared secret\n/usr/local/bin/after_install.sh || { echo \"[OpenVidu] error updating shared secret\"; exit 1; }\n\n# Launch on reboot\necho \"@reboot /usr/local/bin/restart.sh >> /var/log/openvidu-restart.log\" 2>&1 | crontab\n\n# Wait for the app\n/usr/local/bin/check_app_ready.sh\n" ,
"isEmptyContainerName" : "[equals(parameters('containerName'), '')]"
2025-04-22 11:46:24 +02:00
} ,
"resources" : [
{
"type" : "Microsoft.KeyVault/vaults" ,
"apiVersion" : "2023-07-01" ,
"name" : "[variables('keyVaultName')]" ,
"location" : "[variables('location')]" ,
"properties" : {
"enabledForDeployment" : true ,
"enabledForDiskEncryption" : false ,
"enabledForTemplateDeployment" : true ,
"tenantId" : "[variables('tenantId')]" ,
"enableSoftDelete" : false ,
"accessPolicies" : [
{
"objectId" : "[reference(resourceId('Microsoft.Compute/virtualMachines', variables('openviduVMSettings').vmName), '2023-09-01', 'full').identity.principalId]" ,
"tenantId" : "[variables('tenantId')]" ,
"permissions" : {
"secrets" : [
"get" ,
"set" ,
"list"
]
}
} ,
{
"objectId" : "[variables('deploymentUser')]" ,
"tenantId" : "[variables('tenantId')]" ,
"permissions" : {
"secrets" : [
"get" ,
"list" ,
"set" ,
"delete" ,
"recover" ,
"backup" ,
"restore"
]
}
}
] ,
"sku" : {
"name" : "standard" ,
"family" : "A"
} ,
"networkAcls" : {
"defaultAction" : "Allow" ,
"bypass" : "AzureServices"
}
} ,
"dependsOn" : [
"[resourceId('Microsoft.Compute/virtualMachines', variables('openviduVMSettings').vmName)]"
]
} ,
{
"type" : "Microsoft.Compute/virtualMachines" ,
"apiVersion" : "2023-09-01" ,
"name" : "[variables('openviduVMSettings').vmName]" ,
"location" : "[variables('location')]" ,
"identity" : {
"type" : "SystemAssigned"
} ,
"properties" : {
"hardwareProfile" : {
"vmSize" : "[parameters('instanceType')]"
} ,
"storageProfile" : {
"osDisk" : {
"createOption" : "FromImage" ,
"managedDisk" : {
"storageAccountType" : "[variables('openviduVMSettings').osDiskType]"
} ,
"diskSizeGB" : 100
} ,
"imageReference" : "[variables('openviduVMSettings').ubuntuOSVersion]"
} ,
"networkProfile" : {
"networkInterfaces" : [
{
"id" : "[resourceId('Microsoft.Network/networkInterfaces', variables('networkSettings').netInterfaceName)]"
}
]
} ,
"osProfile" : {
"computerName" : "[variables('openviduVMSettings').vmName]" ,
"adminUsername" : "[parameters('adminUsername')]" ,
"adminPassword" : "[parameters('adminSshKey')]" ,
"linuxConfiguration" : "[variables('openviduVMSettings').linuxConfiguration]"
} ,
"userData" : " [ b a s e 64 ( r e d u c e ( i t e m s ( c r e a t e O b j e c t ( ' b a s e 64 i n s t a l l ' , b a s e 64 ( r e d u c e ( i t e m s ( c r e a t e O b j e c t ( ' d o m a i n N a m e ' , p a r a m e t e r s ( ' d o m a i n N a m e ' ) , ' f q d n ' , i f ( v a r i a b l e s ( ' i s E m p t y I p ' ) , r e f e r e n c e ( r e s o u r c e I d ( ' M i c r o s o f t . N e t w o r k / p u b l i c I P A d d r e s s e s ' , f o r m a t ( ' { 0 } - p u b l i c I P ' , p a r a m e t e r s ( ' s t a c k N a m e ' ) ) ) , ' 2023 -11 -0 1 ' ) . d n s S e t t i n g s . f q d n , p a r a m e t e r s ( ' d o m a i n N a m e ' ) ) , ' t u r n D o m a i n N a m e ' , p a r a m e t e r s ( ' t u r n D o m a i n N a m e ' ) , ' c e r t i f i c a t e T y p e ' , p a r a m e t e r s ( ' c e r t i f i c a t e T y p e ' ) , ' l e t s E n c r y p t E m a i l ' , p a r a m e t e r s ( ' l e t s E n c r y p t E m a i l ' ) , ' o w n P u b l i c C e r t i f i c a t e ' , p a r a m e t e r s ( ' o w n P u b l i c C e r t i f i c a t e ' ) , ' o w n P r i v a t e C e r t i f i c a t e ' , p a r a m e t e r s ( ' o w n P r i v a t e C e r t i f i c a t e ' ) , ' t u r n O w n P u b l i c C e r t i f i c a t e ' , p a r a m e t e r s ( ' t u r n O w n P u b l i c C e r t i f i c a t e ' ) , ' t u r n O w n P r i v a t e C e r t i f i c a t e ' , p a r a m e t e r s ( ' t u r n O w n P r i v a t e C e r t i f i c a t e ' ) , ' k e y V a u l t N a m e ' , v a r i a b l e s ( ' k e y V a u l t N a m e ' ) ) ) , c r e a t e O b j e c t ( ' v a l u e ' , v a r i a b l e s ( ' i n s t a l l S c r i p t T e m p l a t e ' ) ) , l a m b d a ( ' c u r r ' , ' n e x t ' , c r e a t e O b j e c t ( ' v a l u e ' , r e p l a c e ( l a m b d a V a r i a b l e s ( ' c u r r ' ) . v a l u e , f o r m a t ( ' $ { { { 0 } } } ' , l a m b d a V a r i a b l e s ( ' n e x t ' ) . k e y ) , l a m b d a V a r i a b l e s ( ' n e x t ' ) . v a l u e ) ) ) ) . v a l u e ) , ' b a s e 64 a f t e r _ i n s t a l l ' , b a s e 64 ( r e d u c e ( i t e m s ( c r e a t e O b j e c t ( ' d o m a i n N a m e ' , p a r a m e t e r s ( ' d o m a i n N a m e ' ) , ' f q d n ' , i f ( v a r i a b l e s ( ' i s E m p t y I p ' ) , r e f e r e n c e ( r e s o u r c e I d ( ' M i c r o s o f t . N e t w o r k / p u b l i c I P A d d r e s s e s ' , f o r m a t ( ' { 0 } - p u b l i c I P ' , p a r a m e t e r s ( ' s t a c k N a m e ' ) ) ) , ' 2023 -11 -0 1 ' ) . d n s S e t t i n g s . f q d n , p a r a m e t e r s ( ' d o m a i n N a m e ' ) ) , ' t u r n D o m a i n N a m e ' , p a r a m e t e r s ( ' t u r n D o m a i n N a m e ' ) , ' c e r t i f i c a t e T y p e ' , p a r a m e t e r s ( ' c e r t i f i c a t e T y p e ' ) , ' l e t s E n c r y p t E m a i l ' , p a r a m e t e r s ( ' l e t s E n c r y p t E m a i l ' ) , ' o w n P u b l i c C e r t i f i c a t e ' , p a r a m e t e r s ( ' o w n P u b l i c C e r t i f i c a t e ' ) , ' o w n P r i v a t e C e r t i f i c a t e ' , p a r a m e t e r s ( ' o w n P r i v a t e C e r t i f i c a t e ' ) , ' t u r n O w n P u b l i c C e r t i f i c a t e ' , p a r a m e t e r s ( ' t u r n O w n P u b l i c C e r t i f i c a t e ' ) , ' t u r n O w n P r i v a t e C e r t i f i c a t e ' , p a r a m e t e r s ( ' t u r n O w n P r i v a t e C e r t i f i c a t e ' ) , ' k e y V a u l t N a m e ' , v a r i a b l e s ( ' k e y V a u l t N a m e ' ) ) ) , c r e a t e O b j e c t ( ' v a l u e ' , v a r i a b l e s ( ' a f t e r _ i n s t a l l S c r i p t T e m p l a t e ' ) ) , l a m b d a ( ' c u r r ' , ' n e x t ' , c r e a t e O b j e c t ( ' v a l u e ' , r e p l a c e ( l a m b d a V a r i a b l e s ( ' c u r r ' ) . v a l u e , f o r m a t ( ' $ { { { 0 } } } ' , l a m b d a V a r i a b l e s ( ' n e x t ' ) . k e y ) , l a m b d a V a r i a b l e s ( ' n e x t ' ) . v a l u e ) ) ) ) . v a l u e ) , ' b a s e 64 u p d a t e _ c o n f i g _ f r o m _ s e c r e t ' , b a s e 64 ( r e d u c e ( i t e m s ( c r e a t e O b j e c t ( ' d o m a i n N a m e ' , p a r a m e t e r s ( ' d o m a i n N a m e ' ) , ' f q d n ' , i f ( v a r i a b l e s ( ' i s E m p t y I p ' ) , r e f e r e n c e ( r e s o u r c e I d ( ' M i c r o s o f t . N e t w o r k / p u b l i c I P A d d r e s s e s ' , f o r m a t ( ' { 0 } - p u b l i c I P ' , p a r a m e t e r s ( ' s t a c k N a m e ' ) ) ) , ' 2023 -11 -0 1 ' ) . d n s S e t t i n g s . f q d n , p a r a m e t e r s ( ' d o m a i n N a m e ' ) ) , ' t u r n D o m a i n N a m e ' , p a r a m e t e r s ( ' t u r n D o m a i n N a m e ' ) , ' c e r t i f i c a t e T y p e ' , p a r a m e t e r s ( ' c e r t i f i c a t e T y p e ' ) , ' l e t s E n c r y p t E m a i l ' , p a r a m e t e r s ( ' l e t s E n c r y p t E m a i l ' ) , ' o w n P u b l i c C e r t i f i c a t e ' , p a r a m e t e r s ( ' o w n P u b l i c C e r t i f i c a t e ' ) , ' o w n P r i v a t e C e r t i f i c a t e ' , p a r a m e t e r s ( ' o w n P r i v a t e C e r t i f i c a t e ' ) , ' t u r n O w n P u b l i c C e r t i f i c a t e ' , p a r a m e t e r s ( ' t u r n O w n P u b l i c C e r t i f i c a t e ' ) , ' t u r n O w n P r i v a t e C e r t i f i c a t e ' , p a r a m e t e r s ( ' t u r n O w n P r i v a t e C e r t i f i c a t e ' ) , ' k e y V a u l t N a m e ' , v a r i a b l e s ( ' k e y V a u l t N a m e ' ) ) ) , c r e a t e O b j e c t ( ' v a l u e ' , v a r i a b l e s ( ' u p d a t e _ c o n f i g _ f r o m _ s e c r e t S c r i p t T e m p l a t e ' ) ) , l a m b d a ( ' c u r r ' , ' n e x t ' , c r e a t e O b j e c t ( ' v a l u e ' , r e p l a c e ( l a m b d a V a r i a b l e s ( ' c u r r ' ) . v a l u e , f o r m a t ( ' $ { { { 0 } } } ' , l a m b d a V a r i a b l e s ( ' n e x t ' ) . k e y ) , l a m b d a V a r i a b l e s ( ' n e x t ' ) . v a l u e ) ) ) ) . v a l u e ) , ' b a s e 64 u p d a t e _ s e c r e t _ f r o m _ c o n f i g ' , b a s e 64 ( r e d u c e ( i t e m s ( c r e a t e O b j e c t ( ' d o m a i n N a m e ' , p a r a m e t e r s ( ' d o m a i n N a m e ' ) , ' f q d n ' , i f ( v a r i a b l e s ( ' i s E m p t y I p ' ) , r e f e r e n c e ( r e s o u r c e I d ( ' M i c r o s o f t . N e t w o r k / p u b l i c I P A d d r e s s e s ' , f o r m a t ( ' { 0 } - p u b l i c I P ' , p a r a m e t e r s ( ' s t a c k N a m e ' ) ) ) , ' 2023 -11 -0 1 ' ) . d n s S e t t i n g s . f q d n , p a r a m e t e r s ( ' d o m a i n N a m e ' ) ) , ' t u r n D o m a i n N a m e ' , p a r a m e t e r s ( ' t u r n D o m a i n N a m e ' ) , ' c e r t i f i c a t e T y p e ' , p a r a m e t e r s ( ' c e r t i f i c a t e T y p e ' ) , ' l e t s E n c r y p t E m a i l ' , p a r a m e t e r s ( ' l e t s E n c r y p t E m a i l ' ) , ' o w n P u b l i c C e r t i f i c a t e ' , p a r a m e t e r s ( ' o w n P u b l i c C e r t i f i c a t e ' ) , ' o w n P r i v a t e C e r t i f i c a t e ' , p a r a m e t e r s ( ' o w n P r i v a t e C e r t i f i c a t e ' ) , ' t u r n O w n P u b l i c C e r t i f i c a t e ' , p a r a m e t e r s ( ' t u r n O w n P u b l i c C e r t i f i c a t e ' ) , ' t u r n O w n P r i v a t e C e r t i f i c a t e ' , p a r a m e t e r s ( ' t u r n O w n P r i v a t e C e r t i f i c a t e ' ) , ' k e y V a u l t N a m e ' , v a r i a b l e s ( ' k e y V a u l t N a m e ' ) ) ) , c r e a t e O b j e c t ( ' v a l u e ' , v a r i a b l e s ( ' u p d a t e _ s e c r e t _ f r o m _ c o n f i g S c r i p t T e m p l a t e ' ) ) , l a m b d a ( ' c u r r ' , ' n e x t ' , c r e a t e O b j e c t ( ' v a l u e ' , r e p l a c e ( l a m b d a V a r i a b l e s ( ' c u r r ' ) . v a l u e , f o r m a t ( ' $ { { { 0 } } } ' , l a m b d a V a r i a b l e s ( ' n e x t ' ) . k e y ) , l a m b d a V a r i a b l e s ( ' n e x t ' ) . v a l u e ) ) ) ) . v a l u e ) , ' b a s e 64 g e t _ v a l u e _ f r o m _ c o
} ,
"dependsOn" : [
"[resourceId('Microsoft.Network/networkInterfaces', variables('networkSettings').netInterfaceName)]" ,
"[resourceId('Microsoft.Network/publicIPAddresses', format('{0}-publicIP', parameters('stackName')))]"
]
} ,
{
"condition" : "[equals(variables('isEmptyIp'), true())]" ,
"type" : "Microsoft.Network/publicIPAddresses" ,
"apiVersion" : "2023-11-01" ,
"name" : "[format('{0}-publicIP', parameters('stackName'))]" ,
"location" : "[variables('location')]" ,
"sku" : {
"name" : "Standard" ,
"tier" : "Regional"
} ,
"properties" : {
"publicIPAddressVersion" : "IPv4" ,
"publicIPAllocationMethod" : "Static" ,
"dnsSettings" : {
"domainNameLabel" : "[if(variables('isEmptyDomain'), toLower(format('{0}', parameters('stackName'))), null())]" ,
"fqdn" : "[if(variables('isEmptyDomain'), null(), parameters('domainName'))]"
}
}
} ,
{
"type" : "Microsoft.Network/virtualNetworks" ,
"apiVersion" : "2023-11-01" ,
"name" : "[variables('networkSettings').vNetName]" ,
"location" : "[variables('location')]" ,
"properties" : {
"addressSpace" : {
"addressPrefixes" : [
"[variables('networkSettings').vNetAddressPrefix]"
]
} ,
"subnets" : [
{
"name" : "[variables('networkSettings').subnetName]" ,
"properties" : {
"addressPrefix" : "[variables('networkSettings').subnetAddressPrefix]" ,
"privateEndpointNetworkPolicies" : "Disabled" ,
"privateLinkServiceNetworkPolicies" : "Enabled" ,
"networkSecurityGroup" : {
"id" : "[resourceId('Microsoft.Network/networkSecurityGroups', format('{0}-nsg', parameters('stackName')))]"
}
}
}
]
} ,
"dependsOn" : [
"[resourceId('Microsoft.Network/networkSecurityGroups', format('{0}-nsg', parameters('stackName')))]"
]
} ,
{
"type" : "Microsoft.Network/networkInterfaces" ,
"apiVersion" : "2023-11-01" ,
"name" : "[variables('networkSettings').netInterfaceName]" ,
"location" : "[variables('location')]" ,
"properties" : {
"ipConfigurations" : [
{
"name" : "ipconfig1" ,
"properties" : {
"privateIPAllocationMethod" : "Dynamic" ,
"subnet" : {
"id" : "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('networkSettings').vNetName, variables('networkSettings').subnetName)]"
} ,
"publicIPAddress" : {
"id" : "[if(variables('isEmptyIp'), resourceId('Microsoft.Network/publicIPAddresses', format('{0}-publicIP', parameters('stackName'))), resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIpAddressResourceName')))]"
}
}
}
] ,
"networkSecurityGroup" : {
"id" : "[resourceId('Microsoft.Network/networkSecurityGroups', format('{0}-nsg', parameters('stackName')))]"
}
} ,
"dependsOn" : [
"[resourceId('Microsoft.Network/publicIPAddresses', format('{0}-publicIP', parameters('stackName')))]" ,
"[resourceId('Microsoft.Network/virtualNetworks', variables('networkSettings').vNetName)]" ,
"[resourceId('Microsoft.Network/networkSecurityGroups', format('{0}-nsg', parameters('stackName')))]"
]
} ,
{
"type" : "Microsoft.Network/networkSecurityGroups" ,
"apiVersion" : "2023-11-01" ,
"name" : "[format('{0}-nsg', parameters('stackName'))]" ,
"location" : "[variables('location')]" ,
"properties" : {
"securityRules" : [
{
"name" : "SSH" ,
"properties" : {
"protocol" : "Tcp" ,
"sourceAddressPrefix" : "*" ,
"sourcePortRange" : "*" ,
"destinationAddressPrefix" : "*" ,
"destinationPortRange" : "22" ,
"access" : "Allow" ,
"priority" : 100 ,
"direction" : "Inbound"
}
} ,
{
"name" : "HTTP" ,
"properties" : {
"protocol" : "Tcp" ,
"sourceAddressPrefix" : "*" ,
"sourcePortRange" : "*" ,
"destinationAddressPrefix" : "*" ,
"destinationPortRange" : "80" ,
"access" : "Allow" ,
"priority" : 110 ,
"direction" : "Inbound"
}
} ,
{
"name" : "HTTPS" ,
"properties" : {
"protocol" : "Tcp" ,
"sourceAddressPrefix" : "*" ,
"sourcePortRange" : "*" ,
"destinationAddressPrefix" : "*" ,
"destinationPortRange" : "443" ,
"access" : "Allow" ,
"priority" : 120 ,
"direction" : "Inbound"
}
} ,
{
"name" : "TURN" ,
"properties" : {
"protocol" : "Udp" ,
"sourceAddressPrefix" : "*" ,
"sourcePortRange" : "*" ,
"destinationAddressPrefix" : "*" ,
"destinationPortRange" : "443" ,
"access" : "Allow" ,
"priority" : 130 ,
"direction" : "Inbound"
}
} ,
{
"name" : "RTMP" ,
"properties" : {
"protocol" : "Tcp" ,
"sourceAddressPrefix" : "*" ,
"sourcePortRange" : "*" ,
"destinationAddressPrefix" : "*" ,
"destinationPortRange" : "1935" ,
"access" : "Allow" ,
"priority" : 140 ,
"direction" : "Inbound"
}
} ,
{
"name" : "WebRTC_over_TCP" ,
"properties" : {
"protocol" : "Tcp" ,
"sourceAddressPrefix" : "*" ,
"sourcePortRange" : "*" ,
"destinationAddressPrefix" : "*" ,
"destinationPortRange" : "7881" ,
"access" : "Allow" ,
"priority" : 150 ,
"direction" : "Inbound"
}
} ,
{
"name" : "WebRTC_using_WHIP" ,
"properties" : {
"protocol" : "Udp" ,
"sourceAddressPrefix" : "*" ,
"sourcePortRange" : "*" ,
"destinationAddressPrefix" : "*" ,
"destinationPortRange" : "7885" ,
"access" : "Allow" ,
"priority" : 160 ,
"direction" : "Inbound"
}
} ,
{
"name" : "MinIO" ,
"properties" : {
"protocol" : "Tcp" ,
"sourceAddressPrefix" : "*" ,
"sourcePortRange" : "*" ,
"destinationAddressPrefix" : "*" ,
"destinationPortRange" : "9000" ,
"access" : "Allow" ,
"priority" : 170 ,
"direction" : "Inbound"
}
} ,
{
"name" : "WebRTC_traffic_UDP" ,
"properties" : {
"protocol" : "Udp" ,
"sourceAddressPrefix" : "*" ,
"sourcePortRange" : "*" ,
"destinationAddressPrefix" : "*" ,
"destinationPortRanges" : [
"50000" ,
"60000"
] ,
"access" : "Allow" ,
"priority" : 180 ,
"direction" : "Inbound"
}
} ,
{
"name" : "WebRTC_traffic_TCP" ,
"properties" : {
"protocol" : "Tcp" ,
"sourceAddressPrefix" : "*" ,
"sourcePortRange" : "*" ,
"destinationAddressPrefix" : "*" ,
"destinationPortRanges" : [
"50000" ,
"60000"
] ,
"access" : "Allow" ,
"priority" : 190 ,
"direction" : "Inbound"
}
}
]
}
2025-04-23 13:26:33 +02:00
} ,
{
"type" : "Microsoft.Storage/storageAccounts" ,
"apiVersion" : "2023-01-01" ,
"name" : "[uniqueString(resourceGroup().id)]" ,
"location" : "[resourceGroup().location]" ,
"sku" : {
"name" : "Standard_LRS"
} ,
"kind" : "StorageV2" ,
"properties" : {
"accessTier" : "Cool" ,
"supportsHttpsTrafficOnly" : true
}
} ,
{
"type" : "Microsoft.Storage/storageAccounts/blobServices/containers" ,
"apiVersion" : "2023-01-01" ,
"name" : "[if(variables('isEmptyContainerName'), format('{0}/default/openvidu-appdata', uniqueString(resourceGroup().id)), format('{0}/default/{1}', uniqueString(resourceGroup().id), parameters('containerName')))]" ,
"properties" : {
"publicAccess" : "None"
} ,
"dependsOn" : [
"[resourceId('Microsoft.Storage/storageAccounts', uniqueString(resourceGroup().id))]"
]
2025-04-22 11:46:24 +02:00
}
] ,
"outputs" : {
"ipValidationStatus" : {
"type" : "string" ,
"value" : "[if(variables('isValidIP'), 'IP address is valid', 'IP address not valid')]"
} ,
"domainValidationStatus" : {
"type" : "string" ,
"value" : "[if(variables('isDomainValid'), 'Domain is valid', 'Domain is not valid')]"
} ,
"ownCertValidationStatus" : {
"type" : "string" ,
"value" : "[if(and(and(equals(parameters('certificateType'), 'owncert'), not(equals(parameters('ownPrivateCertificate'), ''))), not(equals(parameters('ownPublicCertificate'), ''))), 'owncert selected and valid', 'You need to fill ''Own Public Certificate'' and ''Own Private Certificate''')]"
} ,
"letsEncryptValidationStatus" : {
"type" : "string" ,
"value" : "[if(and(equals(parameters('certificateType'), 'letsencrypt'), not(equals(parameters('letsEncryptEmail'), ''))), 'letsEncrypt selected and valid', 'You need to fill ''Lets Encrypt Email''')]"
}
}
}