guanghulab/server/age-os/ecosystem.config.js
2026-05-10 13:12:44 +08:00

78 lines
2.0 KiB
JavaScript

/**
* PM2 配置 · AGE OS 进程管理
* 铸渊 · ICE-GL-ZY001
*/
const path = require('path');
const fs = require('fs');
// 读取 .env.mcp 环境变量
function loadEnvFile(envPath) {
const env = {};
try {
const content = fs.readFileSync(envPath, 'utf8');
for (const line of content.split('\n')) {
const trimmed = line.trim();
if (!trimmed || trimmed.startsWith('#')) continue;
const eqIdx = trimmed.indexOf('=');
if (eqIdx > 0) {
env[trimmed.slice(0, eqIdx)] = trimmed.slice(eqIdx + 1);
}
}
} catch (err) {
if (err.code !== 'ENOENT') {
console.error(`[PM2] .env.mcp 读取错误: ${err.message}`);
}
}
return env;
}
const envFromFile = loadEnvFile(path.join(__dirname, '.env.mcp'));
module.exports = {
apps: [
{
name: 'age-os-mcp',
script: 'mcp-server/server.js',
cwd: '/opt/age-os',
env: {
NODE_ENV: 'production',
MCP_PORT: 3100,
MCP_BIND_HOST: '127.0.0.1',
...envFromFile
},
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '256M',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
error_file: '/opt/age-os/logs/mcp-error.log',
out_file: '/opt/age-os/logs/mcp-out.log',
merge_logs: true,
// 重启策略:指数退避 + 限制重启次数,防止崩溃→重启死循环
exp_backoff_restart_delay: 100,
max_restarts: 15,
restart_delay: 3000
},
{
name: 'age-os-agents',
script: 'agents/scheduler.js',
cwd: '/opt/age-os',
env: {
NODE_ENV: 'production',
...envFromFile
},
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '256M',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
error_file: '/opt/age-os/logs/agents-error.log',
out_file: '/opt/age-os/logs/agents-out.log',
merge_logs: true,
exp_backoff_restart_delay: 100,
max_restarts: 15,
restart_delay: 3000
}
]
};