From 523034c0883e792dbc96610ba25ff3f81ce25bca Mon Sep 17 00:00:00 2001 From: Evgeniy Antonyuk Date: Thu, 15 Aug 2024 15:20:30 +0300 Subject: [PATCH] Refactoring OCI docker (#311) --- install/OneClickInstall/install-Docker.sh | 213 +++++++++------------- 1 file changed, 87 insertions(+), 126 deletions(-) diff --git a/install/OneClickInstall/install-Docker.sh b/install/OneClickInstall/install-Docker.sh index ba452eee62..da3f8129ca 100644 --- a/install/OneClickInstall/install-Docker.sh +++ b/install/OneClickInstall/install-Docker.sh @@ -592,7 +592,7 @@ root_checking () { fi } -command_exists () { +is_command_exists () { type "$1" &> /dev/null; } @@ -747,22 +747,20 @@ check_hardware () { fi } -install_service () { - local COMMAND_NAME=$1 - local PACKAGE_NAME=$2 +install_package () { + if ! is_command_exists $1; then + local COMMAND_NAME=$1 + local PACKAGE_NAME=${2:-"$COMMAND_NAME"} + local PACKAGE_NAME_APT=${PACKAGE_NAME%%|*} + local PACKAGE_NAME_YUM=${PACKAGE_NAME##*|} - PACKAGE_NAME=${PACKAGE_NAME:-"$COMMAND_NAME"} + if is_command_exists apt-get; then + apt-get -y -q install ${PACKAGE_NAME_APT:-$PACKAGE_NAME} + elif is_command_exists yum; then + yum -y install ${PACKAGE_NAME_YUM:-$PACKAGE_NAME} + fi - if command_exists apt-get; then - apt-get -y update -qq - apt-get -y -q install $PACKAGE_NAME - elif command_exists yum; then - yum -y install $PACKAGE_NAME - fi - - if ! command_exists $COMMAND_NAME; then - echo "Command $COMMAND_NAME not found" - exit 1; + is_command_exists $COMMAND_NAME || { echo "Command $COMMAND_NAME not found"; exit 1; } fi } @@ -776,10 +774,6 @@ check_ports () { ARRAY_PORTS=(); USED_PORTS=""; - if ! command_exists netstat; then - install_service netstat net-tools - fi - if [ "${EXTERNAL_PORT//[0-9]}" = "" ]; then for RESERVED_PORT in "${RESERVED_PORTS[@]}" do @@ -854,21 +848,11 @@ check_docker_version () { done } -install_docker_using_script () { - if ! command_exists curl ; then - install_service curl - fi - - curl -fsSL https://get.docker.com -o get-docker.sh - sh get-docker.sh - rm get-docker.sh -} - install_docker () { if [ "${DIST}" == "Ubuntu" ] || [ "${DIST}" == "Debian" ] || [[ "${DIST}" == CentOS* ]] || [ "${DIST}" == "Fedora" ]; then - install_docker_using_script + curl -fsSL https://get.docker.com | bash systemctl start docker systemctl enable docker @@ -914,7 +898,7 @@ install_docker () { fi - if ! command_exists docker ; then + if ! is_command_exists docker ; then echo "error while installing docker" exit 1; fi @@ -957,30 +941,6 @@ read_continue_installation () { } domain_check () { - if ! command_exists dig; then - if command_exists apt-get; then - install_service dig dnsutils - elif command_exists yum; then - install_service dig bind-utils - fi - fi - - if ! command_exists ping; then - if command_exists apt-get; then - install_service ping iputils-ping - elif command_exists yum; then - install_service ping iputils - fi - fi - - if ! command_exists ip; then - if command_exists apt-get; then - install_service ip iproute2 - elif command_exists yum; then - install_service ip iproute - fi - fi - APP_DOMAIN_PORTAL=${LETS_ENCRYPT_DOMAIN:-${APP_URL_PORTAL:-$(get_env_parameter "APP_URL_PORTAL" "${PACKAGE_SYSNAME}-files" | awk -F[/:] '{if ($1 == "https") print $4; else print ""}')}} while IFS= read -r DOMAIN; do @@ -1032,7 +992,7 @@ get_env_parameter () { exit 1; fi - if command_exists docker ; then + if is_command_exists docker ; then [ -n "$CONTAINER_NAME" ] && CONTAINER_EXIST=$(docker ps -aqf "name=$CONTAINER_NAME"); if [[ -n ${CONTAINER_EXIST} ]]; then @@ -1048,19 +1008,6 @@ get_env_parameter () { } get_tag_from_hub () { - if ! command_exists curl ; then - install_service curl - fi - - if ! command_exists jq ; then - if command_exists yum; then - if ! rpm -q epel-release > /dev/null 2>&1; then - [ "${OFFLINE_INSTALLATION}" = "false" ] && rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-$REV.noarch.rpm - fi - fi - install_service jq - fi - if [[ -n ${HUB} ]]; then if [[ -n ${USERNAME} && -n ${PASSWORD} ]]; then CREDENTIALS=$(echo -n "$USERNAME:$PASSWORD" | base64) @@ -1185,14 +1132,6 @@ set_installation_type_data () { } download_files () { - if ! command_exists docker-compose; then - [ "${OFFLINE_INSTALLATION}" = "false" ] && install_docker_compose || { echo "docker-compose not installed"; exit 1; } - else - if [ "$(docker-compose --version | grep -oP '(?<=v)\d+\.\d+'| sed 's/\.//')" -lt "21" ]; then - [ "$OFFLINE_INSTALLATION" = "false" ] && install_docker_compose || { echo "docker-compose version is outdated"; exit 1; } - fi - fi - # Fixes issues with variables when upgrading to v1.1.3 HOSTS=("ELK_HOST" "REDIS_HOST" "RABBIT_HOST" "MYSQL_HOST"); for HOST in "${HOSTS[@]}"; do [[ "${!HOST}" == *CONTAINER_PREFIX* || "${!HOST}" == *$PACKAGE_SYSNAME* ]] && export "$HOST="; done @@ -1200,10 +1139,6 @@ download_files () { [ "${OFFLINE_INSTALLATION}" = "false" ] && echo -n "Downloading configuration files to ${BASE_DIR}..." || echo "Unzip docker.tar.gz to ${BASE_DIR}..." - if ! command_exists tar; then - install_service tar - fi - [ -d "${BASE_DIR}" ] && rm -rf "${BASE_DIR}" mkdir -p ${BASE_DIR} @@ -1228,11 +1163,6 @@ download_files () { fi echo "OK" - - reconfigure HUB "${HUB%/}${HUB:+/}" - reconfigure STATUS ${STATUS} - reconfigure INSTALLATION_TYPE ${INSTALLATION_TYPE} - reconfigure NETWORK_NAME ${NETWORK_NAME} } reconfigure () { @@ -1250,10 +1180,8 @@ install_mysql_server () { reconfigure MYSQL_USER ${MYSQL_USER} reconfigure MYSQL_PASSWORD ${MYSQL_PASSWORD} reconfigure MYSQL_ROOT_PASSWORD ${MYSQL_ROOT_PASSWORD} - reconfigure MYSQL_VERSION ${MYSQL_VERSION} if [[ -z ${MYSQL_HOST} ]] && [ "$INSTALL_MYSQL_SERVER" == "true" ]; then - offline_check_docker_image ${BASE_DIR}/db.yml docker-compose -f $BASE_DIR/db.yml up -d elif [ "$INSTALL_MYSQL_SERVER" == "pull" ]; then docker-compose -f $BASE_DIR/db.yml pull @@ -1267,7 +1195,6 @@ install_mysql_server () { install_document_server () { reconfigure DOCUMENT_SERVER_JWT_HEADER ${DOCUMENT_SERVER_JWT_HEADER} reconfigure DOCUMENT_SERVER_JWT_SECRET ${DOCUMENT_SERVER_JWT_SECRET} - reconfigure DOCUMENT_SERVER_IMAGE_NAME "${HUB%/}${HUB:+/}${DOCUMENT_SERVER_IMAGE_NAME}:${DOCUMENT_SERVER_VERSION:-$(get_available_version "$DOCUMENT_SERVER_IMAGE_NAME")}" if [[ -z ${DOCUMENT_SERVER_HOST} ]] && [ "$INSTALL_DOCUMENT_SERVER" == "true" ]; then docker-compose -f $BASE_DIR/ds.yml up -d elif [ "$INSTALL_DOCUMENT_SERVER" == "pull" ]; then @@ -1282,7 +1209,6 @@ install_document_server () { install_rabbitmq () { if [[ -z ${RABBIT_HOST} ]] && [ "$INSTALL_RABBITMQ" == "true" ]; then - offline_check_docker_image ${BASE_DIR}/rabbitmq.yml docker-compose -f $BASE_DIR/rabbitmq.yml up -d elif [ "$INSTALL_RABBITMQ" == "pull" ]; then docker-compose -f $BASE_DIR/rabbitmq.yml pull @@ -1298,7 +1224,6 @@ install_rabbitmq () { install_redis () { if [[ -z ${REDIS_HOST} ]] && [ "$INSTALL_REDIS" == "true" ]; then - offline_check_docker_image ${BASE_DIR}/redis.yml docker-compose -f $BASE_DIR/redis.yml up -d elif [ "$INSTALL_REDIS" == "pull" ]; then docker-compose -f $BASE_DIR/redis.yml pull @@ -1312,14 +1237,12 @@ install_redis () { } install_elasticsearch () { - reconfigure ELK_VERSION ${ELK_VERSION} if [[ -z ${ELK_HOST} ]] && [ "$INSTALL_ELASTICSEARCH" == "true" ]; then if [ $(free --mega | grep -oP '\d+' | head -n 1) -gt "12000" ]; then #RAM ~12Gb sed -i 's/Xms[0-9]g/Xms4g/g; s/Xmx[0-9]g/Xmx4g/g' $BASE_DIR/opensearch.yml else sed -i 's/Xms[0-9]g/Xms1g/g; s/Xmx[0-9]g/Xmx1g/g' $BASE_DIR/opensearch.yml fi - offline_check_docker_image ${BASE_DIR}/opensearch.yml docker-compose -f $BASE_DIR/opensearch.yml up -d elif [ "$INSTALL_ELASTICSEARCH" == "pull" ]; then docker-compose -f $BASE_DIR/opensearch.yml pull @@ -1333,14 +1256,6 @@ install_elasticsearch () { install_fluent_bit () { if [ "$INSTALL_FLUENT_BIT" == "true" ]; then - if ! command_exists crontab; then - if command_exists apt-get; then - install_service crontab cron - elif command_exists yum; then - install_service crontab cronie - fi - fi - [ ! -z "$ELK_HOST" ] && sed -i "s/ELK_CONTAINER_NAME/ELK_HOST/g" $BASE_DIR/fluent.yml ${BASE_DIR}/dashboards.yml OPENSEARCH_INDEX="${OPENSEARCH_INDEX:-"${PACKAGE_SYSNAME}-fluent-bit"}" @@ -1355,9 +1270,6 @@ install_fluent_bit () { reconfigure DASHBOARDS_USERNAME "${DASHBOARDS_USERNAME:-"${PACKAGE_SYSNAME}"}" reconfigure DASHBOARDS_PASSWORD "${DASHBOARDS_PASSWORD:-$(get_random_str 20)}" - - offline_check_docker_image ${BASE_DIR}/fluent.yml - offline_check_docker_image ${BASE_DIR}/dashboards.yml docker-compose -f ${BASE_DIR}/fluent.yml -f ${BASE_DIR}/dashboards.yml up -d elif [ "$INSTALL_FLUENT_BIT" == "pull" ]; then @@ -1366,8 +1278,6 @@ install_fluent_bit () { } install_product () { - DOCKER_TAG="${DOCKER_TAG:-$(get_available_version ${IMAGE_NAME})}" - reconfigure DOCKER_TAG ${DOCKER_TAG} if [ "$INSTALL_PRODUCT" == "true" ]; then [ "${UPDATE}" = "true" ] && LOCAL_CONTAINER_TAG="$(docker inspect --format='{{index .Config.Image}}' ${CONTAINER_NAME} | awk -F':' '{print $2}')" @@ -1387,12 +1297,6 @@ install_product () { echo -n "Waiting for MySQL container to become healthy..." (timeout 30 bash -c "while ! docker inspect --format '{{json .State.Health.Status }}' ${PACKAGE_SYSNAME}-mysql-server | grep -q 'healthy'; do sleep 1; done") && echo "OK" || (echo "FAILED") fi - - offline_check_docker_image ${BASE_DIR}/migration-runner.yml - offline_check_docker_image ${BASE_DIR}/${PRODUCT}.yml - offline_check_docker_image ${PROXY_YML} - offline_check_docker_image ${BASE_DIR}/notify.yml - offline_check_docker_image ${BASE_DIR}/healthchecks.yml docker-compose -f $BASE_DIR/migration-runner.yml up -d if [[ -n $(docker ps -q --filter "name=${PACKAGE_SYSNAME}-migration-runner") ]]; then @@ -1450,13 +1354,10 @@ make_swap () { } offline_check_docker_image() { - if [ "${OFFLINE_INSTALLATION}" != "false" ]; then - [ ! -f "$1" ] && { echo "Error: File '$1' does not exist."; exit 1; } - - docker-compose -f "$1" config | grep -oP 'image:\s*\K\S+' | while IFS= read -r IMAGE_TAG; do - docker images "${IMAGE_TAG}" | grep -q "${IMAGE_TAG%%:*}" || { echo "Error: The image '${IMAGE_TAG}' is not found in the local Docker registry."; kill -s TERM $PID; } - done - fi + [ ! -f "$1" ] && { echo "Error: File '$1' does not exist."; exit 1; } + docker-compose -f "$1" config | grep -oP 'image:\s*\K\S+' | while IFS= read -r IMAGE_TAG; do + docker images "${IMAGE_TAG}" | grep -q "${IMAGE_TAG%%:*}" || { echo "Error: The image '${IMAGE_TAG}' is not found in the local Docker registry."; kill -s TERM $PID; } + done } check_hub_connection() { @@ -1464,6 +1365,69 @@ check_hub_connection() { [ -z "$TAGS_RESP" ] && { echo -e "Unable to download tags from ${HUB:-hub.docker.com}.\nTry specifying another dockerhub name using -hub"; exit 1; } || true } +dependency_installation() { + is_command_exists apt-get && apt-get -y update -qq + + install_package tar + install_package curl + install_package netstat net-tools + + if [ "${OFFLINE_INSTALLATION}" = "false" ]; then + install_package dig "dnsutils|bind-utils" + install_package ping "iputils-ping|iputils" + install_package ip "iproute2|iproute" + fi + + [ "$INSTALL_FLUENT_BIT" = "true" ] && install_package crontab "cron|cronie" + + if ! is_command_exists jq ; then + if is_command_exists yum && ! rpm -q epel-release > /dev/null 2>&1; then + [ "${OFFLINE_INSTALLATION}" = "false" ] && rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-${REV}.noarch.rpm + fi + install_package jq + fi + + is_command_exists docker && { check_docker_version; service docker start; } || { [ "${OFFLINE_INSTALLATION}" = "false" ] && install_docker || { echo "docker not installed"; exit 1; }; } + + if ! is_command_exists docker-compose; then + [ "${OFFLINE_INSTALLATION}" = "false" ] && install_docker_compose || { echo "docker-compose not installed"; exit 1; } + elif [ "$(docker-compose --version | grep -oP '(?<=v)\d+\.\d+'| sed 's/\.//')" -lt "21" ]; then + [ "$OFFLINE_INSTALLATION" = "false" ] && install_docker_compose || { echo "docker-compose version is outdated"; exit 1; } + fi +} + +check_docker_image () { + reconfigure HUB "${HUB%/}${HUB:+/}" + reconfigure STATUS ${STATUS} + reconfigure INSTALLATION_TYPE ${INSTALLATION_TYPE} + reconfigure NETWORK_NAME ${NETWORK_NAME} + + reconfigure MYSQL_VERSION ${MYSQL_VERSION} + reconfigure ELK_VERSION ${ELK_VERSION} + reconfigure DOCUMENT_SERVER_IMAGE_NAME "${DOCUMENT_SERVER_IMAGE_NAME}:\${DOCUMENT_SERVER_VERSION}" + reconfigure DOCUMENT_SERVER_VERSION ${DOCUMENT_SERVER_VERSION:-$(get_available_version "$DOCUMENT_SERVER_IMAGE_NAME")} + + DOCKER_TAG="${DOCKER_TAG:-$(get_available_version ${IMAGE_NAME})}" + reconfigure DOCKER_TAG ${DOCKER_TAG} + if [ "${OFFLINE_INSTALLATION}" != "false" ]; then + [ "$INSTALL_RABBITMQ" == "true" ] && offline_check_docker_image ${BASE_DIR}/db.yml + [ "$INSTALL_RABBITMQ" == "true" ] && offline_check_docker_image ${BASE_DIR}/rabbitmq.yml + [ "$INSTALL_REDIS" == "true" ] && offline_check_docker_image ${BASE_DIR}/redis.yml + [ "$INSTALL_FLUENT_BIT" == "true" ] && offline_check_docker_image ${BASE_DIR}/fluent.yml + [ "$INSTALL_FLUENT_BIT" == "true" ] && offline_check_docker_image ${BASE_DIR}/dashboards.yml + [ "$INSTALL_ELASTICSEARCH" == "true" ] && offline_check_docker_image ${BASE_DIR}/opensearch.yml + [ "$INSTALL_DOCUMENT_SERVER" == "true" ] && offline_check_docker_image ${BASE_DIR}/ds.yml + + if [ "$INSTALL_PRODUCT" == "true" ]; then + offline_check_docker_image ${BASE_DIR}/migration-runner.yml + offline_check_docker_image ${BASE_DIR}/${PRODUCT}.yml + offline_check_docker_image ${BASE_DIR}/notify.yml + offline_check_docker_image ${BASE_DIR}/healthchecks.yml + offline_check_docker_image ${PROXY_YML} + fi + fi +} + start_installation () { root_checking @@ -1473,6 +1437,8 @@ start_installation () { check_os_info check_kernel + dependency_installation + if [ "$UPDATE" != "true" ]; then check_ports fi @@ -1485,13 +1451,6 @@ start_installation () { make_swap fi - if command_exists docker ; then - check_docker_version - service docker start - else - [ "${OFFLINE_INSTALLATION}" = "false" ] && install_docker || { echo "docker not installed"; exit 1; } - fi - docker_login [ "${OFFLINE_INSTALLATION}" = "false" ] && check_hub_connection @@ -1514,6 +1473,8 @@ start_installation () { download_files + check_docker_image + install_elasticsearch install_fluent_bit