QAUP_Management/deploy/docker/docker-compose-manager.sh

299 lines
6.4 KiB
Bash
Executable File

#!/bin/bash
# Docker Compose 管理脚本
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
ENV_FILE="$PROJECT_ROOT/.env"
# 默认环境
ENVIRONMENT=${ENVIRONMENT:-prod}
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 打印带颜色的消息
print_message() {
local color=$1
local message=$2
echo -e "${color}${message}${NC}"
}
# 显示帮助信息
show_help() {
echo "QAUP Docker Compose 管理脚本"
echo ""
echo "用法: $0 [环境] [命令] [选项]"
echo ""
echo "环境:"
echo " dev 开发环境"
echo " prod 生产环境(默认)"
echo ""
echo "命令:"
echo " start 启动服务"
echo " stop 停止服务"
echo " restart 重启服务"
echo " status 查看服务状态"
echo " logs 查看服务日志"
echo " build 构建镜像"
echo " pull 拉取镜像"
echo " clean 清理资源"
echo " backup 备份数据"
echo " restore 恢复数据"
echo ""
echo "示例:"
echo " $0 prod start # 启动生产环境"
echo " $0 dev logs qaup-app # 查看开发环境应用日志"
echo " $0 prod backup # 备份生产环境数据"
}
# 检查环境文件
check_env_file() {
if [ ! -f "$ENV_FILE" ]; then
print_message $YELLOW "警告: 环境文件不存在,创建默认配置..."
create_default_env
fi
}
# 创建默认环境文件
create_default_env() {
cat > "$ENV_FILE" << EOF
# QAUP Docker 部署环境配置
# 数据库配置
POSTGRES_DB=qaup
POSTGRES_USER=postgres
POSTGRES_PASSWORD=qaup123
APP_DB_USER=qaup_app
APP_DB_PASSWORD=qaup123
# Redis 配置
REDIS_PASSWORD=
# 应用配置
SPRING_PROFILES_ACTIVE=prod
APP_PORT=8080
# Nginx 配置
NGINX_PORT=80
NGINX_HTTPS_PORT=443
SERVER_NAME=localhost
API_PREFIX=/prod-api
MAX_UPLOAD_SIZE=20M
# 目录配置
DATA_DIR=./data
LOG_DIR=./logs
BACKUP_DIR=./backup
# JVM 配置
JVM_OPTS=-Dname=qaup-admin.jar -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m
EOF
print_message $GREEN "默认环境文件已创建: $ENV_FILE"
}
# 获取 compose 文件参数
get_compose_files() {
local env=$1
local base_file="$PROJECT_ROOT/docker-compose.yml"
local env_file="$PROJECT_ROOT/docker-compose.$env.yml"
if [ -f "$env_file" ]; then
echo "-f $base_file -f $env_file"
else
echo "-f $base_file"
fi
}
# 创建必要的目录
create_directories() {
local data_dir=${DATA_DIR:-./data}
local log_dir=${LOG_DIR:-./logs}
local backup_dir=${BACKUP_DIR:-./backup}
print_message $BLUE "创建必要的目录..."
mkdir -p "$data_dir"/{postgres,redis,uploads}
mkdir -p "$log_dir"/{postgres,redis,app,nginx}
mkdir -p "$backup_dir"/postgres
# 设置权限
chmod 755 "$data_dir" "$log_dir" "$backup_dir"
chmod 700 "$data_dir"/postgres
}
# 启动服务
start_services() {
local env=$1
shift
local services="$@"
print_message $GREEN "启动 $env 环境服务..."
check_env_file
create_directories
cd "$PROJECT_ROOT"
docker-compose $(get_compose_files $env) --env-file "$ENV_FILE" up -d $services
print_message $GREEN "服务启动完成!"
show_status $env
}
# 停止服务
stop_services() {
local env=$1
shift
local services="$@"
print_message $YELLOW "停止 $env 环境服务..."
cd "$PROJECT_ROOT"
docker-compose $(get_compose_files $env) --env-file "$ENV_FILE" stop $services
print_message $GREEN "服务停止完成!"
}
# 重启服务
restart_services() {
local env=$1
shift
local services="$@"
print_message $BLUE "重启 $env 环境服务..."
stop_services $env $services
sleep 2
start_services $env $services
}
# 查看服务状态
show_status() {
local env=$1
print_message $BLUE "查看 $env 环境服务状态..."
cd "$PROJECT_ROOT"
docker-compose $(get_compose_files $env) --env-file "$ENV_FILE" ps
}
# 查看日志
show_logs() {
local env=$1
shift
local services="$@"
cd "$PROJECT_ROOT"
docker-compose $(get_compose_files $env) --env-file "$ENV_FILE" logs -f $services
}
# 构建镜像
build_images() {
local env=$1
print_message $BLUE "构建 $env 环境镜像..."
cd "$PROJECT_ROOT"
docker-compose $(get_compose_files $env) --env-file "$ENV_FILE" build
print_message $GREEN "镜像构建完成!"
}
# 清理资源
clean_resources() {
local env=$1
print_message $YELLOW "清理 $env 环境资源..."
cd "$PROJECT_ROOT"
# 停止并删除容器
docker-compose $(get_compose_files $env) --env-file "$ENV_FILE" down
# 清理未使用的镜像和网络
docker system prune -f
print_message $GREEN "资源清理完成!"
}
# 备份数据
backup_data() {
local env=$1
print_message $BLUE "备份 $env 环境数据..."
cd "$PROJECT_ROOT"
# 执行数据库备份
docker-compose $(get_compose_files $env) --env-file "$ENV_FILE" exec qaup-postgres /backup-db.sh
print_message $GREEN "数据备份完成!"
}
# 主函数
main() {
if [ $# -eq 0 ]; then
show_help
exit 0
fi
# 解析参数
local env="prod"
local command=""
# 检查第一个参数是否是环境
if [[ "$1" =~ ^(dev|prod)$ ]]; then
env=$1
shift
fi
if [ $# -eq 0 ]; then
show_help
exit 0
fi
command=$1
shift
# 加载环境文件
if [ -f "$ENV_FILE" ]; then
source "$ENV_FILE"
fi
# 执行命令
case $command in
start)
start_services $env "$@"
;;
stop)
stop_services $env "$@"
;;
restart)
restart_services $env "$@"
;;
status)
show_status $env
;;
logs)
show_logs $env "$@"
;;
build)
build_images $env
;;
clean)
clean_resources $env
;;
backup)
backup_data $env
;;
help|--help|-h)
show_help
;;
*)
print_message $RED "未知命令: $command"
show_help
exit 1
;;
esac
}
# 执行主函数
main "$@"