2025-04-22 11:46:24 +02:00
#!/bin/sh
set -eu
export INSTALL_PREFIX = " ${ INSTALL_PREFIX :- /opt/openvidu } "
2025-06-02 17:54:33 +02:00
export DOCKER_VERSION = " ${ DOCKER_VERSION :- 28 .1.1 } "
export DOCKER_COMPOSE_VERSION = " ${ DOCKER_COMPOSE_VERSION :- v2 .35.1 } "
2025-06-26 22:02:58 +02:00
export OPENVIDU_VERSION = " ${ OPENVIDU_VERSION :- main } "
2025-04-22 11:46:24 +02:00
export REGISTRY = " ${ REGISTRY :- docker .io } "
export UPDATER_IMAGE = " ${ UPDATER_IMAGE :- ${ REGISTRY } /openvidu/openvidu-updater : ${ OPENVIDU_VERSION } } "
2025-06-02 17:54:33 +02:00
# Function to compare two version strings
compare_versions( ) {
# Remove 'v' prefix if present
VERSION1 = $( echo " $1 " | sed 's/^v//' )
VERSION2 = $( echo " $2 " | sed 's/^v//' )
# Compare versions
if [ " $( printf '%s\n' " $VERSION1 " " $VERSION2 " | sort -V | head -n1) " = " $VERSION1 " ] ; then
if [ " $VERSION1 " = " $VERSION2 " ] ; then
echo "equal"
else
echo "lower"
fi
else
echo "higher"
fi
}
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
}
2025-04-22 11:46:24 +02:00
# Check if executing as root
if [ " $( id -u) " -ne 0 ] ; then
echo "Please run as root"
exit 1
fi
2025-06-02 17:54:33 +02:00
# Stop OpenVidu service
echo "Stopping OpenVidu service..."
systemctl stop openvidu
# Check Docker installation and version
DOCKER_NEEDED = false
2025-04-22 11:46:24 +02:00
if ! command -v docker > /dev/null 2>& 1; then
2025-06-02 17:54:33 +02:00
echo " Docker not found. Will install Docker version ${ DOCKER_VERSION } . "
DOCKER_NEEDED = true
else
CURRENT_DOCKER_VERSION = $( docker --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
VERSION_COMPARISON = $( compare_versions " $CURRENT_DOCKER_VERSION " " $DOCKER_VERSION " )
if [ " $VERSION_COMPARISON " = "lower" ] ; then
echo " Docker version $CURRENT_DOCKER_VERSION is older than required version $DOCKER_VERSION . "
echo " Please update Docker to version $DOCKER_VERSION or later. "
2025-04-22 11:46:24 +02:00
exit 1
2025-06-02 17:54:33 +02:00
else
echo " Docker version $CURRENT_DOCKER_VERSION is compatible with required version $DOCKER_VERSION . "
fi
2025-04-22 11:46:24 +02:00
fi
2025-06-02 17:54:33 +02:00
# Install Docker if needed
if [ " $DOCKER_NEEDED " = true ] ; 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; }
2025-04-22 11:46:24 +02:00
fi
2025-06-02 17:54:33 +02:00
# Check Docker Compose installation and version
DOCKER_COMPOSE_NEEDED = false
if ! command -v docker-compose > /dev/null 2>& 1; then
echo " Docker Compose not found. Will install Docker Compose version ${ DOCKER_COMPOSE_VERSION } . "
DOCKER_COMPOSE_NEEDED = true
else
CURRENT_DC_VERSION = $( docker-compose --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
# Add 'v' prefix for proper comparison
CURRENT_DC_VERSION = " v ${ CURRENT_DC_VERSION } "
VERSION_COMPARISON = $( compare_versions " $CURRENT_DC_VERSION " " $DOCKER_COMPOSE_VERSION " )
if [ " $VERSION_COMPARISON " = "lower" ] ; then
echo " Docker Compose version $CURRENT_DC_VERSION is older than required version $DOCKER_COMPOSE_VERSION . "
echo " Will update Docker Compose to version $DOCKER_COMPOSE_VERSION . "
DOCKER_COMPOSE_NEEDED = true
else
echo " Docker Compose version $CURRENT_DC_VERSION is compatible with required version $DOCKER_COMPOSE_VERSION . "
fi
fi
# Install or update Docker Compose if needed
if [ " $DOCKER_COMPOSE_NEEDED " = true ] ; 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 -f /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 -f /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 -f /usr/local/bin/docker-compose
sleep 2
continue
fi
echo " Success downloading docker-compose version $DOCKER_COMPOSE_VERSION "
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 -sf /usr/local/bin/docker-compose /usr/local/lib/docker/cli-plugins/docker-compose
fi
# Restart Docker and wait for it to start
systemctl enable docker
systemctl stop docker
systemctl start docker
wait_for_docker
2025-04-22 11:46:24 +02:00
# Pull updater image
docker pull " ${ UPDATER_IMAGE } "
# Temporary directory for post-update script
TMP_DIR = $( mktemp -d)
# Generate installation scripts
COMMON_DOCKER_OPTIONS = " --network=host \
-v ${ INSTALL_PREFIX } :${ INSTALL_PREFIX } \
-v ${ TMP_DIR } :${ TMP_DIR } \
${ UPDATER_IMAGE } \
--docker-registry= ${ REGISTRY } \
--install-prefix= ${ INSTALL_PREFIX } \
--post-update-script= " ${ TMP_DIR } /post-update.sh " \
$* "
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
2025-05-26 13:39:18 +02:00
# Trigger in cloud deployments (AWS, Azure, GCP...) a script to update the version of
# OpenVidu Server in their respective shared secret to allow the cluster to run new versions of the Media Nodes.
# In On premises deployments, this script does not exist.
# This script is only executed if the new version is greater or equal than 3.2.0
DEPLOYMENT_ENVIRONMENT = " $( grep environment " ${ INSTALL_PREFIX } /deployment-info.yaml " | cut -d':' -f2 | sed 's/^ *"//;s/"$//' ) "
if printf '%s\n%s\n' "3.2.0" " $OPENVIDU_VERSION " | sort -V -C; then
if [ -f /usr/local/bin/store_secret.sh ] &&
[ " $DEPLOYMENT_ENVIRONMENT " != "on_premise" ] ; then
echo "Updating OpenVidu version in Cloud provider..."
/usr/local/bin/store_secret.sh save OPENVIDU_VERSION " ${ OPENVIDU_VERSION } "
fi
fi
2025-04-22 11:46:24 +02:00
if [ -f " ${ TMP_DIR } /post-update.sh " ] ; then
chmod +x " ${ TMP_DIR } /post-update.sh "
" ${ TMP_DIR } /post-update.sh "
fi