feat: 部署脚本添加.env文件健康检查
新增 check_env_file() 函数,在编译前自动检查: 1. .env 文件是否存在 2. 必需变量是否定义(生产环境额外要求SSL_KEY_PATH/SSL_CERT_PATH) 3. 变量值是否为占位符(your_/placeholder/xxx等) 4. 变量行是否被注释(# VAR=) 检查失败时终止部署,防止因缺少密钥导致服务无法启动
This commit is contained in:
76
deploy.sh
76
deploy.sh
@@ -497,7 +497,80 @@ cleanup_old_backups() {
|
||||
done
|
||||
}
|
||||
|
||||
# 检查依赖
|
||||
# 检查远程 .env 文件
|
||||
check_env_file() {
|
||||
log_step "检查远程 .env 文件..."
|
||||
|
||||
if [ "$DRY_RUN" = true ]; then
|
||||
log_dry "ssh ${REMOTE_USER}@${REMOTE_HOST} 'test -f ${REMOTE_DIR}/.env && cat ${REMOTE_DIR}/.env'"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# 1. 检查文件是否存在
|
||||
if ! ssh "${REMOTE_USER}@${REMOTE_HOST}" "test -f '${REMOTE_DIR}/.env'" 2>/dev/null; then
|
||||
log_error ".env 文件不存在: ${REMOTE_DIR}/.env"
|
||||
log_error "请先在服务器上创建 .env 文件"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. 检查必需变量
|
||||
local required_vars=()
|
||||
required_vars+=("JWT_SECRET")
|
||||
required_vars+=("WECHAT_SECRET")
|
||||
required_vars+=("WECHAT_APPID")
|
||||
required_vars+=("DATABASE_URL")
|
||||
|
||||
# 生产环境额外需要 SSL 证书路径
|
||||
if [ "${APP_ENV}" = "production" ]; then
|
||||
required_vars+=("SSL_KEY_PATH")
|
||||
required_vars+=("SSL_CERT_PATH")
|
||||
fi
|
||||
|
||||
local missing_count=0
|
||||
local placeholder_count=0
|
||||
local env_content
|
||||
env_content=$(ssh "${REMOTE_USER}@${REMOTE_HOST}" "cat '${REMOTE_DIR}/.env'" 2>/dev/null || echo "")
|
||||
|
||||
if [ -z "$env_content" ]; then
|
||||
log_error ".env 文件为空: ${REMOTE_DIR}/.env"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for var in "${required_vars[@]}"; do
|
||||
# 提取变量值(支持 VAR=value 和 # VAR= 注释行)
|
||||
local value
|
||||
value=$(echo "$env_content" | grep -E "^${var}=" | head -1 | sed "s/^${var}=//")
|
||||
|
||||
if [ -z "$value" ]; then
|
||||
log_error " 缺少: ${var}=(未定义)"
|
||||
missing_count=$((missing_count + 1))
|
||||
elif echo "$value" | grep -qiE "^(your_|placeholder|change_me|xxx|test_)"; then
|
||||
log_warn " 占位符: ${var}=${value}(请替换为真实值)"
|
||||
placeholder_count=$((placeholder_count + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
# 3. 检查注释掉的变量(常见疏忽)
|
||||
local commented_vars=0
|
||||
for var in "${required_vars[@]}"; do
|
||||
if echo "$env_content" | grep -qE "^#\s*${var}="; then
|
||||
log_warn " 已注释: # ${var}=(行被注释,不会生效)"
|
||||
commented_vars=$((commented_vars + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $missing_count -gt 0 ]; then
|
||||
log_error ".env 文件检查失败:${missing_count} 个必需变量缺失"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ $placeholder_count -gt 0 ] || [ $commented_vars -gt 0 ]; then
|
||||
log_warn ".env 文件存在 ${placeholder_count} 个占位符和 ${commented_vars} 个注释行"
|
||||
log_warn "部署将继续,但建议在部署前修正"
|
||||
else
|
||||
log_info ".env 文件检查通过(${#required_vars[@]} 个必需变量均已配置)"
|
||||
fi
|
||||
}
|
||||
check_dependencies() {
|
||||
log_step "检查依赖..."
|
||||
local deps=("cargo" "rsync" "ssh")
|
||||
@@ -1332,6 +1405,7 @@ main() {
|
||||
|
||||
check_dependencies
|
||||
ssh_connect
|
||||
check_env_file
|
||||
build_project
|
||||
backup_old_version
|
||||
cleanup_old_backups 5
|
||||
|
||||
Reference in New Issue
Block a user