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:
moira
2026-05-13 15:21:22 +08:00
parent bded0113ee
commit 0ffe2065e1

View File

@@ -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