#!/bin/bash

###########################################################
# MediaHarbor Installer
# Traffic Sim Co., Ltd.
# https://mediaharbor.trafficsim.co.jp/
###########################################################

[[ $TRACE ]] && set -x

SCRIPT_PATH="$(dirname "$(readlink -f "$0")")"
CONFIG_FILE="$SCRIPT_PATH/.installer_default"
declare -A CONFIGS

# 最後に入力した内容を読み込む
if [[ -f $CONFIG_FILE ]]; then
    while IFS="=" read -r key value
    do
        CONFIGS["$key"]="$value"
    done < "$CONFIG_FILE"
else
    # デフォルト値
    CONFIGS["API_KEY"]=""
    CONFIGS["DOMAIN"]="https://"
fi

# 対応OS
SUPPORTED_OS="almalinux,rocky,ubuntu,amzn,rhel,ol"

# コンテナイメージ取得先
REGISTRY_URL="public.ecr.aws/mediaharbor"

###########################################################
# Docker Compose command resolver
# - Prefer `docker compose` (compose plugin) for Docker v29+ compatibility
# - Fall back to `docker-compose` if available
###########################################################

DOCKER_COMPOSE_CMD=()

###########################################################
# Docker API version compatibility
# - Docker 29+ requires API version 1.25+ (Docker 25+)
# - For Docker 24 or older, set DOCKER_API_VERSION=1.43
###########################################################

DOCKER_API_VERSION_COMPAT=""

get_docker_major_version() {
  local version_str
  version_str=$(docker version --format '{{.Server.Version}}' 2>/dev/null)
  if [ -z "$version_str" ]; then
    echo "0"
    return
  fi
  echo "$version_str" | cut -d'.' -f1
}

detect_docker_api_compat() {
  local major_version
  major_version=$(get_docker_major_version)
  if [ "$major_version" -le 24 ] 2>/dev/null; then
    DOCKER_API_VERSION_COMPAT="1.43"
  fi
}

detect_docker_compose() {
  if docker compose version >/dev/null 2>&1; then
    DOCKER_COMPOSE_CMD=(docker compose)
    return 0
  fi

  if command -v docker-compose >/dev/null 2>&1; then
    DOCKER_COMPOSE_CMD=(docker-compose)
    return 0
  fi

  return 1
}

prepare_db_service_for_setup() {
  echo "DBコンテナを停止しています..."
  sudo "${DOCKER_COMPOSE_CMD[@]}" down --remove-orphans 2>/dev/null || true
  sudo "${DOCKER_COMPOSE_CMD[@]}" stop -t 30 db 2>/dev/null || true
  sudo "${DOCKER_COMPOSE_CMD[@]}" rm -f db 2>/dev/null || true
  sudo docker rm -f db 2>/dev/null || true

  local elapsed=0
  while [ "$elapsed" -lt 30 ]; do
    if ! docker ps -a --filter "name=^db$" --format '{{.Names}}' 2>/dev/null | grep -qx db; then
      sleep 2
      return 0
    fi
    sleep 1
    elapsed=$((elapsed + 1))
  done

  return 1
}

clean_stale_mariadb_datadir_locks() {
  local data_dir="${SCRIPT_PATH}/DB/data"

  if [ ! -d "$data_dir" ]; then
    return 0
  fi

  if docker ps --filter "name=^db$" --filter status=running -q 2>/dev/null | grep -q .; then
    return 0
  fi

  echo "DBデータディレクトリのスタロックファイルを削除しています..."
  rm -f "${data_dir}/aria_log_control" "${data_dir}/aria_log_control.lock" 2>/dev/null || true
  rm -f "${data_dir}/ddl_recovery.log" 2>/dev/null || true
}

has_existing_db_datadir() {
  local data_dir="${SCRIPT_PATH}/DB/data"

  [ -d "${data_dir}/mysql" ] || [ -f "${data_dir}/ibdata1" ]
}

prompt_db_backup_before_upgrade() {
  if ! command -v whiptail >/dev/null 2>&1; then
    echo "DBバックアップ: whiptail が無いためスキップします"
    return 1
  fi

  local data_dir="${SCRIPT_PATH}/DB/data"
  local size_bytes size_human estimated_seconds time_str

  size_bytes=$(du -sb "$data_dir" 2>/dev/null | awk '{print $1}')
  size_human=$(du -sh "$data_dir" 2>/dev/null | awk '{print $1}')
  estimated_seconds=$(( ${size_bytes:-0} / 83886080 ))

  if [ "${estimated_seconds:-0}" -lt 1 ]; then
    time_str="1秒未満"
  elif [ "$estimated_seconds" -lt 60 ]; then
    time_str="約${estimated_seconds}秒"
  else
    time_str="約$(( estimated_seconds / 60 ))分"
  fi

  whiptail --title "MediaHarbor Installer" --yesno \
    "MariaDB アップグレード前に、既存の DB データ (./DB/data) をバックアップしますか？\n\nデータサイズ: ${size_human:-不明}  /  予想時間: ${time_str} (目安)\n\n保存先: ./DB/backups/db_backup_YYYYMMDD_HHMMSS.tar.gz\nデータ量によりディスクを多く使います。" \
    15 72
}

backup_db_datadir_before_upgrade() {
  local backup_dir="${SCRIPT_PATH}/DB/backups"
  local timestamp archive

  mkdir -p "$backup_dir"
  timestamp=$(date +%Y%m%d_%H%M%S)
  archive="${backup_dir}/db_backup_${timestamp}.tar.gz"

  local tar_exit=1
  local data_size
  data_size=$(du -sb "${SCRIPT_PATH}/DB/data" 2>/dev/null | awk '{print $1}')

  if command -v pv >/dev/null 2>&1 && command -v whiptail >/dev/null 2>&1; then
    local fifo tmpstatus archive_display
    archive_display="./DB/backups/$(basename "$archive")"
    fifo=$(mktemp -u /tmp/mh_backup_XXXXXX)
    tmpstatus=$(mktemp)
    mkfifo "$fifo"

    (
      tar -czf - -C "${SCRIPT_PATH}/DB" data
      echo $? > "$tmpstatus"
    ) | pv -n -s "${data_size:-0}" >"$archive" 2>"$fifo" &

    whiptail --title "MediaHarbor Installer" \
      --gauge "既存DBデータをバックアップしています...\n\n出力: ${archive_display}" \
      10 72 0 < "$fifo"

    wait
    tar_exit=$(cat "$tmpstatus" 2>/dev/null || echo 1)
    rm -f "$fifo" "$tmpstatus"

  elif command -v pv >/dev/null 2>&1; then
    echo "既存DBデータをバックアップしています（アップグレード前）..."
    echo "  出力: ${archive}"
    tar -czf - -C "${SCRIPT_PATH}/DB" data \
      | pv -s "${data_size:-0}" > "$archive"
    tar_exit=${PIPESTATUS[0]}
  else
    echo "既存DBデータをバックアップしています（アップグレード前）..."
    echo "  出力: ${archive}"
    tar -czf "$archive" -C "${SCRIPT_PATH}/DB" data &
    local tar_pid=$!
    local chars='/-\|'
    local i=0
    while kill -0 "$tar_pid" 2>/dev/null; do
      printf "\r  バックアップ中... %s" "${chars:$((i % 4)):1}"
      i=$((i + 1))
      sleep 0.3
    done
    wait "$tar_pid"
    tar_exit=$?
    printf "\r%40s\r"
  fi

  if [ "$tar_exit" -eq 0 ]; then
    echo -e "DBバックアップ:\e[32mSuccess!\e[m"
    return 0
  fi

  rm -f "$archive"
  echo -e "DBバックアップ:\e[31mError!\e[m"
  return 1
}

wait_for_db_ready() {
  local elapsed=0
  local max_wait=600
  local ok_count=0

  while [ "$elapsed" -lt "$max_wait" ]; do
    local status
    status=$(docker inspect -f '{{.State.Status}}' db 2>/dev/null || echo "missing")

    if [ "$status" = "exited" ]; then
      return 1
    fi

    if { [ "$status" = "running" ] || [ "$status" = "starting" ]; } \
      && docker exec db env -u MARIADB_HOST -u MYSQL_HOST sh -c \
      'mariadb-admin ping -h127.0.0.1 -uroot -pqSm5kuTj --silent' >/dev/null 2>&1; then
      ok_count=$((ok_count + 1))
      if [ "$ok_count" -ge 2 ]; then
        return 0
      fi
    else
      ok_count=0
    fi

    sleep 2
    elapsed=$((elapsed + 2))
  done

  return 1
}

report_db_startup_failure() {
  local status
  status=$(docker inspect -f '{{.State.Status}}' db 2>/dev/null || echo "missing")
  echo -e "DB:\e[31m起動待機 Error!\e[m (コンテナ状態: ${status})"
  if [ "$status" = "running" ]; then
    echo "  ※コンテナは running ですが MariaDB サーバーは応答していません"
  fi
  echo "  ログ末尾:"
  docker logs db --tail 12 2>&1 | sed 's/^/    /' || true
  echo "  対処例:"
  echo "    cd $SCRIPT_PATH"
  echo "    sudo docker compose down --remove-orphans"
  echo "    sudo docker rm -f db"
  echo "    再インストールでよい場合: sudo rm -rf ./DB/data  （既存DBデータは削除されます）"
}

start_db_for_setup() {
  local attempt
  local db_backup_done=false

  for attempt in 1 2 3; do
    if ! prepare_db_service_for_setup; then
      return 1
    fi

    if [ "$db_backup_done" = false ] && has_existing_db_datadir; then
      if prompt_db_backup_before_upgrade; then
        if ! backup_db_datadir_before_upgrade; then
          return 1
        fi
      else
        echo -e "DBバックアップ:\e[33mスキップ\e[m"
      fi
      db_backup_done=true
    fi

    if [ "$attempt" -ge 2 ]; then
      clean_stale_mariadb_datadir_locks
    fi

    if [ "$attempt" -eq 3 ]; then
      if [ -d "${SCRIPT_PATH}/DB/data" ] && command -v whiptail >/dev/null 2>&1; then
        whiptail --title "MediaHarbor Installer" --yesno \
          "DBの起動に失敗しました。\n./DB/data を削除してデータベースを初期化しますか？\n\n※既存のDBデータはすべて失われます。" \
          12 70
        if [ $? -eq 0 ]; then
          echo "DBデータディレクトリを初期化しています..."
          rm -rf "${SCRIPT_PATH}/DB/data"
          mkdir -p "${SCRIPT_PATH}/DB/data"
        fi
      fi
    fi

    sudo "${DOCKER_COMPOSE_CMD[@]}" up -d db

    if wait_for_db_ready; then
      return 0
    fi

    if [ "$attempt" -lt 3 ]; then
      echo "DB起動に失敗したため再試行します (${attempt}/3)..."
      report_db_startup_failure
    fi
  done

  report_db_startup_failure
  return 1
}

run_zabbix_db_init() {
  docker exec -i db env -u MARIADB_HOST -u MYSQL_HOST sh -c \
    'exec mariadb -h127.0.0.1 -uroot -pqSm5kuTj' < ./conf/DB/zabbix_users.sql
}

install_docker_compose() {
  # Prefer package-based compose plugin where possible
  case "$DISTRO" in
    ubuntu)
      # /cdromリポジトリを無効化（CD-ROMがマウントされていない場合のエラーを回避）
      if [ -f /etc/apt/sources.list ]; then
        sudo sed -i 's|^deb.*file:/cdrom|#&|' /etc/apt/sources.list || true
      fi
      
      # dpkgロックを待つ（unattended-upgrなどのプロセスが完了するまで待機）
      echo "Waiting for package manager to be available..."
      timeout=300  # 最大5分待機
      elapsed=0
      while [ $elapsed -lt $timeout ]; do
        if ! sudo fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 && \
           ! sudo fuser /var/lib/dpkg/lock >/dev/null 2>&1 && \
           ! sudo fuser /var/cache/apt/archives/lock >/dev/null 2>&1; then
          break
        fi
        sleep 2
        elapsed=$((elapsed + 2))
      done
      
      # apt-get updateを実行（エラーは無視）
      sudo apt-get update -o Acquire::Check-Valid-Until=false 2>&1 | grep -v "file:/cdrom" || true
      sudo apt-get install -y docker-compose-plugin || true
      ;;
    centos|almalinux|rocky|rhel|ol)
      if command -v dnf >/dev/null 2>&1; then
        sudo dnf install -y docker-compose-plugin || true
      elif command -v yum >/dev/null 2>&1; then
        sudo yum install -y docker-compose-plugin || true
      fi
      ;;
    amzn)
      # Amazon Linux 2023の場合、手動でDocker Compose Pluginをインストール
      if [[ $DISTRO_VERSION == 2023 ]]; then
        sudo mkdir -p /usr/local/lib/docker/cli-plugins
        sudo curl -SL https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
        sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
      fi
      ;;
  esac

  if detect_docker_compose; then
    return 0
  fi

  return 1
}

echo " __  __          _ _       _   _            _"
echo "|  \/  | ___  __| (_) __ _| | | | __ _ _ __| |__   ___  _ __"
echo "| |\/| |/ _ \/ _\` | |/ _\` | |_| |/ _\` | '__| '_ \ / _ \| '__|"
echo "| |  | |  __/ (_| | | (_| |  _  | (_| | |  | |_) | (_) | |"
echo "|_|  |_|\___|\__,_|_|\__,_|_| |_|\__,_|_|  |_.__/ \___/|_|"
echo "MultiView System \"Offline\" Installer by.Traffic Sim Co., Ltd."
# タイトル画面
whiptail --msgbox " __  __          _ _       _   _            _\n\
|  \/  | ___  __| (_) __ _| | | | __ _ _ __| |__   ___  _ __\n\
| |\/| |/ _ \/ _\` | |/ _\` | |_| |/ _\` | '__| '_ \ / _ \| '__|\n\
| |  | |  __/ (_| | | (_| |  _  | (_| | |  | |_) | (_) | |\n\
|_|  |_|\___|\__,_|_|\__,_|_| |_|\__,_|_|  |_.__/ \___/|_|\n\n\
MultiView System \"Offline\" Installer by.Traffic Sim Co., Ltd." --ok-button "開始" --fb 15 65

# docker-composeファイルの存在チェック
if [ -e docker-compose.yml ]; then
    whiptail --title "MediaHarbor Installer" --yesno "既にdocker-compose.ymlファイルが存在しています。\nアップデートまたは設定の更新を行いますか？" --notags 8 52
    if [ $? -eq 0 ]; then
        rm docker-compose.yml -f
    else
        echo -e "\e[31mError:既にdocker-compose.ymlが存在しているため中止しました。\e[m"
        exit 1
    fi
fi

# OSチェック
DISTRO=$(. /etc/os-release && echo "$ID")
DISTRO_VERSION=$(. /etc/os-release && echo "$VERSION_ID")

# 対応OSチェック
if [[ ! "${SUPPORTED_OS[@]}" =~ "${DISTRO}" ]]; then
    echo -e "\e[31mError:対応していないOS:${DISTRO}の為インストールできません。\e[m"
    echo -e "\e[31m対応OS:\e[m"
    for ((i = 0; i < ${#SUPPORTED_OS[@]}; i += 2)); do
        echo -e "\e[31m${SUPPORTED_OS[$i]} ${SUPPORTED_OS[$i + 1]}\e[m"
    done
    exit 1
fi
echo -e "OS:\e[32m$DISTRO $DISTRO_VERSION\e[m"

# CPUアーキテクチャチェック
CPU_ARCH=$(uname -m)

# 対応CPUアーキテクチャチェック
if [[ ! "${CPU_ARCH}" =~ "x86_64" ]] && [[ ! "${CPU_ARCH}" =~ "aarch64" ]]; then
    echo -e "\e[31mError:対応していないCPUアーキテクチャ:${CPU_ARCH}の為インストールできません。\e[m"
    echo -e "\e[31m対応CPUアーキテクチャ:\e[m"
    echo -e "\e[31mx86_64\e[m"
    echo -e "\e[31maarch64\e[m"
    exit 1
fi

IMAGE_TAG="latest"

# オフラインアーカイブの事前確認（mediaharbor）
ARCHIVE_PATH="$SCRIPT_PATH/mediaharbor.tar.gz"
if [ ! -f "$ARCHIVE_PATH" ]; then
    whiptail --title "MediaHarbor Installer" --yesno "mediaharbor.tar.gz が見つかりません。\n今すぐダウンロードしますか？" --notags 9 68
    if [ $? -eq 0 ]; then
        echo "mediaharbor.tar.gz をダウンロードしています..."
        (cd "$SCRIPT_PATH" && sudo -E curl -fL https://mediaharbor.trafficsim.co.jp/downloads/mediaharbor.tar.gz -o mediaharbor.tar.gz)
        if [ $? -ne 0 ]; then
            echo -e "mediaharbor.tar.gz:\e[31mDownload Error!\e[m"
            exit 1
        else
            echo -e "mediaharbor.tar.gz:\e[32mDownloaded!\e[m"
        fi
    else
        echo -e "\e[31mError: mediaharbor.tar.gz が必要です。処理を中止します。\e[m"
        exit 1
    fi
fi

# オフラインアーカイブの事前確認（grafana）
GRAFANA_ARCHIVE="$SCRIPT_PATH/grafana.tar.gz"
if [ ! -f "$GRAFANA_ARCHIVE" ]; then
    whiptail --title "MediaHarbor Installer" --yesno "grafana.tar.gz が見つかりません。\n今すぐダウンロードしますか？" --notags 9 68
    if [ $? -eq 0 ]; then
        echo "grafana.tar.gz をダウンロードしています..."
        (cd "$SCRIPT_PATH" && sudo -E curl -fL https://mediaharbor.trafficsim.co.jp/downloads/grafana.tar.gz -o grafana.tar.gz)
        if [ $? -ne 0 ]; then
            echo -e "grafana.tar.gz:\e[31mDownload Error!\e[m"
            exit 1
        else
            echo -e "grafana.tar.gz:\e[32mDownloaded!\e[m"
        fi
    else
        echo -e "\e[31mError: grafana.tar.gz が必要です。処理を中止します。\e[m"
        exit 1
    fi
fi

# 確認用にIMAGE_TAGを出力
echo "IMAGE_TAG=${IMAGE_TAG}"

# インストールパス確認
whiptail --title "MediaHarbor Installer" --yesno "$SCRIPT_PATHにインストールしてよろしいですか？\n
変更する場合はinstaller.shファイルを移動後再度実行してください。" 10 70
if [ ! $? -eq 0 ]; then
    echo -e "\e[31mインストール先を変更するには$SCRIPT_PATH/installer.shを移動後、再度実行してください。\e[m"
    echo -e "\e[31mmv $SCRIPT_PATH/installer.sh インストール先ディレクトリ\e[m"
    exit 1
fi

# APIキーの入力
APIKEY=$(whiptail --title "MediaHarbor Installer" --inputbox "APIキーを入力してください。\nお持ちでない場合はライセンス管理システム\nhttps://license.trafficsim.co.jp/\nにログインして生成してください。" --ok-button "決定" --cancel-button "中止" 10 50 "${CONFIGS["API_KEY"]}" 3>&1 1>&2 2>&3)
if [ $? -eq 0 ]; then
    echo -e "APIキー:\e[32m$APIKEY\e[m"
else
    echo -e "\e[31mError:APIキーを入力してください。\e[m"
    echo -e "\e[31mお持ちでない場合はライセンス管理システム https://license.trafficsim.co.jp/ にログインして生成してください。\e[m"
    exit 1
fi
echo "API_KEY=$APIKEY" > $CONFIG_FILE

# 環境チェック
#  1. Dockerがインストールされているか？
if ! command -v docker &> /dev/null
then
    whiptail --title "MediaHarbor Installer" --yesno "dockerがインストールされていません。\nインストールを行いますか？" --notags 8 50
    if [ $? -eq 0 ]; then
        # OSチェック
        case $DISTRO in
            almalinux|rocky|rhel|ol)
                # AlmaLinux、Rocky Linux、RedHat Enterprise Linux、Oracle Linuxの場合

                # 古いパッケージの削除
                sudo dnf remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine

                # Dockerインストール処理
                sudo dnf install -y yum-utils
                sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
                sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
                ;;

            ubuntu)
                # Ubuntuの場合

                # 競合するパッケージを削除
                for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

                # パッケージ インデックスを更新
                sudo apt-get update -o Dir::Etc::sourcelist=/dev/null
                sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release software-properties-common -y

                # Dockerの公式GPGキーを追加
                sudo install -m 0755 -d /etc/apt/keyrings
                curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --yes --dearmor -o /etc/apt/keyrings/docker.gpg
                sudo chmod a+r /etc/apt/keyrings/docker.gpg

                # Dockerのリポジトリをセットアップ
                echo \
                "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
                "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
                sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
                
                # パッケージ インデックスを更新
                sudo apt-get update

                # Dockerをインストール
                sudo apt-get install docker-ce docker-ce-cli containerd.io  docker-buildx-plugin docker-compose-plugin -y
                ;;

            amzn)
                # Amazon Linux 2の場合
                if [[ $DISTRO_VERSION == 2 ]]; then
                    sudo amazon-linux-extras install -y docker=stable
                    if command -v systemctl &> /dev/null; then
                        sudo systemctl start docker
                        sudo systemctl enable docker
                    else
                        echo -e "Docker: \e[33mWarning: systemctl not available, manual start may be required\e[m"
                    fi

                # Amazon Linux 2023の場合
                elif [[ $DISTRO_VERSION == 2023 ]]; then
                    sudo dnf install -y docker
                    if command -v systemctl &> /dev/null; then
                        sudo systemctl start docker
                        sudo systemctl enable docker
                    else
                        echo -e "Docker: \e[33mWarning: systemctl not available, manual start may be required\e[m"
                    fi
                fi
                ;;

            *)
                # その他のOSの場合
                echo -e "\e[31mError:対応していないOSです。\e[m"
                echo -e "\e[31mAlmaLinux、Rocky Linux、Ubuntu、Amazon Linux、RedHat Enterprise Linuxのみ対応しています。\e[m"
                exit 1
                ;;
        esac

        if command -v systemctl &> /dev/null; then
            sudo systemctl enable docker
            sudo systemctl start docker
        else
            echo -e "Docker: \e[33mWarning: systemctl not available, manual start may be required\e[m"
        fi
        sudo usermod -aG docker $USER
        echo -e "Docker installation:\e[32mSuccess!\e[m"
    else
        # エラー表示して終了
        echo -e "\e[31mError:Dockerがインストールされていない為インストールに失敗しました。\e[m"
        echo -e "\e[31mDockerのインストール後に再度お試しください。\e[m"
        exit 1
    fi
else
    echo -e "Docker:\e[32mOK!\e[m"
fi

#  2. Docker Compose がインストールされているか？
if detect_docker_compose; then
  echo -e "Docker Compose:\e[32mOK!\e[m"
else
  whiptail --title "MediaHarbor Installer" --yesno "Docker Compose がインストールされていません。\nインストールを行いますか？\n\n※ Docker v29 以降は 'docker compose'(plugin) の利用を推奨します。" --notags 11 60
  if [ $? -eq 0 ]; then
    if install_docker_compose; then
      echo -e "Docker Compose:\e[32mOK!\e[m"
    else
      echo -e "\e[31mError:Docker Compose のインストールに失敗しました。\e[m"
      echo -e "\e[31m'docker compose' または 'docker-compose' をインストール後に再度お試しください。\e[m"
      exit 1
    fi
  else
    echo -e "\e[31mError:Docker Compose が必要です。処理を中止します。\e[m"
    exit 1
  fi
fi

#  3. Docker APIバージョン互換性チェック
detect_docker_api_compat
if [ -n "$DOCKER_API_VERSION_COMPAT" ]; then
  echo -e "Docker API Version:\e[33m$DOCKER_API_VERSION_COMPAT (compatibility mode)\e[m"
else
  echo -e "Docker API Version:\e[32mdefault\e[m"
fi

# 4. GPUチェック
if command -v nvidia-smi &> /dev/null
then
  echo "NVIDIAのGPUドライバが見つかりました。"
  # NVIDIAのGPUが存在する場合
  whiptail --title "MediaHarbor Installer" --yesno "NVIDIAのGPUを利用しますか？" --notags 8 50
  if [ $? -eq 0 ]; then
    GPU="NVIDIA"
    if ! command -v nvidia-ctk &> /dev/null
    then
        whiptail --title "MediaHarbor Installer" --msgbox "NVIDIAコンテナツールキットがインストールされていません。\n公式サイトの手順に従ってインストールを行ってください。\nhttps://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html" --notags 8 50
        echo -e "NVIDIA Container Toolkit:\e[31mNG!\e[m"
        exit 1
    else
        echo -e "NVIDIA Container Toolkit:\e[32mOK!\e[m"
        nvidia-ctk --version
        nvidia-ctk runtime configure --runtime=docker
        systemctl restart docker
    fi
  else
    GPU="None"
  fi

# elif command -v rocminfo &> /dev/null
# then
#   echo "AMDのGPUドライバが見つかりました。"
#   # AMDのGPUが存在する場合
#   whiptail --title "MediaHarbor Installer" --yesno "AMDのGPUを利用しますか？" --notags 8 50
#   if [ $? -eq 0 ]; then
#     GPU="AMD"
#   else
#     GPU="None"
#   fi
else
  echo "GPUドライバが見つからない為CPUモードでインストールします。"
  # GPUが存在しない場合のコードをここに書く
  GPU="None"  
fi
echo -e "GPU:\e[32m$GPU\e[m"

# 4. HTTPS Proxyの設定がされているかチェック
if [ -n "$https_proxy" ]; then
    echo -e "HTTPS Proxy:\e[32m有効\e[m"
    whiptail --title "MediaHarbor Installer" --yesno "お使いの環境はHTTPS Proxy接続が有効になっています。\nHTTPS Proxy設定を有効にしますか？\n\n* 外部 のライセンス認証サーバーへの接続に\n  Proxy接続が必要な場合は有効にしてください。" --notags 11 55
    if [ $? -eq 0 ]; then
        PROXY_ENABLE=true
        PROXY_URL=$https_proxy
        echo -e "Proxy URL:\e[32m$PROXY_URL\e[m"
    else
        PROXY_ENABLE=false
        echo -e "Proxy URL:\e[31m利用しない\e[m"
    fi
else
    PROXY_ENABLE=false
    echo -e "HTTPS Proxy:\e[31m無効\e[m"
fi

# 5. CPUリアルタイムスケジューリングの設定
#   - Dockerのcgroup配下
#   - cgroup v1のCPU配下
#   - ディストリによっては cpu,cpuacct 直下
if [ -e /sys/fs/cgroup/cpu,cpuacct/docker/cpu.rt_runtime_us ] || \
   [ -e /sys/fs/cgroup/cpu/cpu.rt_runtime_us ] || \
   [ -e /sys/fs/cgroup/cpu,cpuacct/cpu.rt_runtime_us ]; then
  # CPUリアルタイムスケジューリングが使える場合
  CPU_REALTIME_ENABLE=true
  echo -e "CPUリアルタイムスケジューリング:\e[32m利用可能\e[m"
else
  CPU_REALTIME_ENABLE=false
  echo -e "CPUリアルタイムスケジューリング:非対応OS"
fi


# grafanaフォルダが無かったら、アーカイブから展開（アーカイブが無ければエラー）
if [ ! -d "grafana" ]; then
    GRAFANA_ARCHIVE="$SCRIPT_PATH/grafana.tar.gz"
    if [ -f "$GRAFANA_ARCHIVE" ]; then
        sudo tar -zxvf "$GRAFANA_ARCHIVE"
        if [ $? -ne 0 ]; then
            echo -e "grafana.tar.gz:\e[31mExtract Error!\e[m"
            exit 1
        fi
    else
        echo -e "\e[31mError: grafana.tar.gz が見つかりません。処理を中止します。\e[m"
        exit 1
    fi
    sudo chown -R 472:472 grafana
else
    # grafanaフォルダが既に存在する場合：プラグインのみ上書き展開
    GRAFANA_ARCHIVE="$SCRIPT_PATH/grafana.tar.gz"
    if [ -f "$GRAFANA_ARCHIVE" ]; then
        echo "Grafana Zabbixプラグインを更新しています..."
        # 旧バージョンの残骸ファイル（新MANIFESTに含まれないファイル）が残ると
        # 署名検証に失敗するため、展開前に既存プラグインを完全に削除する
        ZABBIX_PLUGIN_DIR="$SCRIPT_PATH/grafana/plugins/alexanderzobnin-zabbix-app"
        if [ -n "$SCRIPT_PATH" ] && [ -d "$ZABBIX_PLUGIN_DIR" ]; then
            sudo rm -rf "$ZABBIX_PLUGIN_DIR"
        fi
        if sudo tar -zxf "$GRAFANA_ARCHIVE" -C "$SCRIPT_PATH" grafana/plugins/alexanderzobnin-zabbix-app; then
            sudo chown -R 472:472 "$SCRIPT_PATH/grafana/plugins/alexanderzobnin-zabbix-app"
            echo -e "Grafana Zabbixプラグイン:\e[32mUpdated!\e[m"
        else
            echo -e "Grafana Zabbixプラグイン:\e[33mWarning: 更新スキップ\e[m"
        fi
    fi
fi

# パブリックIPv4アドレス取得（失敗時は空文字を返す）
get_public_ipv4() {
    local ip url
    for url in \
        https://checkip.amazonaws.com \
        https://api.ipify.org \
        https://ipv4.icanhazip.com \
        http://ifconfig.me/ip; do
        ip=$(curl -fsSL -4 --connect-timeout 3 --max-time 5 "$url" 2>/dev/null | tr -d '\r' | head -n1)
        if printf '%s' "$ip" | grep -Eq '^(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])){3}$'; then
            echo "$ip"
            return 0
        fi
    done
    return 1
}

PUBLIC_IPV4="$(get_public_ipv4 || true)"
if [ -z "$PUBLIC_IPV4" ]; then
    echo -e "グローバルIP取得に失敗しました。"
fi

SERVER_HOST="$(hostname -I | awk '{print $1}')"

# docker-compose.ymlファイルを作成
touch docker-compose.yml
echo "services:" >> docker-compose.yml
echo "  proxy:" >> docker-compose.yml
echo "    container_name: proxy" >> docker-compose.yml
echo "    image: $REGISTRY_URL/proxy:$IMAGE_TAG" >> docker-compose.yml
echo "    shm_size: 512M" >> docker-compose.yml
echo "    volumes:" >> docker-compose.yml
echo "      - \"/dev/shm/media:/dev/shm/media\"" >> docker-compose.yml
echo "    network_mode: host" >> docker-compose.yml
echo "    privileged: true" >> docker-compose.yml
echo "    restart: always" >> docker-compose.yml
echo "    depends_on:" >> docker-compose.yml
echo "      - db" >> docker-compose.yml
echo "    logging:" >> docker-compose.yml
echo "      driver: \"syslog\"" >> docker-compose.yml
echo "      options:" >> docker-compose.yml
echo "        syslog-facility: \"daemon\"" >> docker-compose.yml
echo "        syslog-format: \"rfc5424\"" >> docker-compose.yml
echo "        tag: \"mhb.proxy\"" >> docker-compose.yml
if [ "$DISTRO" = "ubuntu" ]; then
echo "        syslog-address: \"udp://localhost:514\"" >> docker-compose.yml
fi
if [ $PROXY_ENABLE = true ]; then
echo "    environment:" >> docker-compose.yml
echo "      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,api,mhb,db" >> docker-compose.yml
fi
echo "  stream:" >> docker-compose.yml
echo "    container_name: stream" >> docker-compose.yml
echo "    image: $REGISTRY_URL/stream:$IMAGE_TAG" >> docker-compose.yml
echo "    network_mode: host" >> docker-compose.yml
echo "    privileged: true" >> docker-compose.yml
echo "    ulimits:" >> docker-compose.yml
echo "      nofile:" >> docker-compose.yml
echo "        soft: 65535" >> docker-compose.yml
echo "        hard: 65535" >> docker-compose.yml
if [ -n "$PUBLIC_IPV4" ]; then
echo "    command: \"-r 49152-65535 -1 $PUBLIC_IPV4 -2\"" >> docker-compose.yml
else
echo "    command: \"-r 49152-65535 -2\"" >> docker-compose.yml
fi
echo "    restart: always" >> docker-compose.yml
echo "    depends_on:" >> docker-compose.yml
echo "      - proxy" >> docker-compose.yml
echo "      - api" >> docker-compose.yml
echo "    logging:" >> docker-compose.yml
echo "      driver: \"syslog\"" >> docker-compose.yml
echo "      options:" >> docker-compose.yml
echo "        syslog-facility: \"daemon\"" >> docker-compose.yml
echo "        syslog-format: \"rfc5424\"" >> docker-compose.yml
echo "        tag: \"mhb.stream\"" >> docker-compose.yml
if [ "$DISTRO" = "ubuntu" ]; then
echo "        syslog-address: \"udp://localhost:514\"" >> docker-compose.yml
fi
if [ $PROXY_ENABLE = true ]; then
echo "    environment:" >> docker-compose.yml
echo "      - HTTPS_PROXY=$PROXY_URL" >> docker-compose.yml
echo "      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,api,mhb,db" >> docker-compose.yml
fi
echo "  mhb:" >> docker-compose.yml
echo "    container_name: mhb" >> docker-compose.yml
echo "    image: $REGISTRY_URL/mhb:$IMAGE_TAG" >> docker-compose.yml
echo "    init: true" >> docker-compose.yml
echo "    shm_size: 1024M" >> docker-compose.yml
echo "    cap_add: [sys_nice]" >> docker-compose.yml
echo "    ipc: host" >> docker-compose.yml
if [ $CPU_REALTIME_ENABLE = true ]; then
echo "    cpu_rt_runtime: 800000" >> docker-compose.yml
fi
if [ $PROXY_ENABLE = true ]; then
echo "    environment:" >> docker-compose.yml
echo "      - HTTPS_PROXY=$PROXY_URL" >> docker-compose.yml
echo "      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,api,mhb,db" >> docker-compose.yml
fi
echo "    volumes:" >> docker-compose.yml
echo "      - \"/usr/local/share/video:/usr/local/share/video\"" >> docker-compose.yml
echo "      - \"/dev/shm/media:/dev/shm/media\"" >> docker-compose.yml
echo "      - \"/dev/shm/view:/dev/shm/view\"" >> docker-compose.yml
echo "      - \"./conf/mhb:/mnt/conf\"" >> docker-compose.yml
echo "    network_mode: host" >> docker-compose.yml
echo "    privileged: true" >> docker-compose.yml
echo "    restart: always" >> docker-compose.yml
echo "    depends_on:" >> docker-compose.yml
echo "      - proxy" >> docker-compose.yml
echo "      - api" >> docker-compose.yml
if [ $GPU = "NVIDIA" ]; then
echo "    deploy:" >> docker-compose.yml
echo "      resources:" >> docker-compose.yml
echo "        reservations:" >> docker-compose.yml
echo "          devices:" >> docker-compose.yml
echo "            - driver: nvidia" >> docker-compose.yml
echo "              count: all" >> docker-compose.yml
echo "              capabilities: [gpu, video]" >> docker-compose.yml
fi
echo "    logging:" >> docker-compose.yml
echo "      driver: \"syslog\"" >> docker-compose.yml
echo "      options:" >> docker-compose.yml
echo "        syslog-facility: \"daemon\"" >> docker-compose.yml
echo "        syslog-format: \"rfc5424\"" >> docker-compose.yml
echo "        tag: \"mhb.mhb\"" >> docker-compose.yml
if [ "$DISTRO" = "ubuntu" ]; then
echo "        syslog-address: \"udp://localhost:514\"" >> docker-compose.yml
fi
echo "  ui:" >> docker-compose.yml
echo "    container_name: ui" >> docker-compose.yml
echo "    image: $REGISTRY_URL/ui:$IMAGE_TAG" >> docker-compose.yml
echo "    working_dir: /app" >> docker-compose.yml
echo "    ports:" >> docker-compose.yml
echo "      - 3000:3000" >> docker-compose.yml
echo "    tty: true" >> docker-compose.yml
echo "    restart: always" >> docker-compose.yml
echo "    stdin_open: true" >> docker-compose.yml
echo "    volumes:" >> docker-compose.yml
echo "      - \"./conf/ui/config.json:/app/config.json\"" >> docker-compose.yml
echo "    extra_hosts:" >> docker-compose.yml
echo "      - \"host.docker.internal:host-gateway\"" >> docker-compose.yml
echo "    depends_on:" >> docker-compose.yml
echo "      - proxy" >> docker-compose.yml
echo "      - api" >> docker-compose.yml
if [ $PROXY_ENABLE = true ]; then
echo "    environment:" >> docker-compose.yml
echo "      - HTTPS_PROXY=$PROXY_URL" >> docker-compose.yml
echo "      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,api,mhb,db" >> docker-compose.yml
fi
echo "    logging:" >> docker-compose.yml
echo "      driver: \"syslog\"" >> docker-compose.yml
echo "      options:" >> docker-compose.yml
echo "        syslog-facility: \"daemon\"" >> docker-compose.yml
echo "        syslog-format: \"rfc5424\"" >> docker-compose.yml
echo "        tag: \"mhb.ui\"" >> docker-compose.yml
if [ "$DISTRO" = "ubuntu" ]; then
echo "        syslog-address: \"udp://localhost:514\"" >> docker-compose.yml
fi
echo "  api:" >> docker-compose.yml
echo "    container_name: api" >> docker-compose.yml
echo "    image: $REGISTRY_URL/api:$IMAGE_TAG" >> docker-compose.yml
echo "    working_dir: /usr/src/app" >> docker-compose.yml
echo "    tty: true" >> docker-compose.yml
echo "    restart: always" >> docker-compose.yml
echo "    stdin_open: true" >> docker-compose.yml
echo "    volumes:" >> docker-compose.yml
echo "      - \"./conf/api/.env:/usr/src/app/.env\"" >> docker-compose.yml
echo "      - \"/var/run/docker.sock:/var/run/docker.sock\"" >> docker-compose.yml
echo "      - \"./conf/api/.ndi:/root/.ndi\"" >> docker-compose.yml
echo "      - \"/var/log/mhb:/var/log/mhb:ro\"" >> docker-compose.yml
echo "    environment:" >> docker-compose.yml
echo "      - NODE_ENV=production" >> docker-compose.yml
echo "      - HOST_PWD=`pwd`" >> docker-compose.yml
if [ $PROXY_ENABLE = true ]; then
echo "      - HTTPS_PROXY=$PROXY_URL" >> docker-compose.yml
echo "      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,api,mhb,db" >> docker-compose.yml
fi
if [ -n "$DOCKER_API_VERSION_COMPAT" ]; then
echo "      - DOCKER_API_VERSION=$DOCKER_API_VERSION_COMPAT" >> docker-compose.yml
fi
echo "    network_mode: host" >> docker-compose.yml
echo "    extra_hosts:" >> docker-compose.yml
echo "      - \"host.docker.internal:host-gateway\"" >> docker-compose.yml
echo "    depends_on:" >> docker-compose.yml
echo "      - db" >> docker-compose.yml
echo "      - memcached" >> docker-compose.yml
echo "    logging:" >> docker-compose.yml
echo "      driver: \"syslog\"" >> docker-compose.yml
echo "      options:" >> docker-compose.yml
echo "        syslog-facility: \"daemon\"" >> docker-compose.yml
echo "        syslog-format: \"rfc5424\"" >> docker-compose.yml
echo "        tag: \"mhb.api\"" >> docker-compose.yml
if [ "$DISTRO" = "ubuntu" ]; then
echo "        syslog-address: \"udp://localhost:514\"" >> docker-compose.yml
fi
echo "  db:" >> docker-compose.yml
echo "    container_name: db" >> docker-compose.yml
echo "    image: mariadb:11" >> docker-compose.yml
echo "    restart: always" >> docker-compose.yml
echo "    environment:" >> docker-compose.yml
echo "      - MARIADB_ROOT_PASSWORD_HASH=*7932903C4D7035C6CB4F5FE4CD267A9F1D7F39C9" >> docker-compose.yml
echo "      - MARIADB_DATABASE=mediaharbor" >> docker-compose.yml
echo "      - MARIADB_USER=mediaharbor" >> docker-compose.yml
echo "      - MARIADB_PASSWORD_HASH=*98862F42AC6125B3B646E116DD3DB4FB5252A6AA" >> docker-compose.yml
echo "      - MARIADB_AUTO_UPGRADE=1" >> docker-compose.yml
echo "      - TZ="Asia/Tokyo"" >> docker-compose.yml
if [ $PROXY_ENABLE = true ]; then
echo "      - HTTPS_PROXY=$PROXY_URL" >> docker-compose.yml
echo "      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,api,mhb,db" >> docker-compose.yml
fi
echo "    volumes:" >> docker-compose.yml
echo "      - ./DB/data:/var/lib/mysql" >> docker-compose.yml
echo "      - ./conf/DB/my.cnf:/etc/mysql/conf.d/my.cnf" >> docker-compose.yml
echo "    ports:" >> docker-compose.yml
echo "      - 3306:3306" >> docker-compose.yml
echo "    logging:" >> docker-compose.yml
echo "      driver: \"syslog\"" >> docker-compose.yml
echo "      options:" >> docker-compose.yml
echo "        syslog-facility: \"daemon\"" >> docker-compose.yml
echo "        syslog-format: \"rfc5424\"" >> docker-compose.yml
echo "        tag: \"mhb.db\"" >> docker-compose.yml
if [ "$DISTRO" = "ubuntu" ]; then
echo "        syslog-address: \"udp://localhost:514\"" >> docker-compose.yml
fi
echo "  grafana:" >> docker-compose.yml
echo "    container_name: grafana" >> docker-compose.yml
echo "    image: grafana/grafana:latest" >> docker-compose.yml
echo "    user: 0:0" >> docker-compose.yml
echo "    volumes:" >> docker-compose.yml
echo "      - ./grafana:/var/lib/grafana" >> docker-compose.yml
echo "    ports:" >> docker-compose.yml
echo "      - 3001:3000" >> docker-compose.yml
echo "    environment:" >> docker-compose.yml
echo "      - GF_SERVER_ROOT_URL=http://$SERVER_HOST/grafana" >> docker-compose.yml
echo "      - GF_AUTH_ANONYMOUS_ENABLED=true" >> docker-compose.yml
echo "      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin" >> docker-compose.yml
echo "      - GF_SECURITY_ALLOW_EMBEDDING=true" >> docker-compose.yml
if [ $PROXY_ENABLE = true ]; then
echo "      - HTTPS_PROXY=$PROXY_URL" >> docker-compose.yml
echo "      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,api,mhb,db" >> docker-compose.yml
fi
echo "    restart: always" >> docker-compose.yml
echo "  zabbix-server:" >> docker-compose.yml
echo "    container_name: zabbix-server" >> docker-compose.yml
echo "    image: zabbix/zabbix-server-mysql:alpine-6.4-latest" >> docker-compose.yml
echo "    restart: always" >> docker-compose.yml
echo "    ports:" >> docker-compose.yml
echo "      - 10051:10051" >> docker-compose.yml
echo "    volumes:" >> docker-compose.yml
echo "      - /etc/localtime:/etc/localtime:ro" >> docker-compose.yml
echo "      - /etc/timezone:/etc/timezone:ro  " >> docker-compose.yml
echo "      - ./zbx_env/usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts:ro" >> docker-compose.yml
echo "      - ./zbx_env/usr/lib/zabbix/externalscripts:/usr/lib/zabbix/externalscripts:ro" >> docker-compose.yml
echo "      - ./zbx_env/var/lib/zabbix/dbscripts:/var/lib/zabbix/dbscripts:ro" >> docker-compose.yml
echo "      - ./zbx_env/var/lib/zabbix/export:/var/lib/zabbix/export:rw" >> docker-compose.yml
echo "      - ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro" >> docker-compose.yml
echo "      - ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro" >> docker-compose.yml
echo "      - ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro" >> docker-compose.yml
echo "      - ./zbx_env/var/lib/zabbix/mibs:/var/lib/zabbix/mibs:ro" >> docker-compose.yml
echo "      - snmptraps:/var/lib/zabbix/snmptraps:rw" >> docker-compose.yml
echo "    ulimits:" >> docker-compose.yml
echo "      nproc: 65535" >> docker-compose.yml
echo "      nofile:" >> docker-compose.yml
echo "        soft: 20000" >> docker-compose.yml
echo "        hard: 40000" >> docker-compose.yml
echo "    deploy:" >> docker-compose.yml
echo "      resources:" >> docker-compose.yml
echo "        limits:" >> docker-compose.yml
echo "            cpus: '0.70'" >> docker-compose.yml
echo "            memory: 1G" >> docker-compose.yml
echo "        reservations:" >> docker-compose.yml
echo "            cpus: '0.5'" >> docker-compose.yml
echo "            memory: 512M" >> docker-compose.yml
echo "    env_file:" >> docker-compose.yml
echo "      - ./conf/zabbix/env_vars/.env_db_mysql" >> docker-compose.yml
echo "      - ./conf/zabbix/env_vars/.env_srv" >> docker-compose.yml
echo "    secrets:" >> docker-compose.yml
echo "      - MARIADB_ZABBIX_USER" >> docker-compose.yml
echo "      - MARIADB_ZABBIX_PASSWORD" >> docker-compose.yml
echo "      - MARIADB_ROOT_USER" >> docker-compose.yml
echo "      - MARIADB_ROOT_PASSWORD" >> docker-compose.yml
echo "    environment:" >> docker-compose.yml
echo "      - name=zabbix" >> docker-compose.yml
if [ $PROXY_ENABLE = true ]; then
echo "      - HTTPS_PROXY=$PROXY_URL" >> docker-compose.yml
echo "      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,api,mhb,db" >> docker-compose.yml
fi
echo "    depends_on:" >> docker-compose.yml
echo "      - db" >> docker-compose.yml
echo "    stop_grace_period: 30s" >> docker-compose.yml
echo "    sysctls:" >> docker-compose.yml
echo "      - net.ipv4.ip_local_port_range=1024  64999" >> docker-compose.yml
echo "      - net.ipv4.conf.all.accept_redirects=0" >> docker-compose.yml
echo "      - net.ipv4.conf.all.secure_redirects=0" >> docker-compose.yml
echo "      - net.ipv4.conf.all.send_redirects=0" >> docker-compose.yml
echo "    labels:" >> docker-compose.yml
echo "      com.zabbix.description: "Zabbix  server  with  mysql  database  support"" >> docker-compose.yml
echo "      com.zabbix.company: "Zabbix  LLC"" >> docker-compose.yml
echo "      com.zabbix.component: "zabbix-server"" >> docker-compose.yml
echo "      com.zabbix.dbtype: "mysql"" >> docker-compose.yml
echo "      com.zabbix.os: "centos"" >> docker-compose.yml
echo "  zabbix-web-nginx-mysql:" >> docker-compose.yml
echo "    image: zabbix/zabbix-web-nginx-mysql:alpine-6.4-latest" >> docker-compose.yml
echo "    restart: always" >> docker-compose.yml
echo "    ports:" >> docker-compose.yml
echo "      - "8081:8080"" >> docker-compose.yml
echo "      - "443:8443"" >> docker-compose.yml
echo "    volumes:" >> docker-compose.yml
echo "      - /etc/localtime:/etc/localtime:ro" >> docker-compose.yml
echo "      - /etc/timezone:/etc/timezone:ro" >> docker-compose.yml
echo "      - ./zbx_env/etc/ssl/nginx:/etc/ssl/nginx:ro" >> docker-compose.yml
echo "      - ./zbx_env/usr/share/zabbix/modules/:/usr/share/zabbix/modules/:ro" >> docker-compose.yml
echo "    deploy:" >> docker-compose.yml
echo "      resources:" >> docker-compose.yml
echo "        limits:" >> docker-compose.yml
echo "            cpus: '0.70'" >> docker-compose.yml
echo "            memory: 512M" >> docker-compose.yml
echo "        reservations:" >> docker-compose.yml
echo "            cpus: '0.5'" >> docker-compose.yml
echo "            memory: 256M" >> docker-compose.yml
echo "    env_file:" >> docker-compose.yml
echo "      - ./conf/zabbix/env_vars/.env_db_mysql" >> docker-compose.yml
echo "      - ./conf/zabbix/env_vars/.env_web" >> docker-compose.yml
echo "    secrets:" >> docker-compose.yml
echo "      - MARIADB_ZABBIX_USER" >> docker-compose.yml
echo "      - MARIADB_ZABBIX_PASSWORD" >> docker-compose.yml
echo "    depends_on:" >> docker-compose.yml
echo "      - db" >> docker-compose.yml
echo "      - zabbix-server" >> docker-compose.yml
echo "    healthcheck:" >> docker-compose.yml
echo "      test: [\"CMD\",  \"curl\",  \"-f\",  \"http://localhost:8081/ping\"]" >> docker-compose.yml
echo "      interval: 10s" >> docker-compose.yml
echo "      timeout: 5s" >> docker-compose.yml
echo "      retries: 3" >> docker-compose.yml
echo "      start_period: 30s" >> docker-compose.yml
echo "    stop_grace_period: 10s" >> docker-compose.yml
echo "    sysctls:" >> docker-compose.yml
echo "      - net.core.somaxconn=65535" >> docker-compose.yml
echo "    labels:" >> docker-compose.yml
echo "      com.zabbix.description: "Zabbix  frontend  on  Nginx  web-server  with  MySQL  database  support"" >> docker-compose.yml
echo "      com.zabbix.company: "Zabbix  LLC"" >> docker-compose.yml
echo "      com.zabbix.component: "zabbix-frontend"" >> docker-compose.yml
echo "      com.zabbix.webserver: "nginx"" >> docker-compose.yml
echo "      com.zabbix.dbtype: "mysql"" >> docker-compose.yml
echo "      com.zabbix.os: "centos"" >> docker-compose.yml
if [ $PROXY_ENABLE = true ]; then
echo "    environment:" >> docker-compose.yml
echo "      - HTTPS_PROXY=$PROXY_URL" >> docker-compose.yml
echo "      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,api,mhb,db" >> docker-compose.yml
fi
echo "  zabbix-agent:" >> docker-compose.yml
echo "    image: zabbix/zabbix-agent:alpine-6.4-latest" >> docker-compose.yml
echo "    restart: always" >> docker-compose.yml
echo "    container_name: zabbix-agent" >> docker-compose.yml
echo "    ports:" >> docker-compose.yml
echo "      - "10050:10050"" >> docker-compose.yml
echo "    volumes:" >> docker-compose.yml
echo "      - /etc/localtime:/etc/localtime:ro" >> docker-compose.yml
echo "      - /etc/timezone:/etc/timezone:ro" >> docker-compose.yml
echo "      - ./zbx_env/etc/zabbix/zabbix_agentd.d:/etc/zabbix/zabbix_agentd.d:ro" >> docker-compose.yml
echo "      - ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro" >> docker-compose.yml
echo "      - ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro" >> docker-compose.yml
echo "      - ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro" >> docker-compose.yml
echo "      - /var/log/mhb:/var/log/mhb:ro,z" >> docker-compose.yml
echo "    deploy:" >> docker-compose.yml
echo "      resources:" >> docker-compose.yml
echo "        limits:" >> docker-compose.yml
echo "            cpus: '0.2'" >> docker-compose.yml
echo "            memory: 128M" >> docker-compose.yml
echo "        reservations:" >> docker-compose.yml
echo "            cpus: '0.1'" >> docker-compose.yml
echo "            memory: 64M" >> docker-compose.yml
echo "      mode: global" >> docker-compose.yml
echo "    env_file:" >> docker-compose.yml
echo "      - ./conf/zabbix/env_vars/.env_agent" >> docker-compose.yml
echo "    privileged: true" >> docker-compose.yml
echo "    pid: "host"" >> docker-compose.yml
echo "    stop_grace_period: 5s" >> docker-compose.yml
echo "    labels:" >> docker-compose.yml
echo "      com.zabbix.description: "Zabbix  agent"" >> docker-compose.yml
echo "      com.zabbix.company: "Zabbix  LLC"" >> docker-compose.yml
echo "      com.zabbix.component: "zabbix-agentd"" >> docker-compose.yml
echo "      com.zabbix.os: "centos"" >> docker-compose.yml
if [ $PROXY_ENABLE = true ]; then
echo "    environment:" >> docker-compose.yml
echo "      - HTTPS_PROXY=$PROXY_URL" >> docker-compose.yml
echo "      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,api,mhb,db" >> docker-compose.yml
fi
echo "  zabbix-setup:"  >> docker-compose.yml
echo "    container_name: zabbix-setup" >> docker-compose.yml
echo "    image: $REGISTRY_URL/zabbix-setup:$IMAGE_TAG" >> docker-compose.yml
echo "    depends_on:"  >> docker-compose.yml
echo "      - db"  >> docker-compose.yml
echo "      - zabbix-server"  >> docker-compose.yml
echo "    extra_hosts:"  >> docker-compose.yml
echo "      - "host.docker.internal:host-gateway""  >> docker-compose.yml
if [ $PROXY_ENABLE = true ]; then
echo "    environment:" >> docker-compose.yml
echo "      - HTTPS_PROXY=$PROXY_URL" >> docker-compose.yml
echo "      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,api,mhb,db" >> docker-compose.yml
fi
echo "  memcached:"  >> docker-compose.yml
echo "    container_name: memcached" >> docker-compose.yml
echo "    image: memcached:latest"  >> docker-compose.yml
echo "    restart: always"  >> docker-compose.yml
echo "    ports:"  >> docker-compose.yml
echo "      - 11211:11211"  >> docker-compose.yml
echo "    logging:" >> docker-compose.yml
echo "      driver: \"syslog\"" >> docker-compose.yml
echo "      options:" >> docker-compose.yml
echo "        syslog-facility: \"daemon\"" >> docker-compose.yml
echo "        syslog-format: \"rfc5424\"" >> docker-compose.yml
echo "        tag: \"mhb.memcached\"" >> docker-compose.yml
if [ "$DISTRO" = "ubuntu" ]; then
echo "        syslog-address: \"udp://localhost:514\"" >> docker-compose.yml
fi
if [ $PROXY_ENABLE = true ]; then
echo "    environment:" >> docker-compose.yml
echo "      - HTTPS_PROXY=$PROXY_URL" >> docker-compose.yml
echo "      - NO_PROXY=localhost,127.0.0.1,::1,host.docker.internal,api,mhb,db" >> docker-compose.yml
fi
echo "volumes:" >> docker-compose.yml
echo "    snmptraps:" >> docker-compose.yml
echo "secrets:" >> docker-compose.yml
echo "    MARIADB_ZABBIX_USER:" >> docker-compose.yml
echo "        file: ./conf/zabbix/env_vars/.MARIADB_ZABBIX_USER" >> docker-compose.yml
echo "    MARIADB_ZABBIX_PASSWORD:" >> docker-compose.yml
echo "        file: ./conf/zabbix/env_vars/.MARIADB_ZABBIX_PASSWORD" >> docker-compose.yml
echo "    MARIADB_ROOT_USER:" >> docker-compose.yml
echo "        file: ./conf/zabbix/env_vars/.MARIADB_ROOT_USER" >> docker-compose.yml
echo "    MARIADB_ROOT_PASSWORD:" >> docker-compose.yml
echo "        file: ./conf/zabbix/env_vars/.MARIADB_ROOT_PASSWORD" >> docker-compose.yml
if [ $? -ne 0 ]
then
    echo -e "docker-compose.yml:\e[31mFailed to create!\e[m"
    exit 1
else
    echo -e "docker-compose.yml:\e[32mCreated!\e[m"
fi

# コンテナが動いてるかも知れないので停止
sudo "${DOCKER_COMPOSE_CMD[@]}" down --remove-orphans
sudo docker ps -aq --filter ancestor=public.ecr.aws/mediaharbor/receiver:latest | xargs -r sudo docker stop

# 設定ファイルの作成
mkdir -p $SCRIPT_PATH/conf/mhb
touch $SCRIPT_PATH/conf/mhb/secret.yaml
echo "# Please fill this with appropiate credentials" > $SCRIPT_PATH/conf/mhb/secret.yaml
echo "# DO NOT COMMIT ID AND SECRET." >> $SCRIPT_PATH/conf/mhb/secret.yaml
echo "deehive_api:" >> $SCRIPT_PATH/conf/mhb/secret.yaml
echo "  auth_endpoint: \"https://deehive.tsim.jp/api/v1/authentication\"" >> $SCRIPT_PATH/conf/mhb/secret.yaml
echo "  device_params_endpoint: \"https://deehive.tsim.jp/api/v1/device-params\"" >> $SCRIPT_PATH/conf/mhb/secret.yaml
echo "  id: \"000000000000000000000000\"" >> $SCRIPT_PATH/conf/mhb/secret.yaml
echo "  secret: \"0000000000000000000000000000000000000000000000000000000000000000\"" >> $SCRIPT_PATH/conf/mhb/secret.yaml
echo "license_manager:" >> $SCRIPT_PATH/conf/mhb/secret.yaml
echo "  api_key: $APIKEY" >> $SCRIPT_PATH/conf/mhb/secret.yaml
echo "  url: https://license.trafficsim.co.jp" >> $SCRIPT_PATH/conf/mhb/secret.yaml
if [ $? -ne 0 ]
then
    echo -e "conf/mhb/secret.yaml:\e[31mFailed to create!\e[m"
    exit 1
else
    echo -e "conf/mhb/secret.yaml:\e[32mCreated!\e[m"
fi

if [ ! -f $SCRIPT_PATH/conf/mhb/mhb.yaml ]; then
    touch $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "# MediaHarbor config" > $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "global:" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  http_iface: 127.0.0.1" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  http_port: 10080" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  mhbs_server_address: 'http://127.0.0.1:10180'" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  mhb_api_address: 'http://127.0.0.1:8080'" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  media_dir: \"/usr/local/share/video\"" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  media_json: \"./conf/input.json\"" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  layout_json: \"./conf/layout.json\"" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  screen_json: \"./conf/screen.json\"" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "render:" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  width: 1920" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  height: 1080" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "srt:" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  enable: true" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  video:" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "    encoder:" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "      name: \"openh264\"" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "      options: []" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "    width: 1920" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "    height: 1080" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "    bitrate: 5000000" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "webrtc:" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  enable: true" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  video:" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "    encoder:" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "      name: \"openh264\"" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "      options: []" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "    encoder_options: []" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "    width: 1920" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "    height: 1080" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "    bitrate: 3000000" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "displayout:" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    echo "  enable: false" >> $SCRIPT_PATH/conf/mhb/mhb.yaml
    if [ $? -ne 0 ]
    then
        echo -e "conf/mhb/mhb.yaml:\e[31mFailed!\e[m"
        exit 1
    else
        echo -e "conf/mhb/mhb.yaml:\e[32mCreated!\e[m"
    fi
else
    echo -e "conf/mhb/mhb.yaml:\e[33mAlready exists, skipped!\e[m"
fi

touch $SCRIPT_PATH/conf/mhb/default_input.json
echo "[]" > $SCRIPT_PATH/conf/mhb/default_input.json
if [ $? -ne 0 ]
then
    echo -e "conf/mhb/default_input.json:\e[31mFailed!\e[m"
    exit 1
else
    echo -e "conf/mhb/default_input.json:\e[32mCreated!\e[m"
fi

touch $SCRIPT_PATH/conf/mhb/default_layout.json
echo "[{" > $SCRIPT_PATH/conf/mhb/default_layout.json
echo "  \"id\": \"a96b712c-b548-49bd-81ac-ff55994a6cf3\"," >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "  \"name\": \"welcome\"," >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "  \"elements\": [" >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "    {" >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "      \"id\": \"095b0a93-6050-4976-a221-e1843d3d0e31\"," >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "      \"layout_id\": \"a96b712c-b548-49bd-81ac-ff55994a6cf3\"," >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "      \"source_id\": \"fd97e748-15bb-4f90-b2a8-66daa46542eb\"," >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "      \"skin_id\": null," >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "      \"left\": 0," >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "      \"top\": 0," >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "      \"width\": 1920," >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "      \"height\": 1080," >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "      \"source\": {" >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "        \"name\": \"welcome\"," >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "        \"source_type_id\": 2," >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "        \"protocol_type_id\": 1" >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "      }" >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "    }" >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "  ]" >> $SCRIPT_PATH/conf/mhb/default_layout.json
echo "}]" >> $SCRIPT_PATH/conf/mhb/default_layout.json
if [ $? -ne 0 ]
then
    echo -e "conf/mhb/default_layout.json:\e[31mFailed!\e[m"
    exit 1
else
    echo -e "conf/mhb/default_layout.json:\e[32mCreated!\e[m"
fi

# default_screen.jsonを作成
touch $SCRIPT_PATH/conf/mhb/default_screen.json
echo "[{" > $SCRIPT_PATH/conf/mhb/default_screen.json
echo "  \"id\": 1," >> $SCRIPT_PATH/conf/mhb/default_screen.json
echo "  \"name\": \"welcome screen\"," >> $SCRIPT_PATH/conf/mhb/default_screen.json
echo "  \"layout_id\": \"a96b712c-b548-49bd-81ac-ff55994a6cf3\"," >> $SCRIPT_PATH/conf/mhb/default_screen.json
echo "  \"webrtc_bitrate\": 2000000," >> $SCRIPT_PATH/conf/mhb/default_screen.json
echo "  \"custom_bitrate\": 5000000," >> $SCRIPT_PATH/conf/mhb/default_screen.json
echo "  \"display_output_enable\": false," >> $SCRIPT_PATH/conf/mhb/default_screen.json
echo "  \"display_output_connector_id\": 0," >> $SCRIPT_PATH/conf/mhb/default_screen.json
echo "  \"audio_source_id\": \"\"" >> $SCRIPT_PATH/conf/mhb/default_screen.json
echo "}]" >> $SCRIPT_PATH/conf/mhb/default_screen.json
if [ $? -ne 0 ]
then
    echo -e "conf/mhb/default_input.json:\e[31mFailed!\e[m"
    exit 1
else
    echo -e "conf/mhb/default_input.json:\e[32mCreated!\e[m"
fi

touch $SCRIPT_PATH/conf/mhb/resource.json
echo "[" > $SCRIPT_PATH/conf/mhb/resource.json
echo "    {" >> $SCRIPT_PATH/conf/mhb/resource.json
echo "        \"id\": \"fd97e748-15bb-4f90-b2a8-66daa46542eb\"," >> $SCRIPT_PATH/conf/mhb/resource.json
echo "        \"name\": \"welcome\"," >> $SCRIPT_PATH/conf/mhb/resource.json
echo "        \"parameter\": {" >> $SCRIPT_PATH/conf/mhb/resource.json
echo "            \"id\": 1," >> $SCRIPT_PATH/conf/mhb/resource.json
echo "            \"type\": \"picture\"," >> $SCRIPT_PATH/conf/mhb/resource.json
echo "            \"data\": \"data:image/png;base64,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\"" >> $SCRIPT_PATH/conf/mhb/resource.json
echo "        }" >> $SCRIPT_PATH/conf/mhb/resource.json
echo "    }" >> $SCRIPT_PATH/conf/mhb/resource.json
echo "]" >> $SCRIPT_PATH/conf/mhb/resource.json

if [ $? -ne 0 ]
then
    echo -e "conf/mhb/resource.json:\e[31mError!\e[m"
    exit 1
else
    echo -e "conf/mhb/resource.json:\e[32mCreated!\e[m"
fi

mkdir -p $SCRIPT_PATH/conf/DB
touch $SCRIPT_PATH/conf/DB/my.cnf
echo "[mysqld]" > $SCRIPT_PATH/conf/DB/my.cnf
echo "character-set-server=utf8mb4" >> $SCRIPT_PATH/conf/DB/my.cnf
echo "collation-server=utf8mb4_unicode_ci" >> $SCRIPT_PATH/conf/DB/my.cnf
echo "" >> $SCRIPT_PATH/conf/DB/my.cnf
echo "[client]" >> $SCRIPT_PATH/conf/DB/my.cnf
echo "default-character-set=utf8mb4" >> $SCRIPT_PATH/conf/DB/my.cnf
if [ $? -ne 0 ]
then
    echo -e "conf/DB/my.cnf:\e[31mError!\e[m"
    exit 1
else
    echo -e "conf/DB/my.cnf:\e[32mCreated!\e[m"
fi

touch $SCRIPT_PATH/conf/DB/zabbix_users.sql
echo "CREATE DATABASE IF NOT EXISTS zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;" > $SCRIPT_PATH/conf/DB/zabbix_users.sql
echo "CREATE USER IF NOT EXISTS 'zabbix'@'%' IDENTIFIED BY 'gn8tH2xF';" >> $SCRIPT_PATH/conf/DB/zabbix_users.sql
echo "GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%';" >> $SCRIPT_PATH/conf/DB/zabbix_users.sql
echo "SET GLOBAL log_bin_trust_function_creators = 1;" >> $SCRIPT_PATH/conf/DB/zabbix_users.sql
if [ $? -ne 0 ]
then
    echo -e "conf/DB/zabbix_users.sql: \e[31mError!\e[m"
    exit 1
else
    echo -e "conf/DB/zabbix_users.sql: \e[32mCreated!\e[m"
fi

mkdir -p $SCRIPT_PATH/conf/api
touch $SCRIPT_PATH/conf/api/.env
echo "LICENSE_MANAGER_ADDRESS=\"https://license.trafficsim.co.jp\"" > $SCRIPT_PATH/conf/api/.env
echo "LICENSE_MANAGER_API_KEY=$APIKEY" >> $SCRIPT_PATH/conf/api/.env
if [ $? -ne 0 ]
then
    echo -e "conf/api/.env:\e[31mError!\e[m"
    exit 1
else
    echo -e "conf/api/.env:\e[32mCreated!\e[m"
fi

mkdir -p $SCRIPT_PATH/conf/zabbix/env_vars
touch $SCRIPT_PATH/conf/zabbix/env_vars/.env_agent
echo "ZBX_PASSIVE_ALLOW=true" > $SCRIPT_PATH/conf/zabbix/env_vars/.env_agent
echo "ZBX_ACTIVE_ALLOW=true" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_agent
echo "ZBX_SERVER_HOST=zabbix-server" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_agent
echo "ZBX_SERVER_ACTIVE=zabbix-server" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_agent
echo "ZBX_HOSTNAME=MediaHarbor server" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_agent
if [ $? -ne 0 ]
then
    echo -e "conf/zabbix/env_vars/.env_agent: \e[31mError!\e[m"
    exit 1
else
    echo -e "conf/zabbix/env_vars/.env_agent: \e[32mCreated!\e[m"
fi

touch $SCRIPT_PATH/conf/zabbix/env_vars/.env_db_mysql
echo "DB_SERVER_HOST=db" > $SCRIPT_PATH/conf/zabbix/env_vars/.env_db_mysql
echo "MYSQL_USER=zabbix" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_db_mysql
echo "MYSQL_PASSWORD=DnxDfsDW" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_db_mysql
echo "MYSQL_ROOT_PASSWORD=qSm5kuTj" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_db_mysql
echo "MYSQL_DATABASE=zabbix" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_db_mysql
if [ $? -ne 0 ]
then
    echo -e "conf/zabbix/env_vars/.env_db_mysql: \e[31mError!\e[m"
    exit 1
else
    echo -e "conf/zabbix/env_vars/.env_db_mysql: \e[32mCreated!\e[m"
fi

touch $SCRIPT_PATH/conf/zabbix/env_vars/.env_srv
echo "ZBX_ALLOWUNSUPPORTEDDBVERSIONS=1 # Available since 6.0.0" > $SCRIPT_PATH/conf/zabbix/env_vars/.env_srv
echo "ZBX_STARTLLDPROCESSORS=1 # For using MariaDB, set to 1 and uncomment this line" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_srv
echo "ZBX_JAVAGATEWAY_ENABLE=true" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_srv
echo "ZBX_STARTJAVAPOLLERS=5" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_srv
echo "ZBX_ENABLE_SNMP_TRAPS=true" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_srv
if [ $? -ne 0 ]
then
    echo -e "conf/zabbix/env_vars/.env_srv: \e[31mError!\e[m"
    exit 1
else
    echo -e "conf/zabbix/env_vars/.env_srv: \e[32mCreated!\e[m"
fi

touch $SCRIPT_PATH/conf/zabbix/env_vars/.env_web
echo "ZBX_SERVER_HOST=zabbix-server" > $SCRIPT_PATH/conf/zabbix/env_vars/.env_web
echo "ZBX_SERVER_NAME=MediaHarbor Zabbix" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_web
echo "PHP_TZ=Asia/Tokyo" >> $SCRIPT_PATH/conf/zabbix/env_vars/.env_web
if [ $? -ne 0 ]
then
    echo -e "conf/zabbix/env_vars/.env_web: \e[31mError!\e[m"
    exit 1
else
    echo -e "conf/zabbix/env_vars/.env_web: \e[32mCreated!\e[m"
fi

touch $SCRIPT_PATH/conf/zabbix/env_vars/.MARIADB_ROOT_USER
echo "root" > $SCRIPT_PATH/conf/zabbix/env_vars/.MARIADB_ROOT_USER
if [ $? -ne 0 ]
then
    echo -e "conf/zabbix/env_vars/.MARIADB_ROOT_USER: \e[31mError!\e[m"
    exit 1
else
    echo -e "conf/zabbix/env_vars/.MARIADB_ROOT_USER: \e[32mCreated!\e[m"
fi

touch $SCRIPT_PATH/conf/zabbix/env_vars/.MARIADB_ROOT_PASSWORD
echo "qSm5kuTj" > $SCRIPT_PATH/conf/zabbix/env_vars/.MARIADB_ROOT_PASSWORD
if [ $? -ne 0 ]
then
    echo -e "conf/zabbix/env_vars/.MARIADB_ROOT_PASSWORD: \e[31mError!\e[m"
    exit 1
else
    echo -e "conf/zabbix/env_vars/.MARIADB_ROOT_PASSWORD: \e[32mCreated!\e[m"
fi

touch $SCRIPT_PATH/conf/zabbix/env_vars/.MARIADB_ZABBIX_USER
echo "zabbix" > $SCRIPT_PATH/conf/zabbix/env_vars/.MARIADB_ZABBIX_USER
if [ $? -ne 0 ]
then
    echo -e "conf/zabbix/env_vars/.MARIADB_ZABBIX_USER: \e[31mError!\e[m"
    exit 1
else
    echo -e "conf/zabbix/env_vars/.MARIADB_ZABBIX_USER: \e[32mCreated!\e[m"
fi

touch $SCRIPT_PATH/conf/zabbix/env_vars/.MARIADB_ZABBIX_PASSWORD
echo "DnxDfsDW" > $SCRIPT_PATH/conf/zabbix/env_vars/.MARIADB_ZABBIX_PASSWORD
if [ $? -ne 0 ]
then
    echo -e "conf/zabbix/env_vars/.MARIADB_ZABBIX_PASSWORD: \e[31mError!\e[m"
    exit 1
else
    echo -e "conf/zabbix/env_vars/.MARIADB_ZABBIX_PASSWORD: \e[32mCreated!\e[m"
fi

# rsyslogのインストールと設定
echo "rsyslogのインストールと設定中..."

# rsyslogがインストールされているかチェック
if ! command -v rsyslogd &> /dev/null; then
    echo "rsyslogがインストールされていません。インストールを開始します..."
    
    # OS別のrsyslogインストール処理
    case $DISTRO in
        centos|almalinux|rocky|rhel|ol)
            # CentOS系の場合
            if [[ $DISTRO_VERSION == 9* ]]; then
                # RHEL 9系の場合（dnfを使用）
                sudo dnf install -y rsyslog
            else
                # RHEL 8系以前の場合（yumを使用）
                sudo yum install -y rsyslog
            fi
            ;;
        ubuntu)
            # Ubuntuの場合
            sudo apt-get update
            sudo apt-get install -y rsyslog
            ;;
        amzn)
            # Amazon Linuxの場合
            if [[ $DISTRO_VERSION == 2023 ]]; then
                # Amazon Linux 2023の場合（dnfを使用）
                sudo dnf install -y rsyslog
            else
                # Amazon Linux 2の場合（yumを使用）
                sudo yum install -y rsyslog
            fi
            ;;
        *)
            echo -e "rsyslog: \e[31mUnsupported OS for rsyslog installation: $DISTRO\e[m"
            exit 1
            ;;
    esac
    
    if [ $? -ne 0 ]; then
        echo -e "rsyslog: \e[31mInstallation Error!\e[m"
        exit 1
    else
        echo -e "rsyslog: \e[32mInstalled!\e[m"
    fi
else
    echo -e "rsyslog: \e[32mAlready installed!\e[m"
fi

# rsyslog設定
RSYSLOG_CONF="/etc/rsyslog.d/10-docker.conf"
RSYSLOG_MAIN_CONF="/etc/rsyslog.conf"
RSYSLOG_D_DIR="/etc/rsyslog.d"

# rsyslog.confの設定確認
echo "rsyslog.confの設定を確認中..."

# /etc/rsyslog.d/ディレクトリの存在確認
if [ ! -d "$RSYSLOG_D_DIR" ]; then
    echo -e "rsyslog.d: \e[33mWarning: $RSYSLOG_D_DIR ディレクトリが存在しません。作成します...\e[m"
    sudo mkdir -p "$RSYSLOG_D_DIR"
    sudo chmod 755 "$RSYSLOG_D_DIR"
fi

# IncludeConfigの確認（コメント行を除外）
if ! sudo grep -vE '^\s*#' "$RSYSLOG_MAIN_CONF" 2>/dev/null | grep -qE '\$IncludeConfig|include\(|include_file'; then
    echo -e "rsyslog.conf: \e[33mWarning: IncludeConfig設定が見つかりません。設定ファイルが読み込まれない可能性があります。\e[m"
    echo "rsyslog.confに以下の設定を追加してください:"
    echo "  \$IncludeConfig /etc/rsyslog.d/*.conf"
else
    echo -e "rsyslog.conf: \e[32mIncludeConfig設定が確認されました。\e[m"
fi

# 必要なモジュールの確認
REQUIRED_MODULE=""
if [ "$DISTRO" = "ubuntu" ]; then
    # Ubuntuではimuxsockが必要
    REQUIRED_MODULE="imuxsock"
elif [ "$DISTRO" = "amzn" ] && [[ $DISTRO_VERSION == 2023 ]]; then
    # Amazon Linux 2023ではimjournalが必要
    REQUIRED_MODULE="imjournal"
elif [[ $DISTRO_VERSION == 9* ]]; then
    # RHEL 9系ではimjournalが必要
    REQUIRED_MODULE="imjournal"
else
    # その他のOSではimuxsockを確認
    REQUIRED_MODULE="imuxsock"
fi

if [ -n "$REQUIRED_MODULE" ]; then
    # コメント行を除外してモジュール読み込みを確認
    if ! sudo grep -vE '^\s*#' "$RSYSLOG_MAIN_CONF" 2>/dev/null | grep -qE "^\$ModLoad $REQUIRED_MODULE|module\(load=[\"']$REQUIRED_MODULE"; then
        echo -e "rsyslog.conf: \e[33mWarning: $REQUIRED_MODULE モジュールが見つかりません。ログが正しく処理されない可能性があります。\e[m"
        echo "rsyslog.confに以下の設定を追加してください:"
        echo "  \$ModLoad $REQUIRED_MODULE"
        echo "  または"
        echo "  module(load=\"$REQUIRED_MODULE\")"
    else
        echo -e "rsyslog.conf: \e[32m$REQUIRED_MODULE モジュールが確認されました。\e[m"
    fi
fi

# MHBログ用の設定（/var/log/mhb/へのログファイル作成のみ）
tee "$RSYSLOG_CONF" > /dev/null <<'EOF'
# MHBログ用のテンプレート
$template MHBFile,"/var/log/mhb/%$.app%.log"

# アプリケーション名の設定
set $.app = $app-name;

# アプリケーション名が空の場合、メッセージから抽出
if ($.app == "" or not ($.app startswith "mhb.")) then {
  set $.app = re_extract($msg, "^[0-9]+ +[^ ]+ +[^ ]+ +(mhb\\.[^ ]+)", 0, 1, "");
}

# MHBアプリケーションのログを専用ファイルに出力
if ($.app startswith "mhb.") then {
  action(type="omfile" DynaFile="MHBFile" CreateDirs="on" template="RSYSLOG_SyslogProtocol23Format")
  stop
}
EOF

if [ $? -ne 0 ]
then
    echo -e "$RSYSLOG_CONF: \e[31mError!\e[m"
    exit 1
else
    echo -e "$RSYSLOG_CONF: \e[32mCreated!\e[m"
fi

# ログディレクトリの作成と権限設定
echo "ログディレクトリの作成と権限設定中..."
sudo mkdir -p /var/log/mhb
sudo chmod 755 /var/log/mhb

# Ubuntu固有の権限設定
if [ "$DISTRO" = "ubuntu" ]; then
    # Ubuntuではsyslogユーザーに権限を付与
    sudo chown syslog:adm /var/log/mhb
    echo -e "ログディレクトリ: \e[32mUbuntu用権限設定完了!\e[m"
else
    # その他のOSではrootに権限を付与
    sudo chown root:root /var/log/mhb
    echo -e "ログディレクトリ: \e[32m権限設定完了!\e[m"
fi

# systemctlが利用可能かチェック
if command -v systemctl &> /dev/null; then
    # rsyslogを再起動して設定を反映
    systemctl restart rsyslog
    if [ $? -ne 0 ]
    then
        echo -e "rsyslog: \e[31mRestart Error!\e[m"
        exit 1
    else
        echo -e "rsyslog: \e[32mRestarted!\e[m"
    fi
else
    echo -e "rsyslog: \e[33mWarning: systemctl not available, manual restart may be required\e[m"
fi

# logrotateのインストールと設定
echo "logrotateのインストールと設定中..."

# logrotateがインストールされているかチェック
if ! command -v logrotate &> /dev/null; then
    echo "logrotateがインストールされていません。インストールを開始します..."
    
    # OS別のlogrotateインストール処理
    case $DISTRO in
        centos|almalinux|rocky|rhel|ol)
            # CentOS系の場合
            if [[ $DISTRO_VERSION == 9* ]]; then
                # RHEL 9系の場合（dnfを使用）
                sudo dnf install -y logrotate
            else
                # RHEL 8系以前の場合（yumを使用）
                sudo yum install -y logrotate
            fi
            ;;
        ubuntu)
            # Ubuntuの場合
            sudo apt-get update
            sudo apt-get install -y logrotate
            ;;
        amzn)
            # Amazon Linuxの場合
            if [[ $DISTRO_VERSION == 2023 ]]; then
                # Amazon Linux 2023の場合（dnfを使用）
                sudo dnf install -y logrotate
            else
                # Amazon Linux 2の場合（yumを使用）
                sudo yum install -y logrotate
            fi
            ;;
        *)
            echo -e "logrotate: \e[31mUnsupported OS for logrotate installation: $DISTRO\e[m"
            exit 1
            ;;
    esac
    
    if [ $? -ne 0 ]; then
        echo -e "logrotate: \e[31mInstallation Error!\e[m"
        exit 1
    else
        echo -e "logrotate: \e[32mInstalled!\e[m"
    fi
else
    echo -e "logrotate: \e[32mAlready installed!\e[m"
fi

# ログローテート設定ファイル作成
LOGROTATE_CONF_PATH="/etc/logrotate.d/mhb"

touch $LOGROTATE_CONF_PATH
if [ $? -ne 0 ]
then
    echo -e "$LOGROTATE_CONF_PATH: \e[31mCreate Error!\e[m"
    exit 1
else
    echo -e "$LOGROTATE_CONF_PATH: \e[32mCreated!\e[m"
fi

bash -c "cat > $LOGROTATE_CONF_PATH" <<EOF
/var/log/mhb/*.log {
    daily
    size 100M
    rotate 14
    missingok
    notifempty
    compress
    delaycompress
    dateext
    copytruncate
}
EOF

if [ $? -ne 0 ]
then
    echo -e "$LOGROTATE_CONF_PATH: \e[31mWrite Error!\e[m"
    exit 1
else
    echo -e "$LOGROTATE_CONF_PATH: \e[32mWrite Success!\e[m"
fi

# /var/log/mhbにACL設定
echo "ACL設定中..."

# ACLパッケージがインストールされているかチェック
if ! command -v setfacl &> /dev/null; then
    echo "ACLパッケージがインストールされていません。インストールを開始します..."
    
    # OS別のACLパッケージインストール処理
    case $DISTRO in
        centos|almalinux|rocky|rhel|ol)
            # CentOS系の場合
            if [[ $DISTRO_VERSION == 9* ]]; then
                # RHEL 9系の場合（dnfを使用）
                sudo dnf install -y acl
            else
                # RHEL 8系以前の場合（yumを使用）
                sudo yum install -y acl
            fi
            ;;
        ubuntu)
            # Ubuntuの場合
            sudo apt-get update
            sudo apt-get install -y acl
            ;;
        amzn)
            # Amazon Linuxの場合
            if [[ $DISTRO_VERSION == 2023 ]]; then
                # Amazon Linux 2023の場合（dnfを使用）
                sudo dnf install -y acl
            else
                # Amazon Linux 2の場合（yumを使用）
                sudo yum install -y acl
            fi
            ;;
        *)
            echo -e "ACL: \e[31mUnsupported OS for ACL installation: $DISTRO\e[m"
            exit 1
            ;;
    esac
    
    if [ $? -ne 0 ]; then
        echo -e "ACL: \e[31mInstallation Error!\e[m"
        exit 1
    else
        echo -e "ACL: \e[32mInstalled!\e[m"
    fi
else
    echo -e "ACL: \e[32mAlready installed!\e[m"
fi

# ログディレクトリの作成
mkdir -p /var/log/mhb

# ACL設定の実行
if command -v setfacl &> /dev/null; then
    setfacl -m u:1997:rx /var/log
    setfacl -R -m u:1997:rX /var/log/mhb
    setfacl -d -m u:1997:rX /var/log/mhb
    
    if [ $? -ne 0 ]
    then
        echo -e "/var/log/mhb: \e[31mACL Error!\e[m"
        exit 1
    else
        echo -e "/var/log/mhb: \e[32mACL Created!\e[m"
    fi
else
    echo -e "/var/log/mhb: \e[33mWarning: setfacl not available, ACL not set\e[m"
    echo -e "/var/log/mhb: \e[32mDirectory Created!\e[m"
fi

# コンテナイメージ取り込み（オフライン用）
ARCHIVE_PATH="$SCRIPT_PATH/mediaharbor.tar.gz"

# アーカイブの存在確認。無ければダウンロード確認→ダウンロード
if [ ! -f "$ARCHIVE_PATH" ]; then
    whiptail --title "MediaHarbor Installer" --yesno "mediaharbor.tar.gz が見つかりません。\nダウンロードして取り込みますか？\n\nURL:\nhttps://mediaharbor.trafficsim.co.jp/downloads/mediaharbor.tar.gz" --notags 11 68
    if [ $? -eq 0 ]; then
        echo "mediaharbor.tar.gz をダウンロードしています..."
        (cd "$SCRIPT_PATH" && sudo -E curl -fL https://mediaharbor.trafficsim.co.jp/downloads/mediaharbor.tar.gz -o mediaharbor.tar.gz)
        if [ $? -ne 0 ]; then
            echo -e "mediaharbor.tar.gz:\e[31mDownload Error!\e[m"
            exit 1
        fi
    else
        echo -e "\e[31mError: mediaharbor.tar.gz が必要です。処理を中止します。\e[m"
        exit 1
    fi
fi

echo "Dockerイメージを取り込み中..."
sudo docker load -i "$ARCHIVE_PATH"
if [ $? -ne 0 ]; then
    echo -e "docker load:\e[31mError!\e[m"
    exit 1
else
    echo -e "docker load:\e[32mSuccess!\e[m"
fi

# DBマイグレーション
if ! start_db_for_setup; then
    exit 1
fi
if ! run_zabbix_db_init; then
    echo -e "Zabbix DB:\e[31mError!\e[m"
    exit 1
fi
sudo "${DOCKER_COMPOSE_CMD[@]}" run --name db_migrate api npx sequelize-cli db:migrate
if [ $? -ne 0 ]
then
    echo -e "DBマイグレーション:\e[31mError!\e[m"
    exit 1
else
    echo -e "DBマイグレーション:\e[32mSuccess!\e[m"
fi
# DBシード
sudo "${DOCKER_COMPOSE_CMD[@]}" run --name db_seed_1 api npx sequelize-cli db:seed:undo:all
sudo "${DOCKER_COMPOSE_CMD[@]}" run --name db_seed_2 api npx sequelize-cli db:seed:all
if [ $? -ne 0 ]
then
    echo -e "DBシード:\e[31mError!\e[m"
    exit 1
else
    echo -e "DBシード:\e[32mSuccess!\e[m"
fi

sudo "${DOCKER_COMPOSE_CMD[@]}" down --remove-orphans

if [ $CPU_REALTIME_ENABLE = true ]; then
    # CPUリソースの制限を更新するスクリプトを作成
    touch /usr/local/bin/set_cpu_runtime.sh
    echo "#!/bin/bash" > /usr/local/bin/set_cpu_runtime.sh
    echo "echo 800000 > /sys/fs/cgroup/cpu,cpuacct/docker/cpu.rt_runtime_us" >> /usr/local/bin/set_cpu_runtime.sh
    chmod +x /usr/local/bin/set_cpu_runtime.sh

    # サーバー起動時に自動でCPUリソースの制限を更新するようにサービスを作成
    touch /etc/systemd/system/set_cpu_runtime.service
    echo "[Unit]" > /etc/systemd/system/set_cpu_runtime.service
    echo "Description=Set CPU Runtime" >> /etc/systemd/system/set_cpu_runtime.service
    echo "After=docker.service" >> /etc/systemd/system/set_cpu_runtime.service
    echo "[Service]" >> /etc/systemd/system/set_cpu_runtime.service
    echo "Type=oneshot" >> /etc/systemd/system/set_cpu_runtime.service
    echo "ExecStart=/usr/local/bin/set_cpu_runtime.sh" >> /etc/systemd/system/set_cpu_runtime.service
    echo "[Install]" >> /etc/systemd/system/set_cpu_runtime.service
    echo "WantedBy=multi-user.target" >> /etc/systemd/system/set_cpu_runtime.service
    if command -v systemctl &> /dev/null; then
        systemctl daemon-reload
        systemctl enable set_cpu_runtime.service
        systemctl start set_cpu_runtime.service
    else
        echo -e "CPU Runtime Service: \e[33mWarning: systemctl not available, manual service setup may be required\e[m"
    fi
fi

# sysctlの設定変更
PARAMS=(
  "net.core.rmem_default=33554432"
  "net.core.rmem_max=33554432"
  "net.core.wmem_default=33554432"
  "net.core.wmem_max=33554432"
  "net.ipv4.udp_rmem_min=16384"
  "net.ipv4.udp_wmem_min=16384"
  "net.ipv4.conf.lo.rp_filter=0"
  "fs.inotify.max_user_instances=8192"
)

# 設定ファイルのパス
SYSCTL_CONF="/etc/sysctl.conf"

# 設定更新
update_sysctl_conf() {
  local param_line="$1"
  local key="${param_line%%=*}"
  local value="${param_line#*=}"

  # 同じキーが定義されている行を一旦削除
  sed -i "/^${key}\s*=/d" "$SYSCTL_CONF"

  # ファイル末尾に追記
  echo "${key}=${value}" >> "$SYSCTL_CONF"

  # その場ですぐ反映
  sysctl -w "${key}=${value}"
}

# パラメータを1つずつ処理
for param_line in "${PARAMS[@]}"; do
  update_sysctl_conf "$param_line"
done

# 設定ファイルを反映
sysctl -p "$SYSCTL_CONF"

# Amazon Linuxではない場合
if [ $DISTRO != "amzn" ]; then
    # ファイアウォール設定
    whiptail --title "MediaHarbor Installer" --yesno "ファイアウォールのポート解放設定を自動で行いますか？\nfirewalldを利用していない場合はいいえを選択してください。" --notags 8 60
    if [ $? -eq 0 ]; then
        # OSチェック
        case $DISTRO in
            centos|almalinux|rocky|rhel|ol)
                # CentOSか、Amazon Linux、AlmaLinux、Rocky Linux、RedHat Enterprise Linux、Oracle Linuxの場合
                echo "ファイアウォール設定中..."
                echo "- WebServer http Port 80:"
                sudo firewall-cmd --add-service=http --zone=public --permanent
                echo "- SRT Output Port 10100-10200:"
                sudo firewall-cmd --add-port=10100-10200/udp --zone=public --permanent
                echo "- WebRTC Port 49152-65535:"
                sudo firewall-cmd --add-port=49152-65535/udp --zone=public --permanent
                echo "- SRT/RTP Input Port 42000-42100:"
                sudo firewall-cmd --add-port=42000-42100/udp --zone=public --permanent
                echo "- Tally Input Port 8900/udp,9000/tcp:"
                sudo firewall-cmd --add-port=8900/udp --zone=public --permanent
                sudo firewall-cmd --add-port=9000/udp --zone=public --permanent
                sudo firewall-cmd --reload
                echo -e "\e[32mファイアウォール設定完了\e[m"
                ;;

            ubuntu)
                # Ubuntuの場合
                # ファイアウォール設定
                echo "ファイアウォール設定中..."
                echo "- WebServer http Port 80:"
                sudo ufw allow http
                echo "- SRT Output Port 10102:"
                sudo ufw allow 10102/udp
                echo "- WebRTC Port 49152-65535:"
                sudo ufw allow 49152:65535/udp
                echo "- SRT/RTP Input Port 42000-42100:"
                sudo ufw allow 42000:42100/udp
                echo "- Tally Input Port 8900/udp,9000/tcp:"
                sudo ufw allow 8900/udp
                sudo ufw allow 9000/tcp
                echo -e "\e[32mファイアウォール設定完了\e[m"
                ;;
        esac
    fi
else
    whiptail --ok-button "はい" --msgbox "セキュリティグループでポート解放設定を行ってください。\n - Webサーバー  HTTP    TCP Port 80\n - SRT出力      カスタムUDP Port 10102\n - WebRTC       カスタムUDP Port 49152-65535\n - SRT/RTP入力  カスタムUDP Port 42000-42100\n - IPタリー     カスタムUDP Port 8900\n                カスタムTCP Port 9000" 15 60
fi

# 起動
whiptail --title "MediaHarbor Installer" --yesno "今すぐMediaHarborを起動しますか？" --notags 8 50
if [ $? -eq 0 ]; then
    # 起動
    sudo "${DOCKER_COMPOSE_CMD[@]}" up -d
    sudo "${DOCKER_COMPOSE_CMD[@]}" rm -sfv mhb
    sudo "${DOCKER_COMPOSE_CMD[@]}" up mhb -d
    echo -e "サービス開始:\e[32mSuccess!\e[m"
    sudo "${DOCKER_COMPOSE_CMD[@]}" ps
fi

# ラベルが無くなった古いイメージをクリーンアップ
/usr/bin/docker image prune --filter="label!=..." -f

# 完了
echo -e "\e[32mMediaHarborのインストールが完了しました！\e[m"
echo ""
echo "Webブラウザでアクセスしてご利用ください。"
echo ""
echo "MediaHarborの起動"
echo "  cd $SCRIPT_PATH"
echo "  docker-compose up -d"
echo ""
echo "MediaHarborの終了"
echo "  cd $SCRIPT_PATH"
echo "  docker-compose down"
