feat: 添加部署脚本和文档并优化Kafka消费者配置

- 添加部署相关脚本(deploy.bat/update.bat/package.bat)和文档(deployment.md/package-guide.md)
 - 新增PM2配置文件(ecosystem.config.js/ecosystem.config.cjs)
 - 优化Kafka消费者配置支持动态fromOffset
 - 添加环境检查脚本(check-env.js)
 - 更新.gitignore添加release目录
 - 补充.env.example配置文件
This commit is contained in:
2026-01-16 16:19:31 +08:00
parent 455185ac5d
commit 625cb9eea4
13 changed files with 1028 additions and 3 deletions

115
scripts/check-env.js Normal file
View File

@@ -0,0 +1,115 @@
import fs from 'node:fs';
import path from 'node:path';
import kafka from 'kafka-node';
import { fileURLToPath } from 'node:url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
console.log('--- 环境检查脚本开始 ---');
console.log('当前时间:', new Date().toISOString());
console.log('当前目录 (cwd):', process.cwd());
console.log('脚本目录:', __dirname);
// 1. 检查 .env 文件
const pathsToCheck = [
path.resolve(process.cwd(), '.env'),
path.resolve(__dirname, '../.env'),
path.resolve(__dirname, '../../.env')
];
let envPath = null;
for (const p of pathsToCheck) {
if (fs.existsSync(p)) {
envPath = p;
break;
}
}
if (envPath) {
console.log('✅ 找到 .env 文件:', envPath);
try {
const content = fs.readFileSync(envPath, 'utf8');
const lines = content.split(/\r?\n/);
lines.forEach(line => {
const trimmed = line.trim();
if (!trimmed || trimmed.startsWith('#')) return;
const idx = trimmed.indexOf('=');
if (idx <= 0) return;
const key = trimmed.slice(0, idx).trim();
let val = trimmed.slice(idx + 1).trim();
if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
val = val.slice(1, -1);
}
envConfig[key] = val;
});
console.log('已加载环境变量:', Object.keys(envConfig).filter(k => k.startsWith('KAFKA') || k.startsWith('PG') || k.startsWith('REDIS')));
} catch (e) {
console.error('❌ 读取 .env 失败:', e.message);
}
} else {
console.warn('⚠️ .env 文件不存在! 将使用系统环境变量或默认值');
}
// 2. 确定 Kafka 配置
const brokers = envConfig.KAFKA_BROKERS || process.env.KAFKA_BROKERS || 'localhost:9092';
const topic = envConfig.KAFKA_TOPIC || process.env.KAFKA_TOPIC || 'blwlog4Nodejs-rcu-heartbeat-topic';
console.log('\n--- Kafka 连接配置 ---');
console.log('Brokers:', brokers);
console.log('Topic:', topic);
// 3. 测试连接
console.log('\n--- 开始连接测试 ---');
try {
const client = new kafka.KafkaClient({
kafkaHost: brokers,
connectTimeout: 5000,
requestTimeout: 5000
});
client.on('ready', () => {
console.log('✅ Kafka Client 连接成功 (Ready)');
console.log('正在加载 Topic Metadata...');
client.loadMetadataForTopics([topic], (err, results) => {
if (err) {
console.error('❌ 获取 Metadata 失败:', err);
client.close();
process.exit(1);
}
console.log('✅ Metadata 获取成功');
// console.log(JSON.stringify(results, null, 2));
const metadata = results[1].metadata;
if (metadata[topic]) {
console.log(`✅ Topic [${topic}] 存在,分区信息:`);
const partitions = metadata[topic];
Object.keys(partitions).forEach(p => {
console.log(` - Partition ${p}: Leader ${partitions[p].leader}, Replicas ${partitions[p].replicas}`);
});
} else {
console.warn(`⚠️ Topic [${topic}] 在 Metadata 中未找到 (可能自动创建中)`);
}
client.close(() => {
console.log('\n测试完成: 网络连接正常');
process.exit(0);
});
});
});
client.on('error', (err) => {
console.error('❌ Kafka 连接错误:', err);
// 不立即退出,等待超时或其他错误
});
// 10秒超时兜底
setTimeout(() => {
console.error('❌ 测试超时 (10秒) - 可能是防火墙或网络不通');
process.exit(1);
}, 10000);
} catch (e) {
console.error('❌ 初始化 Kafka Client 异常:', e);
}

132
scripts/deploy.bat Normal file
View File

@@ -0,0 +1,132 @@
@echo off
chcp 65001 >nul
echo ========================================
echo BLS心跳接收端部署脚本
echo ========================================
setlocal enabledelayedexpansion
:: 检查Node.js是否安装
echo [1/7] 检查Node.js环境...
node --version >nul 2>&1
if errorlevel 1 (
echo [错误] 未检测到Node.js请先安装Node.js
pause
exit /b 1
)
echo [成功] Node.js版本:
node --version
:: 检查PM2是否安装
echo [2/7] 检查PM2环境...
pm2 --version >nul 2>&1
if errorlevel 1 (
echo [警告] 未检测到PM2正在安装PM2...
call npm install -g pm2
if errorlevel 1 (
echo [错误] PM2安装失败
pause
exit /b 1
)
)
echo [成功] PM2版本:
pm2 --version
:: 检查.env文件
echo [3/7] 检查环境配置文件...
if not exist ".env" (
if exist ".env.example" (
echo [信息] 创建.env文件...
copy .env.example .env >nul
echo [警告] 请编辑.env文件设置正确的配置参数
echo [提示] 使用记事本打开: notepad .env
pause
) else (
echo [错误] 未找到.env.example文件
pause
exit /b 1
)
) else (
echo [成功] 环境配置文件已存在
)
:: 安装依赖
echo [4/7] 安装项目依赖...
if not exist "node_modules" (
call npm install --production
if errorlevel 1 (
echo [错误] 依赖安装失败
pause
exit /b 1
)
) else (
echo [信息] 依赖已存在,跳过安装
)
:: 创建日志目录
echo [5/7] 创建日志目录...
if not exist "logs" (
mkdir logs
echo [成功] 日志目录创建成功
) else (
echo [信息] 日志目录已存在
)
:: 检查构建文件
echo [6/7] 检查构建文件...
if not exist "dist\index.es.js" (
echo [警告] 未找到构建文件,请先运行 npm run build
echo [提示] 如果这是首次部署请确保已上传dist目录
pause
exit /b 1
)
echo [成功] 构建文件检查通过
:: 初始化数据库
echo [7/7] 初始化数据库...
echo [信息] 运行数据库初始化脚本...
call npm run db:apply
if errorlevel 1 (
echo [警告] 数据库初始化失败,请检查数据库连接配置
echo [提示] 可以稍后手动运行: npm run db:apply
) else (
echo [成功] 数据库初始化完成
)
:: 使用PM2启动服务
echo ========================================
echo 启动服务
echo ========================================
pm2 start ecosystem.config.cjs
if errorlevel 1 (
echo [错误] 服务启动失败
pause
exit /b 1
)
:: 设置开机自启
echo ========================================
echo 设置开机自启
echo ========================================
pm2 save
pm2 startup
echo [提示] 请按照提示完成开机自启设置
:: 显示服务状态
echo ========================================
echo 服务状态
echo ========================================
pm2 status
echo ========================================
echo 部署完成!
echo ========================================
echo.
echo 常用命令:
echo 查看状态: pm2 status
echo 查看日志: pm2 logs web-bls-heartbeat-server
echo 重启服务: pm2 restart web-bls-heartbeat-server
echo 停止服务: pm2 stop web-bls-heartbeat-server
echo 实时监控: pm2 monit
echo.
pause

95
scripts/package.bat Normal file
View File

@@ -0,0 +1,95 @@
@echo off
chcp 65001 >nul
echo ========================================
echo BLS心跳接收端打包脚本
echo ========================================
setlocal enabledelayedexpansion
:: 设置发布目录
set RELEASE_DIR=release
set VERSION=1.0.0
set PACKAGE_NAME=web-bls-heartbeat-server-v%VERSION%
echo [1/6] 清理旧的发布目录...
if exist "%RELEASE_DIR%" (
rmdir /s /q "%RELEASE_DIR%"
)
mkdir "%RELEASE_DIR%"
echo [2/6] 复制构建文件...
if exist "dist" (
xcopy /E /I /Y dist "%RELEASE_DIR%\dist" >nul
echo [成功] 构建文件已复制
) else (
echo [错误] 未找到dist目录请先运行 npm run build
pause
exit /b 1
)
echo [3/6] 复制配置文件...
copy package.json "%RELEASE_DIR%\" >nul
copy package-lock.json "%RELEASE_DIR%\" >nul
copy ecosystem.config.cjs "%RELEASE_DIR%\" >nul
copy .env.example "%RELEASE_DIR%\" >nul
echo [成功] 配置文件已复制
echo [4/6] 复制脚本文件...
if not exist "%RELEASE_DIR%\scripts" (
mkdir "%RELEASE_DIR%\scripts"
)
copy scripts\deploy.bat "%RELEASE_DIR%\scripts\" >nul
copy scripts\update.bat "%RELEASE_DIR%\scripts\" >nul
copy scripts\check-env.js "%RELEASE_DIR%\scripts\" >nul
echo [成功] 脚本文件已复制
echo [5/6] 复制配置示例...
if not exist "%RELEASE_DIR%\src\config" (
mkdir "%RELEASE_DIR%\src\config"
)
copy src\config\config.example.js "%RELEASE_DIR%\src\config\" >nul
echo [成功] 配置示例已复制
echo [6/6] 创建说明文件...
echo # BLS心跳接收端发布包 > "%RELEASE_DIR%\README.txt"
echo. >> "%RELEASE_DIR%\README.txt"
echo 版本: %VERSION% >> "%RELEASE_DIR%\README.txt"
echo 发布日期: %date% %time% >> "%RELEASE_DIR%\README.txt"
echo. >> "%RELEASE_DIR%\README.txt"
echo ## 快速部署指南 >> "%RELEASE_DIR%\README.txt"
echo. >> "%RELEASE_DIR%\README.txt"
echo 1. 将整个release文件夹复制到目标服务器 >> "%RELEASE_DIR%\README.txt"
echo 2. 进入项目目录: cd C:\BLS_Heartbeat_Server >> "%RELEASE_DIR%\README.txt"
echo 3. 运行部署脚本: scripts\deploy.bat >> "%RELEASE_DIR%\README.txt"
echo 4. 配置环境变量: 编辑.env文件 >> "%RELEASE_DIR%\README.txt"
echo 5. 服务将自动启动 >> "%RELEASE_DIR%\README.txt"
echo. >> "%RELEASE_DIR%\README.txt"
echo ## 文件说明 >> "%RELEASE_DIR%\README.txt"
echo - dist/: 构建后的应用程序文件 >> "%RELEASE_DIR%\README.txt"
echo - package.json: 项目依赖配置 >> "%RELEASE_DIR%\README.txt"
echo - ecosystem.config.js: PM2进程管理配置 >> "%RELEASE_DIR%\README.txt"
echo - .env.example: 环境变量配置示例 >> "%RELEASE_DIR%\README.txt"
echo - scripts/: 部署和更新脚本 >> "%RELEASE_DIR%\README.txt"
echo - src/config/config.example.js: 配置文件示例 >> "%RELEASE_DIR%\README.txt"
echo. >> "%RELEASE_DIR%\README.txt"
echo ## 常用命令 >> "%RELEASE_DIR%\README.txt"
echo - 首次部署: scripts\deploy.bat >> "%RELEASE_DIR%\README.txt"
echo - 更新部署: scripts\update.bat >> "%RELEASE_DIR%\README.txt"
echo - 查看状态: pm2 status >> "%RELEASE_DIR%\README.txt"
echo - 查看日志: pm2 logs web-bls-heartbeat-server >> "%RELEASE_DIR%\README.txt"
echo - 重启服务: pm2 restart web-bls-heartbeat-server >> "%RELEASE_DIR%\README.txt"
echo. >> "%RELEASE_DIR%\README.txt"
echo 详细文档请参考 docs/deployment.md >> "%RELEASE_DIR%\README.txt"
echo [成功] 说明文件已创建
echo ========================================
echo 打包完成!
echo ========================================
echo.
echo 发布目录: %RELEASE_DIR%
echo 发布包内容:
dir /b "%RELEASE_DIR%"
echo.
echo 复制整个 %RELEASE_DIR% 文件夹到目标服务器即可
echo.
pause

91
scripts/update.bat Normal file
View File

@@ -0,0 +1,91 @@
@echo off
chcp 65001 >nul
echo ========================================
echo BLS心跳接收端更新脚本
echo ========================================
setlocal enabledelayedexpansion
:: 检查服务是否运行
echo [1/6] 检查服务状态...
pm2 describe web-bls-heartbeat-server >nul 2>&1
if errorlevel 1 (
echo [警告] 服务未运行,跳过停止步骤
) else (
echo [信息] 停止服务...
pm2 stop web-bls-heartbeat-server
if errorlevel 1 (
echo [错误] 服务停止失败
pause
exit /b 1
)
)
:: 备份当前版本
echo [2/6] 备份当前版本...
if exist "dist" (
if exist "dist_backup" (
rmdir /s /q dist_backup
)
xcopy /E /I /Y dist dist_backup >nul
echo [成功] 当前版本已备份到dist_backup目录
) else (
echo [警告] 未找到dist目录跳过备份
)
:: 更新依赖
echo [3/6] 更新项目依赖...
call npm install --production
if errorlevel 1 (
echo [错误] 依赖更新失败
pause
exit /b 1
)
:: 检查构建文件
echo [4/6] 检查构建文件...
if not exist "dist\index.es.js" (
echo [错误] 未找到构建文件请确保已上传新版本的dist目录
pause
exit /b 1
)
echo [成功] 构建文件检查通过
:: 更新数据库(如果需要)
echo [5/6] 更新数据库...
echo [信息] 运行数据库更新脚本...
call npm run db:apply
if errorlevel 1 (
echo [警告] 数据库更新失败,请检查数据库连接配置
echo [提示] 可以稍后手动运行: npm run db:apply
) else (
echo [成功] 数据库更新完成
)
:: 启动服务
echo [6/6] 启动服务...
pm2 start ecosystem.config.cjs
if errorlevel 1 (
echo [错误] 服务启动失败
pause
exit /b 1
)
:: 显示服务状态
echo ========================================
echo 服务状态
echo ========================================
pm2 status
echo ========================================
echo 更新完成!
echo ========================================
echo.
echo 常用命令:
echo 查看状态: pm2 status
echo 查看日志: pm2 logs web-bls-heartbeat-server
echo 重启服务: pm2 restart web-bls-heartbeat-server
echo 停止服务: pm2 stop web-bls-heartbeat-server
echo 实时监控: pm2 monit
echo.
pause