2025-04-22 11:46:24 +02:00
#!/bin/sh
# Docker & Docker Compose will need to be installed on the machine
set -eu
export DOCKER_VERSION = " ${ DOCKER_VERSION :- 27 .5.1 } "
export DOCKER_COMPOSE_VERSION = " ${ DOCKER_COMPOSE_VERSION :- v2 .32.4 } "
2025-05-26 16:34:37 +02:00
export OPENVIDU_VERSION = " ${ OPENVIDU_VERSION :- main } "
2025-04-22 11:46:24 +02:00
export INSTALLER_IMAGE = " ${ INSTALLER_IMAGE :- docker .io/openvidu/openvidu-installer : ${ OPENVIDU_VERSION } } "
export MINIO_SERVER_IMAGE = " ${ MINIO_SERVER_IMAGE :- docker .io/bitnami/minio : 2025 .2.7-debian-12-r0 } "
export MINIO_CLIENT_IMAGE = " ${ MINIO_CLIENT_IMAGE :- docker .io/minio/mc : RELEASE .2025-02-08T19-14-21Z } "
export MONGO_SERVER_IMAGE = " ${ MONGO_SERVER_IMAGE :- docker .io/mongo : 8 .0.4 } "
export REDIS_SERVER_IMAGE = " ${ REDIS_SERVER_IMAGE :- docker .io/redis : 7 .4.2-alpine } "
export BUSYBOX_IMAGE = " ${ BUSYBOX_IMAGE :- docker .io/busybox : 1 .37.0 } "
export CADDY_SERVER_IMAGE = " ${ CADDY_SERVER_IMAGE :- docker .io/openvidu/openvidu-caddy : ${ OPENVIDU_VERSION } } "
export CADDY_SERVER_PRO_IMAGE = " ${ CADDY_SERVER_PRO_IMAGE :- docker .io/openvidu/openvidu-pro-caddy : ${ OPENVIDU_VERSION } } "
export OPENVIDU_OPERATOR_IMAGE = " ${ OPENVIDU_OPERATOR_IMAGE :- docker .io/openvidu/openvidu-operator : ${ OPENVIDU_VERSION } } "
export OPENVIDU_SERVER_PRO_IMAGE = " ${ OPENVIDU_SERVER_PRO_IMAGE :- docker .io/openvidu/openvidu-server-pro : ${ OPENVIDU_VERSION } } "
export OPENVIDU_SERVER_IMAGE = " ${ OPENVIDU_SERVER_IMAGE :- docker .io/openvidu/openvidu-server : ${ OPENVIDU_VERSION } } "
export OPENVIDU_CALL_SERVER_IMAGE = " ${ OPENVIDU_CALL_SERVER_IMAGE :- docker .io/openvidu/openvidu-call : ${ OPENVIDU_VERSION } } "
export OPENVIDU_DASHBOARD_PRO_IMAGE = " ${ OPENVIDU_DASHBOARD_PRO_IMAGE :- docker .io/openvidu/openvidu-pro-dashboard : ${ OPENVIDU_VERSION } } "
export OPENVIDU_DASHBOARD_IMAGE = " ${ OPENVIDU_DASHBOARD_IMAGE :- docker .io/openvidu/openvidu-dashboard : ${ OPENVIDU_VERSION } } "
export OPENVIDU_V2COMPATIBILITY_IMAGE = " ${ OPENVIDU_V2COMPATIBILITY_IMAGE :- docker .io/openvidu/openvidu-v2compatibility : ${ OPENVIDU_VERSION } } "
export LIVEKIT_INGRESS_SERVER_IMAGE = " ${ LIVEKIT_INGRESS_SERVER_IMAGE :- docker .io/openvidu/ingress : ${ OPENVIDU_VERSION } } "
export LIVEKIT_EGRESS_SERVER_IMAGE = " ${ LIVEKIT_EGRESS_SERVER_IMAGE :- docker .io/livekit/egress : v1 .9.0 } "
export PROMETHEUS_IMAGE = " ${ PROMETHEUS_IMAGE :- docker .io/prom/prometheus : v3 .1.0 } "
export PROMTAIL_IMAGE = " ${ PROMTAIL_IMAGE :- docker .io/grafana/promtail : 3 .3.2 } "
export LOKI_IMAGE = " ${ LOKI_IMAGE :- docker .io/grafana/loki : 3 .3.2 } "
export MIMIR_IMAGE = " ${ MIMIR_IMAGE :- docker .io/bitnami/grafana-mimir : 2 .15.0 } "
export GRAFANA_IMAGE = " ${ GRAFANA_IMAGE :- docker .io/grafana/grafana : 11 .5.1 } "
wait_for_docker( ) {
echo "Waiting for Docker to start..."
# Set a countdown (in seconds)
COUNTDOWN = 60
while [ " $COUNTDOWN " -gt 0 ] ; do
if docker info >/dev/null 2>& 1; then
echo "Docker started successfully."
break
else
# Reduce the countdown by 1 each iteration.
COUNTDOWN = $(( COUNTDOWN - 1 ))
if [ " $COUNTDOWN " -eq 0 ] ; then
echo "ERROR: Docker did not start within the allocated time."
break
fi
sleep 1
fi
done
}
# Check if executing as root
if [ " $( id -u) " -ne 0 ] ; then
echo "Please run as root"
exit 1
fi
if ! command -v docker > /dev/null 2>& 1
then
curl -fsSL https://get.docker.com -o /tmp/get-docker.sh
sh /tmp/get-docker.sh --version " ${ DOCKER_VERSION } " || { echo "Can't install Docker automatically. Install it manually and run this script again" ; exit 1; }
else
echo "Docker already installed. Check you have the latest version for best compatibility"
fi
if ! command -v docker-compose > /dev/null 2>& 1
then
TIME_LIMIT_SECONDS = 20
START_TIME = $( awk 'BEGIN{srand(); print srand()}' )
while true
do
CURRENT_TIME = $( awk 'BEGIN{srand(); print srand()}' )
if [ $(( CURRENT_TIME-START_TIME)) -gt $TIME_LIMIT_SECONDS ] ; then
echo " Error downloading docker-compose. Could not download it in $TIME_LIMIT_SECONDS seconds "
rm -rf /usr/local/bin/docker-compose
exit 1
fi
STATUS_RECEIVED = $( curl --retry 5 --retry-max-time 40 --write-out "%{http_code}\n" -L " https://github.com/docker/compose/releases/download/ $DOCKER_COMPOSE_VERSION /docker-compose- $( uname -s) - $( uname -m) " -o /usr/local/bin/docker-compose)
CURL_EXIT_CODE = $?
if [ $CURL_EXIT_CODE -ne 0 ] ; then
echo " Error downloading docker-compose. curl failed with exit code $CURL_EXIT_CODE . There are still $(( TIME_LIMIT_SECONDS - ( CURRENT_TIME - START_TIME)) ) seconds left to retry... "
rm -rf /usr/local/bin/docker-compose
sleep 2
continue
fi
if [ " ${ STATUS_RECEIVED } " -ne "200" ] ; then
echo " Error downloading docker-compose. Received HTTP status code $STATUS_RECEIVED . There are still $(( TIME_LIMIT_SECONDS - ( CURRENT_TIME - START_TIME)) ) seconds left to retry... "
rm -rf /usr/local/bin/docker-compose
sleep 2
continue
fi
echo "Success downloading docker-compose"
chmod 755 /usr/local/bin/docker-compose
break
done
# Create a symbolic link to docker-compose in the Docker CLI plugins directory
# so docker compose can be used also
mkdir -p /usr/local/lib/docker/cli-plugins
ln -s /usr/local/bin/docker-compose /usr/local/lib/docker/cli-plugins/docker-compose
else
echo "Docker Compose already installed. Check you have the latest version for best compatibility"
fi
# Restart Docker and wait for it to start
systemctl enable docker
systemctl stop docker
systemctl start docker
wait_for_docker
# Create random temp directory
TMP_DIR = $( mktemp -d)
docker pull " ${ INSTALLER_IMAGE } "
# Generate installation scripts
COMMON_DOCKER_OPTIONS = " --network=host -v ${ TMP_DIR } :/output \
-e OPENVIDU_VERSION = $OPENVIDU_VERSION \
-e CADDY_SERVER_IMAGE = $CADDY_SERVER_IMAGE \
-e CADDY_SERVER_PRO_IMAGE = $CADDY_SERVER_PRO_IMAGE \
-e MINIO_SERVER_IMAGE = $MINIO_SERVER_IMAGE \
-e MINIO_CLIENT_IMAGE = $MINIO_CLIENT_IMAGE \
-e MONGO_SERVER_IMAGE = $MONGO_SERVER_IMAGE \
-e REDIS_SERVER_IMAGE = $REDIS_SERVER_IMAGE \
-e BUSYBOX_IMAGE = $BUSYBOX_IMAGE \
-e OPENVIDU_OPERATOR_IMAGE = $OPENVIDU_OPERATOR_IMAGE \
-e OPENVIDU_SERVER_PRO_IMAGE = $OPENVIDU_SERVER_PRO_IMAGE \
-e OPENVIDU_SERVER_IMAGE = $OPENVIDU_SERVER_IMAGE \
-e OPENVIDU_CALL_SERVER_IMAGE = $OPENVIDU_CALL_SERVER_IMAGE \
-e OPENVIDU_DASHBOARD_PRO_IMAGE = $OPENVIDU_DASHBOARD_PRO_IMAGE \
-e OPENVIDU_DASHBOARD_IMAGE = $OPENVIDU_DASHBOARD_IMAGE \
-e OPENVIDU_V2COMPATIBILITY_IMAGE = $OPENVIDU_V2COMPATIBILITY_IMAGE \
-e LIVEKIT_INGRESS_SERVER_IMAGE = $LIVEKIT_INGRESS_SERVER_IMAGE \
-e LIVEKIT_EGRESS_SERVER_IMAGE = $LIVEKIT_EGRESS_SERVER_IMAGE \
-e PROMETHEUS_IMAGE = $PROMETHEUS_IMAGE \
-e PROMTAIL_IMAGE = $PROMTAIL_IMAGE \
-e LOKI_IMAGE = $LOKI_IMAGE \
-e MIMIR_IMAGE = $MIMIR_IMAGE \
-e GRAFANA_IMAGE = $GRAFANA_IMAGE \
${ INSTALLER_IMAGE } \
--deployment-type= ha \
--node-role= media-node \
--install \
$* "
INTERACTIVE_MODE = true
for arg in " $@ " ; do
if [ " $arg " = "--no-tty" ] ; then
INTERACTIVE_MODE = false;
break
fi
done
if [ " $INTERACTIVE_MODE " = true ] ; then
docker run -it ${ COMMON_DOCKER_OPTIONS } > /dev/tty
else
docker run -i ${ COMMON_DOCKER_OPTIONS }
fi
cd " $TMP_DIR /installation-scripts/openvidu/ "
chmod +x install_ov_media_node.sh
./install_ov_media_node.sh
cat finish-message.txt
# Warn about private IP being setup correctly
echo
echo "ATTENTION!!! This is the private IP of this 'Media Node'. Make sure this IP is reachable from all the 'Master Node'"
cat private-ip.txt
echo "If this is not your private IP, reinstall the 'Media Node' with the correct '--private-ip' parameter"
echo