From f989dc26d251b7a2bb8f2e9c1774bc6bbafbb9d4 Mon Sep 17 00:00:00 2001 From: cruizba Date: Mon, 2 Jun 2025 17:54:33 +0200 Subject: [PATCH] openvidu-deployment: Force minimum docker and docker-compose version in update script. --- openvidu-deployment/update.sh | 145 +++++++++++++++++++++++++++++++--- 1 file changed, 133 insertions(+), 12 deletions(-) diff --git a/openvidu-deployment/update.sh b/openvidu-deployment/update.sh index aaefcfad..04225e9e 100644 --- a/openvidu-deployment/update.sh +++ b/openvidu-deployment/update.sh @@ -1,32 +1,153 @@ #!/bin/sh set -eu export INSTALL_PREFIX="${INSTALL_PREFIX:-/opt/openvidu}" +export DOCKER_VERSION="${DOCKER_VERSION:-28.1.1}" +export DOCKER_COMPOSE_VERSION="${DOCKER_COMPOSE_VERSION:-v2.35.1}" export OPENVIDU_VERSION="${OPENVIDU_VERSION:-main}" export REGISTRY="${REGISTRY:-docker.io}" export UPDATER_IMAGE="${UPDATER_IMAGE:-${REGISTRY}/openvidu/openvidu-updater:${OPENVIDU_VERSION}}" +# 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 +} + # Check if executing as root if [ "$(id -u)" -ne 0 ]; then echo "Please run as root" exit 1 fi -# Check if docker is installed -if ! command -v docker > /dev/null 2>&1; then - echo "Docker is not installed. Please install Docker and try again." - exit 1 -fi - -# Check if file /opt/openvidu/deployment-info.yaml exists -if ! [ -f /opt/openvidu/deployment-info.yaml ]; then - echo "OpenVidu is not installed. Please install OpenVidu and try again." - exit 1 -fi - # Stop OpenVidu service echo "Stopping OpenVidu service..." systemctl stop openvidu +# Check Docker installation and version +DOCKER_NEEDED=false +if ! command -v docker > /dev/null 2>&1; then + 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." + exit 1 + else + echo "Docker version $CURRENT_DOCKER_VERSION is compatible with required version $DOCKER_VERSION." + fi +fi + +# 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; } +fi + +# 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 + + # Pull updater image docker pull "${UPDATER_IMAGE}"