#!/bin/bash
set -euo pipefail
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 日志函数
info() { echo -e "${GREEN}[INFO] $1${NC}"; }
warn() { echo -e "${YELLOW}[WARN] $1${NC}"; }
error() { echo -e "${RED}[ERROR] $1${NC}"; exit 1; }
# 1. 系统校验
check_os() {
info "校验系统版本..."
if ! grep -E "CentOS Linux release 7|CentOS Linux release 8|CentOS Stream" /etc/redhat-release &>/dev/null; then
error "仅支持 CentOS7/8/Stream 系统"
fi
}
# 2. root权限校验
check_root() {
info "校验执行权限..."
if [ "$(id -u)" -ne 0 ]; then
error "请使用 root 权限执行脚本!"
fi
}
# 3. 检查并安装 Docker Compose 插件(强校验)
check_docker_compose() {
info "检查 Docker Compose 插件..."
# 检查插件文件
if [ ! -f /usr/libexec/docker/cli-plugins/docker-compose ]; then
info "未检测到 compose 插件,开始安装..."
yum install -y docker-compose-plugin || error "Docker Compose 插件安装失败"
fi
# 创建软链接(CentOS7 必须)
ln -sf /usr/libexec/docker/cli-plugins/docker-compose /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
# 最终校验命令是否可用
if ! docker compose version &>/dev/null; then
error "Docker Compose 不可用,请检查 Docker 安装"
fi
info "Docker Compose 正常可用 ✅"
}
# 4. 安装 Docker
install_docker() {
info "安装依赖工具..."
yum install -y yum-utils git
info "添加阿里云 Docker 源..."
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
info "安装 Docker + Compose 插件(完整组件)..."
yum install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
info "启动 Docker..."
systemctl start docker
systemctl enable docker
# 强制校验 compose
check_docker_compose
}
# 5. 部署 Dify
deploy_dify() {
info "开始部署 Dify..."
cd /root
if [ ! -d "dify" ]; then
git clone https://gitee.com/dify_ai/dify.git || error "克隆失败"
fi
cd dify/docker
if [ ! -f ".env" ]; then
cp .env.example .env
fi
info "拉取镜像..."
docker compose pull
info "启动服务..."
docker compose up -d
sleep 3
docker compose ps | grep "Up" || error "启动失败"
}
# 主流程
main() {
check_root
check_os
if ! command -v docker &>/dev/null; then
install_docker
else
check_docker_compose
systemctl start docker
fi
deploy_dify
info "======================================"
info "部署成功!"
info "访问地址:http://$(hostname -I | awk '{print $1}')"
info "查看状态:cd /root/dify/docker && docker compose ps"
info "======================================"
}
main