QAUP_Management/deploy/docker/config-manager.sh

335 lines
8.2 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# QAUP 配置管理脚本
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
ENV_FILE="$PROJECT_ROOT/.env"
ENV_TEMPLATE="$PROJECT_ROOT/.env.template"
CONFIG_DIR="$PROJECT_ROOT/config"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
print_message() {
local color=$1
local message=$2
echo -e "${color}${message}${NC}"
}
# 显示帮助信息
show_help() {
echo "QAUP 配置管理脚本"
echo ""
echo "用法: $0 [命令] [选项]"
echo ""
echo "命令:"
echo " init 初始化配置文件"
echo " validate 验证配置文件"
echo " generate 生成配置文件"
echo " backup 备份配置文件"
echo " restore 恢复配置文件"
echo " encrypt 加密敏感配置"
echo " decrypt 解密敏感配置"
echo " show 显示当前配置"
echo ""
echo "示例:"
echo " $0 init # 初始化配置"
echo " $0 validate # 验证配置"
echo " $0 generate prod # 生成生产环境配置"
}
# 初始化配置
init_config() {
print_message $BLUE "初始化 QAUP 配置..."
# 创建配置目录
mkdir -p "$CONFIG_DIR"
# 复制环境模板文件
if [ ! -f "$ENV_FILE" ]; then
if [ -f "$ENV_TEMPLATE" ]; then
cp "$ENV_TEMPLATE" "$ENV_FILE"
print_message $GREEN "环境配置文件已创建: $ENV_FILE"
print_message $YELLOW "请编辑 $ENV_FILE 文件,修改相关配置"
else
print_message $RED "错误: 环境模板文件不存在: $ENV_TEMPLATE"
exit 1
fi
else
print_message $YELLOW "环境配置文件已存在: $ENV_FILE"
fi
# 创建必要的目录
create_directories
print_message $GREEN "配置初始化完成!"
}
# 创建必要的目录
create_directories() {
local data_dir="./data"
local log_dir="./logs"
local backup_dir="./backup"
local ssl_dir="./ssl"
print_message $BLUE "创建必要的目录..."
mkdir -p "$data_dir"/{postgres,redis,uploads}
mkdir -p "$log_dir"/{postgres,redis,app,nginx}
mkdir -p "$backup_dir"/{postgres,config}
mkdir -p "$ssl_dir"
# 设置目录权限
chmod 755 "$data_dir" "$log_dir" "$backup_dir"
chmod 700 "$data_dir"/postgres "$ssl_dir"
print_message $GREEN "目录创建完成"
}
# 验证配置文件
validate_config() {
print_message $BLUE "验证配置文件..."
local errors=0
# 检查环境文件
if [ ! -f "$ENV_FILE" ]; then
print_message $RED "错误: 环境文件不存在: $ENV_FILE"
errors=$((errors + 1))
else
# 检查必需的环境变量
source "$ENV_FILE"
local required_vars=(
"POSTGRES_DB"
"POSTGRES_USER"
"POSTGRES_PASSWORD"
"APP_DB_USER"
"APP_DB_PASSWORD"
)
for var in "${required_vars[@]}"; do
if [ -z "${!var}" ]; then
print_message $RED "错误: 必需的环境变量未设置: $var"
errors=$((errors + 1))
fi
done
# 检查密码强度
if [ ${#POSTGRES_PASSWORD} -lt 8 ]; then
print_message $YELLOW "警告: 数据库密码长度少于8位建议使用更强的密码"
fi
if [ ${#APP_DB_PASSWORD} -lt 8 ]; then
print_message $YELLOW "警告: 应用数据库密码长度少于8位建议使用更强的密码"
fi
fi
# 检查配置文件
local config_files=(
"$CONFIG_DIR/application-prod.yml"
)
for config_file in "${config_files[@]}"; do
if [ ! -f "$config_file" ]; then
print_message $YELLOW "警告: 配置文件不存在: $config_file"
fi
done
if [ $errors -eq 0 ]; then
print_message $GREEN "配置验证通过!"
return 0
else
print_message $RED "配置验证失败,发现 $errors 个错误"
return 1
fi
}
# 生成配置文件
generate_config() {
local env=${1:-prod}
print_message $BLUE "生成 $env 环境配置文件..."
if [ ! -f "$ENV_FILE" ]; then
print_message $RED "错误: 环境文件不存在,请先运行 init 命令"
exit 1
fi
source "$ENV_FILE"
# 生成 Docker Compose 环境文件
local compose_env_file="$PROJECT_ROOT/.env.compose"
cat > "$compose_env_file" << EOF
# Docker Compose 环境配置
# 由配置管理脚本自动生成
# 数据库配置
POSTGRES_DB=$POSTGRES_DB
POSTGRES_USER=$POSTGRES_USER
POSTGRES_PASSWORD=$POSTGRES_PASSWORD
APP_DB_USER=$APP_DB_USER
APP_DB_PASSWORD=$APP_DB_PASSWORD
# Redis 配置
REDIS_PASSWORD=$REDIS_PASSWORD
# 应用配置
SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE
APP_PORT=$APP_PORT
# Nginx 配置
NGINX_PORT=$NGINX_PORT
SERVER_NAME=$SERVER_NAME
API_PREFIX=$API_PREFIX
MAX_UPLOAD_SIZE=$MAX_UPLOAD_SIZE
# 目录配置
DATA_DIR=$DATA_DIR
LOG_DIR=$LOG_DIR
BACKUP_DIR=$BACKUP_DIR
# JVM 配置
JVM_OPTS=$JVM_OPTS
EOF
print_message $GREEN "配置文件生成完成: $compose_env_file"
}
# 备份配置文件
backup_config() {
local backup_dir="./backup/config"
local timestamp=$(date +%Y%m%d_%H%M%S)
local backup_file="config_backup_$timestamp.tar.gz"
print_message $BLUE "备份配置文件..."
mkdir -p "$backup_dir"
# 创建备份
tar -czf "$backup_dir/$backup_file" \
-C "$PROJECT_ROOT" \
.env \
config/ \
docker-compose*.yml \
2>/dev/null || true
print_message $GREEN "配置备份完成: $backup_dir/$backup_file"
}
# 显示当前配置
show_config() {
print_message $BLUE "当前配置信息:"
if [ -f "$ENV_FILE" ]; then
echo ""
echo "环境变量配置:"
echo "=============="
# 隐藏敏感信息
grep -v "PASSWORD\|SECRET" "$ENV_FILE" | grep -v "^#" | grep -v "^$"
echo ""
echo "敏感配置项:"
echo "==========="
grep "PASSWORD\|SECRET" "$ENV_FILE" | sed 's/=.*/=***/' || echo "无敏感配置项"
else
print_message $RED "环境配置文件不存在"
fi
}
# 加密敏感配置
encrypt_config() {
print_message $BLUE "加密敏感配置..."
if [ ! -f "$ENV_FILE" ]; then
print_message $RED "错误: 环境文件不存在"
exit 1
fi
# 创建加密版本
local encrypted_file="$ENV_FILE.encrypted"
# 使用 openssl 加密(需要输入密码)
openssl enc -aes-256-cbc -salt -in "$ENV_FILE" -out "$encrypted_file"
if [ $? -eq 0 ]; then
print_message $GREEN "配置文件已加密: $encrypted_file"
print_message $YELLOW "请妥善保管加密密码"
else
print_message $RED "配置文件加密失败"
exit 1
fi
}
# 解密敏感配置
decrypt_config() {
print_message $BLUE "解密敏感配置..."
local encrypted_file="$ENV_FILE.encrypted"
if [ ! -f "$encrypted_file" ]; then
print_message $RED "错误: 加密文件不存在: $encrypted_file"
exit 1
fi
# 使用 openssl 解密
openssl enc -aes-256-cbc -d -in "$encrypted_file" -out "$ENV_FILE"
if [ $? -eq 0 ]; then
print_message $GREEN "配置文件已解密: $ENV_FILE"
else
print_message $RED "配置文件解密失败"
exit 1
fi
}
# 主函数
main() {
if [ $# -eq 0 ]; then
show_help
exit 0
fi
local command=$1
shift
case $command in
init)
init_config
;;
validate)
validate_config
;;
generate)
generate_config "$@"
;;
backup)
backup_config
;;
show)
show_config
;;
encrypt)
encrypt_config
;;
decrypt)
decrypt_config
;;
help|--help|-h)
show_help
;;
*)
print_message $RED "未知命令: $command"
show_help
exit 1
;;
esac
}
main "$@"