81 lines
2.4 KiB
JavaScript
81 lines
2.4 KiB
JavaScript
/**
|
||
* GLADA · PM2 生态系统配置 · ecosystem.config.js
|
||
*
|
||
* 使用:pm2 start glada/ecosystem.config.js
|
||
*
|
||
* 版权:国作登字-2026-A-00037559
|
||
* 签发:铸渊 · ICE-GL-ZY001
|
||
*/
|
||
|
||
const fs = require('fs');
|
||
const path = require('path');
|
||
|
||
/**
|
||
* 加载 .env 文件(复用 cn-llm-relay 的成熟模式)
|
||
* 优先级:.env.glada → 仓库根 .env → 服务器部署 .env.app
|
||
*/
|
||
function loadEnvFile(filePath) {
|
||
const env = {};
|
||
try {
|
||
if (fs.existsSync(filePath)) {
|
||
const lines = fs.readFileSync(filePath, 'utf-8').split('\n');
|
||
for (const line of lines) {
|
||
const trimmed = line.trim();
|
||
if (!trimmed || trimmed.startsWith('#')) continue;
|
||
const idx = trimmed.indexOf('=');
|
||
if (idx > 0) {
|
||
env[trimmed.substring(0, idx).trim()] = trimmed.substring(idx + 1).trim();
|
||
}
|
||
}
|
||
}
|
||
} catch (e) {
|
||
console.error(`[GLADA-PM2] 加载环境变量失败: ${e.message}`);
|
||
}
|
||
return env;
|
||
}
|
||
|
||
// 环境变量加载链(后面的覆盖前面的)
|
||
const envChain = [
|
||
path.join(__dirname, '..', '.env'), // 仓库根 .env
|
||
path.join(__dirname, '..', '.env.app'), // 服务器部署 .env.app
|
||
path.join(__dirname, '.env.glada'), // GLADA 专属 .env
|
||
];
|
||
|
||
let mergedEnv = {};
|
||
for (const envFile of envChain) {
|
||
Object.assign(mergedEnv, loadEnvFile(envFile));
|
||
}
|
||
|
||
module.exports = {
|
||
apps: [{
|
||
name: 'glada-agent',
|
||
script: 'service.js', // 直接启动service.js(web-extensions已内置加载)
|
||
cwd: __dirname,
|
||
instances: 1,
|
||
exec_mode: 'fork', // fork模式,避免cluster模式的兼容问题
|
||
autorestart: true,
|
||
watch: false,
|
||
env: {
|
||
NODE_ENV: 'production',
|
||
PORT: 3900,
|
||
GLADA_PORT: 3900,
|
||
GLADA_POLL_INTERVAL: 30000,
|
||
GLADA_MODEL: 'deepseek-v3', // PoloAPI 默认模型
|
||
GLADA_MODEL_PREFERENCE: '', // 空 = 让 model-router 自动选择
|
||
GLADA_MODEL_REFRESH_MS: 600000, // 模型列表刷新间隔(10分钟)
|
||
GLADA_STOP_ON_FAILURE: 'true',
|
||
// 从 .env 文件链加载 LLM 密钥(部署时由 workflow 写入)
|
||
...mergedEnv
|
||
},
|
||
max_memory_restart: '512M',
|
||
log_date_format: 'YYYY-MM-DD HH:mm:ss',
|
||
error_file: '/var/log/glada/error.log',
|
||
out_file: '/var/log/glada/out.log',
|
||
merge_logs: true,
|
||
// 重启策略
|
||
exp_backoff_restart_delay: 100,
|
||
max_restarts: 10,
|
||
restart_delay: 5000
|
||
}]
|
||
};
|