From 0ffe2065e19511257d8e06c66781e0ce1b8eb0c9 Mon Sep 17 00:00:00 2001 From: moira Date: Wed, 13 May 2026 15:21:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=83=A8=E7=BD=B2=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0.env=E6=96=87=E4=BB=B6=E5=81=A5=E5=BA=B7?= =?UTF-8?q?=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 check_env_file() 函数,在编译前自动检查: 1. .env 文件是否存在 2. 必需变量是否定义(生产环境额外要求SSL_KEY_PATH/SSL_CERT_PATH) 3. 变量值是否为占位符(your_/placeholder/xxx等) 4. 变量行是否被注释(# VAR=) 检查失败时终止部署,防止因缺少密钥导致服务无法启动 --- deploy.sh | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/deploy.sh b/deploy.sh index 31bda25..fe4e08f 100755 --- a/deploy.sh +++ b/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