#!/bin/bash
set -e
# 遇到错误即退出
# 设置文件名
docker_file="docker-29.9.0.tgz"
docker_compose_file="docker-compose-linux-x86_64"

# 检查架构
ARCH=$(uname -m)
if [ "$ARCH" != "x86_64" ]; then
    echo "当前服务器的架构是: $ARCH，仅支持x86_64架构"
    exit 1
fi

echo "当前服务器的架构是 x86_64 (64-bit)，继续进行"

install_docker(){
    # 检查文件是否存在（内网环境，不进行下载，仅检查文件是否存在）
    if [[ ! -f "$docker_file" || ! -f "$docker_compose_file" ]]; then
        echo "错误：未在当前目录找到必要的安装文件！"
        echo "请确保 $docker_file 和 $docker_compose_file 已放置在脚本同路径下"
        exit 1
    fi

    # 执行离线安装 Docker
    offline_install() {
        local origin_path=$(pwd)  # 记录当前目录
        file_path=$(pwd)  # 设置离线文件所在目录为当前目录

        # 解压 Docker 文件并安装
        cd $file_path
        tar xzvf $docker_file
        cp -rf docker/* /usr/bin/  # 复制 Docker 可执行文件到 /usr/bin/
        rm -rf docker  # 删除解压后的临时文件
        cd ${origin_path} >/dev/null  # 回到原来的目录
    }

    # 写入 Docker systemd 服务配置
    write_service() {
        mkdir -p /usr/lib/systemd/system/

        # 定义 Docker 服务配置内容
        docker_service_config="[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP \$MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target"

        # 将服务配置内容写入 docker.service 文件
        echo "$docker_service_config" > /usr/lib/systemd/system/docker.service
    }

    # 执行离线安装步骤
    offline_install
    write_service
    systemctl daemon-reload

    # ========== Compose 两种部署方式：优先插件模式(docker compose)，兜底独立二进制(docker-compose) ==========
    # 1. 部署为CLI插件（推荐，命令 docker compose）
    mkdir -p /usr/local/lib/docker/cli-plugins
    cp ${docker_compose_file} /usr/local/lib/docker/cli-plugins/docker-compose
    chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
    # 2. 同时复制一份到 /usr/local/bin 作为兜底独立命令（docker-compose）
    cp ${docker_compose_file} /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose

    # 判断是否存在 systemctl
    if command -v systemctl &>/dev/null; then
        # 启用并启动 Docker 服务
        systemctl enable docker.service
        systemctl start docker
    else
        echo "未找到 systemctl，无法管理 Docker 服务。"
    fi

    echo "Docker 和 Docker Compose 安装完成！"
}

# 检查 docker 是否存在
if ! command -v docker &> /dev/null; then
    echo "未安装 Docker，开始安装..."
    install_docker
    echo "Docker 安装完成"
else
    echo "Docker 已安装，版本：$(docker --version)"
    # 检查 compose
    if command -v docker-compose &> /dev/null; then
        echo "已安装 docker-compose(独立二进制)，版本：$(docker-compose --version)"
    fi
    if docker compose version &> /dev/null; then
        echo "已安装 docker compose(CLI插件)，版本：$(docker compose version --short)"
    else
        echo "未安装 Docker Compose，开始安装 Compose..."
        install_docker
    fi
fi

# 最终验证
echo "===== 最终校验 ====="
docker --version
if docker compose version &>/dev/null;then
    docker compose version
elif command -v docker-compose &>/dev/null;then
    docker-compose --version
fi
echo "所有任务执行完毕！"
