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