#!/usr/bin/env bash # 部署脚本 - 一键部署 MySQL 和 Redis # 使用方法: chmod +x deploy.sh && ./deploy.sh # 支持系统: Ubuntu/Debian/CentOS/RHEL/国产 Linux/macOS set -e # 检查 Bash 版本 if [ -z "$BASH_VERSION" ] || [ "${BASH_VERSION%%.*}" -lt 3 ]; then echo "错误: 需要 Bash 3.0 或更高版本" exit 1 fi echo "==========================================" echo " zskk pacsonline 部署脚本" echo "==========================================" echo "" # 颜色定义 GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # 检查 Docker 是否安装 if ! command -v docker &> /dev/null; then echo -e "${RED}错误: Docker 未安装,请先安装 Docker${NC}" exit 1 fi echo -e "${GREEN}✓ Docker 已安装${NC}" # 检查 Docker Compose 是否可用 if docker compose version &> /dev/null; then COMPOSE_CMD="docker compose" echo -e "${GREEN}✓ Docker Compose V2 可用${NC}" elif command -v docker-compose &> /dev/null; then COMPOSE_CMD="docker-compose" echo -e "${GREEN}✓ Docker Compose V1 可用${NC}" else echo -e "${RED}错误: Docker Compose 未安装${NC}" exit 1 fi echo "" echo "==========================================" echo " 开始部署..." echo "==========================================" echo "" echo "开始设置宿主机挂载目录权限..." # 定义需要授权的宿主机目录列表(根据你的 compose 挂载路径填写) MOUNT_DIRS=( "./projects/www" # PHP 代码目录(对应容器 /var/www/html) #"./mysql/data" # MySQL 数据目录 #"./mysql/conf" # MySQL 配置目录 "./mysql/init" # MySQL 初始化脚本目录 #"./redis/data" # redis 数据目录 #"./redis/conf/redis.conf" # redis 配置目录 #"./nginx/conf" # nginx 配置目录 #"./nginx/logs" # nginx 日志目录 # 其他容器的挂载目录(如有),按实际路径添加 ) # 循环给每个目录设置 777 权限 for dir in "${MOUNT_DIRS[@]}"; do # 检查目录是否存在,不存在则创建 if [ ! -d "$dir" ]; then mkdir -p "$dir" echo "创建目录:$dir" fi # 设置权限 chmod -R 777 "$dir" echo "已授权目录:$dir(权限 777)" done echo "宿主机挂载目录授权完成..." # 自动检测系统架构 ARCH=$(uname -m) case "$ARCH" in x86_64) ARCH_SUFFIX="amd64" ;; aarch64|arm64) ARCH_SUFFIX="arm64" ;; *) echo -e "${RED}错误: 不支持的架构 $ARCH${NC}" exit 1 ;; esac echo -e "${GREEN}✓ 检测到系统架构: $ARCH ($ARCH_SUFFIX)${NC}" echo "" # 加载镜像 echo -e "${YELLOW}加载镜像...${NC}" # 优先加载带架构后缀的镜像,其次尝试通用名称 if [ -f "./images/mysql-image-${ARCH_SUFFIX}.tar" ]; then docker load -i "./images/mysql-image-${ARCH_SUFFIX}.tar" echo -e "${GREEN}✓ MySQL 镜像加载完成 (${ARCH_SUFFIX})${NC}" elif [ -f "./images/mysql-image.tar" ]; then docker load -i ./images/mysql-image.tar echo -e "${GREEN}✓ MySQL 镜像加载完成${NC}" else echo -e "${YELLOW}⚠ 未找到 MySQL 镜像文件${NC}" fi if [ -f "./images/redis-image-${ARCH_SUFFIX}.tar" ]; then docker load -i "./images/redis-image-${ARCH_SUFFIX}.tar" echo -e "${GREEN}✓ Redis 镜像加载完成 (${ARCH_SUFFIX})${NC}" elif [ -f "./images/redis-image.tar" ]; then docker load -i redis-image.tar echo -e "${GREEN}✓ Redis 镜像加载完成${NC}" else echo -e "${YELLOW}⚠ 未找到 Redis 镜像文件${NC}" fi if [ -f "./images/nginx-image-${ARCH_SUFFIX}.tar" ]; then docker load -i "./images/nginx-image-${ARCH_SUFFIX}.tar" echo -e "${GREEN}✓ Nginx 镜像加载完成 (${ARCH_SUFFIX})${NC}" elif [ -f "./images/nginx-image.tar" ]; then docker load -i ./images/nginx-image.tar echo -e "${GREEN}✓ Nginx 镜像加载完成${NC}" fi if [ -f "./images/php-fpm-mysql-7.4-${ARCH_SUFFIX}.tar" ]; then docker load -i "./images/php-fpm-mysql-7.4-${ARCH_SUFFIX}.tar" echo -e "${GREEN}✓ php-fpm-mysql-7.4 镜像加载完成 (${ARCH_SUFFIX})${NC}" elif [ -f "./images/php-fpm-mysql-7.4.tar" ]; then docker load -i ./images/php-fpm-mysql-7.4.tar echo -e "${GREEN}✓ Nginx 镜像加载完成${NC}" fi # if [ -f "minio-image-${ARCH_SUFFIX}.tar" ]; then # docker load -i "minio-image-${ARCH_SUFFIX}.tar" # echo -e "${GREEN}✓ MinIO 镜像加载完成 (${ARCH_SUFFIX})${NC}" # elif [ -f "minio-image.tar" ]; then # docker load -i minio-image.tar # echo -e "${GREEN}✓ MinIO 镜像加载完成${NC}" # fi echo "" # 停止已存在的容器(如果有) echo -e "${YELLOW}停止旧容器(如果存在)...${NC}" $COMPOSE_CMD down 2>/dev/null || true # 启动服务 echo -e "${YELLOW}启动服务...${NC}" $COMPOSE_CMD up -d echo "" echo -e "${GREEN}等待 MySQL 启动完成...${NC}" sleep 15 # 初始化 MySQL 数据库 if [ -f "./mysql/init/mysql-init.sql" ]; then # echo "" # echo -e "${YELLOW}执行 MySQL 初始化脚本...${NC}" # # 等待 MySQL 完全就绪(兼容所有系统) # COUNTER=0 # MAX_RETRIES=30 # while [ $COUNTER -lt $MAX_RETRIES ]; do # if docker exec mysql mysqladmin ping -h localhost -uroot -pZskk@2025 --silent &> /dev/null; then # echo "" # echo -e "${GREEN}✓ MySQL 已就绪${NC}" # break # fi # echo -n "." # sleep 1 # COUNTER=$((COUNTER + 1)) # done # if [ $COUNTER -eq $MAX_RETRIES ]; then # echo "" # echo -e "${RED}✗ MySQL 启动超时${NC}" # exit 1 # fi # echo "" # # 执行初始化脚本 # docker exec -i mysql mysql -uroot -pZskk@2025 pacsonline < ./mysql/init/mysql-init.sql # if [ $? -eq 0 ]; then # echo -e "${GREEN}✓ MySQL 初始化完成${NC}" # else # echo -e "${RED}✗ MySQL 初始化失败${NC}" # fi echo "" echo -e "${GREEN}MySQL 将在首次启动时自动执行初始化脚本${NC}" echo "" else echo -e "${YELLOW}未找到 mysql-init.sql 文件,跳过数据库初始化${NC}" fi # 检查服务状态 echo "" echo "==========================================" echo " 服务状态" echo "==========================================" $COMPOSE_CMD ps echo "" echo "==========================================" echo " 部署完成!" echo "==========================================" echo "" echo -e "${GREEN}MySQL 连接信息:${NC}" echo " 主机: localhost" echo " 端口: 3306" echo " 数据库: pacsonline" echo " 用户: pacsonline" echo " 密码: zskk@2025" echo " Root 密码: Zskk@2025" echo "" echo -e "${GREEN}Redis 连接信息:${NC}" echo " 主机: localhost" echo " 端口: 6379" echo " 密码: zskk@2025" echo "" # echo -e "${GREEN}MinIO 连接信息:${NC}" # echo " API 地址: http://localhost:9000" # echo " 控制台: http://localhost:9001" # echo " 用户名: admin" # echo " 密码: zskk8888" # echo "" echo -e "${YELLOW}查看日志:${NC}" echo " MySQL: $COMPOSE_CMD logs -f mysql" echo " Redis: $COMPOSE_CMD logs -f redis" echo " php-fpm: $COMPOSE_CMD logs -f php-fpm" echo " nginx: $COMPOSE_CMD logs -f nginx" echo "" echo -e "${YELLOW}停止服务:${NC}" echo " $COMPOSE_CMD stop" echo "" echo -e "${YELLOW}重启服务:${NC}" echo " $COMPOSE_CMD restart" echo "" echo -e "${YELLOW}删除服务:${NC}" echo " $COMPOSE_CMD down" echo ""