@devskeo/ward-agent 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/cli/config.d.ts +2 -0
  2. package/dist/cli/config.d.ts.map +1 -0
  3. package/dist/cli/config.js +30 -0
  4. package/dist/cli/config.js.map +1 -0
  5. package/dist/cli/pipe.d.ts +2 -0
  6. package/dist/cli/pipe.d.ts.map +1 -0
  7. package/dist/cli/pipe.js +53 -0
  8. package/dist/cli/pipe.js.map +1 -0
  9. package/dist/cli/service.d.ts +10 -0
  10. package/dist/cli/service.d.ts.map +1 -0
  11. package/dist/cli/service.js +134 -0
  12. package/dist/cli/service.js.map +1 -0
  13. package/dist/cli/start.d.ts +6 -0
  14. package/dist/cli/start.d.ts.map +1 -0
  15. package/dist/cli/start.js +160 -0
  16. package/dist/cli/start.js.map +1 -0
  17. package/dist/cli/status.d.ts +2 -0
  18. package/dist/cli/status.d.ts.map +1 -0
  19. package/dist/cli/status.js +56 -0
  20. package/dist/cli/status.js.map +1 -0
  21. package/dist/cli/stop.d.ts +2 -0
  22. package/dist/cli/stop.d.ts.map +1 -0
  23. package/dist/cli/stop.js +106 -0
  24. package/dist/cli/stop.js.map +1 -0
  25. package/dist/cli/systemd.d.ts +3 -0
  26. package/dist/cli/systemd.d.ts.map +1 -0
  27. package/dist/cli/systemd.js +84 -0
  28. package/dist/cli/systemd.js.map +1 -0
  29. package/dist/config/AgentConfig.d.ts +30 -0
  30. package/dist/config/AgentConfig.d.ts.map +1 -0
  31. package/dist/config/AgentConfig.js +155 -0
  32. package/dist/config/AgentConfig.js.map +1 -0
  33. package/dist/config/ServiceConfig.d.ts +30 -0
  34. package/dist/config/ServiceConfig.d.ts.map +1 -0
  35. package/dist/config/ServiceConfig.js +4 -0
  36. package/dist/config/ServiceConfig.js.map +1 -0
  37. package/dist/daemon.d.ts +2 -0
  38. package/dist/daemon.d.ts.map +1 -0
  39. package/dist/daemon.js +300 -0
  40. package/dist/daemon.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +94 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/logs/LogForwarder.d.ts +22 -0
  46. package/dist/logs/LogForwarder.d.ts.map +1 -0
  47. package/dist/logs/LogForwarder.js +83 -0
  48. package/dist/logs/LogForwarder.js.map +1 -0
  49. package/dist/logs/LogWatcher.d.ts +15 -0
  50. package/dist/logs/LogWatcher.d.ts.map +1 -0
  51. package/dist/logs/LogWatcher.js +111 -0
  52. package/dist/logs/LogWatcher.js.map +1 -0
  53. package/dist/logs/ServiceWatcher.d.ts +32 -0
  54. package/dist/logs/ServiceWatcher.d.ts.map +1 -0
  55. package/dist/logs/ServiceWatcher.js +294 -0
  56. package/dist/logs/ServiceWatcher.js.map +1 -0
  57. package/dist/metrics/CpuCollector.d.ts +9 -0
  58. package/dist/metrics/CpuCollector.d.ts.map +1 -0
  59. package/dist/metrics/CpuCollector.js +24 -0
  60. package/dist/metrics/CpuCollector.js.map +1 -0
  61. package/dist/metrics/DiskCollector.d.ts +11 -0
  62. package/dist/metrics/DiskCollector.d.ts.map +1 -0
  63. package/dist/metrics/DiskCollector.js +51 -0
  64. package/dist/metrics/DiskCollector.js.map +1 -0
  65. package/dist/metrics/IpCollector.d.ts +13 -0
  66. package/dist/metrics/IpCollector.d.ts.map +1 -0
  67. package/dist/metrics/IpCollector.js +34 -0
  68. package/dist/metrics/IpCollector.js.map +1 -0
  69. package/dist/metrics/MemoryCollector.d.ts +12 -0
  70. package/dist/metrics/MemoryCollector.d.ts.map +1 -0
  71. package/dist/metrics/MemoryCollector.js +27 -0
  72. package/dist/metrics/MemoryCollector.js.map +1 -0
  73. package/dist/metrics/NetworkCollector.d.ts +9 -0
  74. package/dist/metrics/NetworkCollector.d.ts.map +1 -0
  75. package/dist/metrics/NetworkCollector.js +24 -0
  76. package/dist/metrics/NetworkCollector.js.map +1 -0
  77. package/dist/metrics/ProcessCollector.d.ts +16 -0
  78. package/dist/metrics/ProcessCollector.d.ts.map +1 -0
  79. package/dist/metrics/ProcessCollector.js +34 -0
  80. package/dist/metrics/ProcessCollector.js.map +1 -0
  81. package/dist/start-dev.d.ts +2 -0
  82. package/dist/start-dev.d.ts.map +1 -0
  83. package/dist/start-dev.js +205 -0
  84. package/dist/start-dev.js.map +1 -0
  85. package/dist/start-self.d.ts +2 -0
  86. package/dist/start-self.d.ts.map +1 -0
  87. package/dist/start-self.js +271 -0
  88. package/dist/start-self.js.map +1 -0
  89. package/dist/transport/HttpClient.d.ts +53 -0
  90. package/dist/transport/HttpClient.d.ts.map +1 -0
  91. package/dist/transport/HttpClient.js +172 -0
  92. package/dist/transport/HttpClient.js.map +1 -0
  93. package/dist/transport/Queue.d.ts +29 -0
  94. package/dist/transport/Queue.d.ts.map +1 -0
  95. package/dist/transport/Queue.js +74 -0
  96. package/dist/transport/Queue.js.map +1 -0
  97. package/dist/transport/ReconnectManager.d.ts +14 -0
  98. package/dist/transport/ReconnectManager.d.ts.map +1 -0
  99. package/dist/transport/ReconnectManager.js +59 -0
  100. package/dist/transport/ReconnectManager.js.map +1 -0
  101. package/dist/types/index.d.ts +35 -0
  102. package/dist/types/index.d.ts.map +1 -0
  103. package/dist/types/index.js +3 -0
  104. package/dist/types/index.js.map +1 -0
  105. package/package.json +41 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=start-dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-dev.d.ts","sourceRoot":"","sources":["../src/start-dev.ts"],"names":[],"mappings":""}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ // 개발 모드 에이전트: Ward dev 서버를 직접 시작·감시하고 메트릭/로그를 대시보드에 전송
40
+ const os = __importStar(require("os"));
41
+ const path = __importStar(require("path"));
42
+ const pidusage_1 = __importDefault(require("pidusage"));
43
+ const AgentConfig_js_1 = require("./config/AgentConfig.js");
44
+ const HttpClient_js_1 = require("./transport/HttpClient.js");
45
+ const ReconnectManager_js_1 = require("./transport/ReconnectManager.js");
46
+ const Queue_js_1 = require("./transport/Queue.js");
47
+ const ServiceWatcher_js_1 = require("./logs/ServiceWatcher.js");
48
+ const LogForwarder_js_1 = require("./logs/LogForwarder.js");
49
+ const CpuCollector_js_1 = require("./metrics/CpuCollector.js");
50
+ const MemoryCollector_js_1 = require("./metrics/MemoryCollector.js");
51
+ const DiskCollector_js_1 = require("./metrics/DiskCollector.js");
52
+ const NetworkCollector_js_1 = require("./metrics/NetworkCollector.js");
53
+ const ProcessCollector_js_1 = require("./metrics/ProcessCollector.js");
54
+ const IpCollector_js_1 = require("./metrics/IpCollector.js");
55
+ const SERVER_URL = process.env['AGENT_SERVER_URL'] ?? 'http://localhost:4000';
56
+ const GROUP_NAME = process.env['AGENT_GROUP_NAME'] ?? 'ward-dev';
57
+ const METRICS_INTERVAL = parseInt(process.env['AGENT_METRICS_INTERVAL'] ?? '15', 10);
58
+ const HOSTNAME = os.hostname();
59
+ const MAX_RETRIES = 60;
60
+ const RETRY_INTERVAL_MS = 3000;
61
+ // 서버 소스 경로 (packages/agent/src → packages/server/src)
62
+ const serverEntry = path.resolve(__dirname, '../../server/src/index.ts');
63
+ async function registerWithRetry(client) {
64
+ for (let i = 0; i < MAX_RETRIES; i++) {
65
+ try {
66
+ const result = await client.register(HOSTNAME, GROUP_NAME);
67
+ console.log(`[dev-agent] 서버 등록 완료 (serverId: ${result.serverId})`);
68
+ return result.serverId;
69
+ }
70
+ catch {
71
+ if (i % 5 === 0)
72
+ console.log(`[dev-agent] 서버 연결 대기 중... (${i + 1}/${MAX_RETRIES})`);
73
+ await new Promise((r) => setTimeout(r, RETRY_INTERVAL_MS));
74
+ }
75
+ }
76
+ throw new Error('[dev-agent] 서버 등록 실패: 서버가 응답하지 않습니다.');
77
+ }
78
+ async function main() {
79
+ console.log(`[dev-agent] Ward 개발 모드 에이전트 시작 (서버: ${SERVER_URL})`);
80
+ // ServiceWatcher로 Ward dev 서버 시작 (tsx watch → 파일 변경 시 자동 재시작)
81
+ const serviceWatcher = new ServiceWatcher_js_1.ServiceWatcher();
82
+ serviceWatcher.watch({
83
+ name: 'ward-server',
84
+ method: 'exec',
85
+ command: `tsx watch ${serverEntry}`,
86
+ restartDelay: 2000,
87
+ });
88
+ console.log('[dev-agent] Ward dev 서버 시작 중...');
89
+ // 서버 부팅 대기 후 등록
90
+ const tempClient = new HttpClient_js_1.HttpClient({ serverUrl: SERVER_URL, serverId: '' });
91
+ const serverId = await registerWithRetry(tempClient);
92
+ (0, AgentConfig_js_1.saveState)({ serverId, serverUrl: SERVER_URL, hostname: HOSTNAME });
93
+ const httpClient = new HttpClient_js_1.HttpClient({ serverUrl: SERVER_URL, serverId });
94
+ const queue = new Queue_js_1.Queue({ maxSize: 1000, maxRetries: 3 });
95
+ // ward-server 서비스를 DB에 등록 (서비스 탭에 표시되도록)
96
+ await httpClient.syncServices([{
97
+ name: 'ward-server',
98
+ type: 'exec',
99
+ config: { name: 'ward-server', method: 'exec', command: `tsx watch ${serverEntry}` },
100
+ status: 'running',
101
+ }]).catch((err) => console.warn('[dev-agent] 서비스 동기화 실패:', err.message));
102
+ // 로그 포워더: 서버 stdout/stderr → 대시보드
103
+ const logForwarder = new LogForwarder_js_1.LogForwarder({ client: httpClient });
104
+ serviceWatcher.on('line', (source, line) => {
105
+ logForwarder.addLog(source, line);
106
+ });
107
+ logForwarder.start();
108
+ const cpuCollector = new CpuCollector_js_1.CpuCollector();
109
+ const memoryCollector = new MemoryCollector_js_1.MemoryCollector();
110
+ const diskCollector = new DiskCollector_js_1.DiskCollector();
111
+ const networkCollector = new NetworkCollector_js_1.NetworkCollector();
112
+ const processCollector = new ProcessCollector_js_1.ProcessCollector();
113
+ const ipCollector = new IpCollector_js_1.IpCollector();
114
+ const reconnectManager = new ReconnectManager_js_1.ReconnectManager(async () => {
115
+ const ipInfo = await ipCollector.collect();
116
+ await httpClient.sendHeartbeat({ sentAt: new Date().toISOString(), hostname: HOSTNAME, ipInfo });
117
+ });
118
+ async function collectAndSend() {
119
+ try {
120
+ const [cpu, memory, disk, network, processes] = await Promise.all([
121
+ cpuCollector.collect(),
122
+ memoryCollector.collect(),
123
+ diskCollector.collect(),
124
+ networkCollector.collect(),
125
+ processCollector.collect(),
126
+ ]);
127
+ const payload = {
128
+ collectedAt: new Date().toISOString(),
129
+ cpu, memory, disk, network,
130
+ processes: processes.processes,
131
+ };
132
+ const result = await httpClient.sendMetrics(payload);
133
+ reconnectManager.reportResult(result);
134
+ if (!result.success)
135
+ queue.enqueue('/api/agent/metrics', payload);
136
+ }
137
+ catch (err) {
138
+ console.error('[dev-agent] 메트릭 수집 오류:', err);
139
+ }
140
+ }
141
+ async function sendHeartbeat() {
142
+ try {
143
+ const ipInfo = await ipCollector.collect();
144
+ const statusInfo = serviceWatcher.getServiceStatus('ward-server');
145
+ let cpuUsage;
146
+ let memUsage;
147
+ if (statusInfo.pid) {
148
+ try {
149
+ const stats = await (0, pidusage_1.default)(statusInfo.pid);
150
+ cpuUsage = stats.cpu;
151
+ memUsage = stats.memory;
152
+ }
153
+ catch { /* 무시 */ }
154
+ }
155
+ const result = await httpClient.sendHeartbeat({
156
+ sentAt: new Date().toISOString(),
157
+ hostname: HOSTNAME,
158
+ ipInfo,
159
+ services: [{
160
+ name: 'ward-server',
161
+ status: statusInfo.status,
162
+ pid: statusInfo.pid,
163
+ restartCount: statusInfo.restartCount,
164
+ startedAt: statusInfo.startedAt?.toISOString(),
165
+ cpuUsage,
166
+ memUsage,
167
+ }],
168
+ });
169
+ reconnectManager.reportResult(result);
170
+ if (result.success && result.commands && result.commands.length > 0) {
171
+ for (const cmd of result.commands) {
172
+ console.log(`[dev-agent] 명령 수신: ${cmd.serviceName} → ${cmd.action}`);
173
+ if (cmd.action === 'restart') {
174
+ serviceWatcher.restart(cmd.serviceName);
175
+ console.log(`[dev-agent] 서비스 재시작: ${cmd.serviceName}`);
176
+ }
177
+ }
178
+ }
179
+ }
180
+ catch (err) {
181
+ console.error('[dev-agent] Heartbeat 오류:', err);
182
+ }
183
+ }
184
+ await collectAndSend();
185
+ await sendHeartbeat();
186
+ const metricsTimer = setInterval(collectAndSend, METRICS_INTERVAL * 1000);
187
+ const heartbeatTimer = setInterval(sendHeartbeat, 30 * 1000);
188
+ console.log(`[dev-agent] 모니터링 시작 (메트릭: ${METRICS_INTERVAL}초)`);
189
+ const shutdown = () => {
190
+ console.log('[dev-agent] 종료 중...');
191
+ clearInterval(metricsTimer);
192
+ clearInterval(heartbeatTimer);
193
+ reconnectManager.destroy();
194
+ serviceWatcher.unwatchAll();
195
+ void logForwarder.stop();
196
+ process.exit(0);
197
+ };
198
+ process.on('SIGTERM', shutdown);
199
+ process.on('SIGINT', shutdown);
200
+ }
201
+ main().catch((err) => {
202
+ console.error('[dev-agent] 시작 실패:', err);
203
+ process.exit(1);
204
+ });
205
+ //# sourceMappingURL=start-dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-dev.js","sourceRoot":"","sources":["../src/start-dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=start-self.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-self.d.ts","sourceRoot":"","sources":["../src/start-self.ts"],"names":[],"mappings":""}
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ // Ward self-monitoring: Ward 서버를 exec 서비스로 시작하고 메트릭/로그를 대시보드에 전송
40
+ const fs = __importStar(require("fs"));
41
+ const os = __importStar(require("os"));
42
+ const path = __importStar(require("path"));
43
+ const pidusage_1 = __importDefault(require("pidusage"));
44
+ const AgentConfig_js_1 = require("./config/AgentConfig.js");
45
+ const HttpClient_js_1 = require("./transport/HttpClient.js");
46
+ const ReconnectManager_js_1 = require("./transport/ReconnectManager.js");
47
+ const Queue_js_1 = require("./transport/Queue.js");
48
+ const ServiceWatcher_js_1 = require("./logs/ServiceWatcher.js");
49
+ const LogForwarder_js_1 = require("./logs/LogForwarder.js");
50
+ const CpuCollector_js_1 = require("./metrics/CpuCollector.js");
51
+ const MemoryCollector_js_1 = require("./metrics/MemoryCollector.js");
52
+ const DiskCollector_js_1 = require("./metrics/DiskCollector.js");
53
+ const NetworkCollector_js_1 = require("./metrics/NetworkCollector.js");
54
+ const ProcessCollector_js_1 = require("./metrics/ProcessCollector.js");
55
+ const IpCollector_js_1 = require("./metrics/IpCollector.js");
56
+ const SERVER_URL = process.env['AGENT_SERVER_URL'] ?? 'http://localhost:4000';
57
+ const GROUP_NAME = process.env['AGENT_GROUP_NAME'] ?? 'ward';
58
+ const METRICS_INTERVAL = parseInt(process.env['AGENT_METRICS_INTERVAL'] ?? '30', 10);
59
+ const HOSTNAME = os.hostname();
60
+ const RETRY_INTERVAL_MS = 3000;
61
+ const MAX_RETRIES = 60; // 최대 3분 대기
62
+ // Ward 서버 dist 경로 계산 (packages/agent/dist → packages/server/dist)
63
+ const serverDist = path.resolve(__dirname, '../../server/dist/index.js');
64
+ const WARD_SERVICES = [
65
+ {
66
+ name: 'ward-4000',
67
+ method: 'exec',
68
+ command: `node ${serverDist}`,
69
+ restartDelay: 3000,
70
+ env: { SERVER_PORT: '4000' },
71
+ },
72
+ {
73
+ name: 'ward-4001',
74
+ method: 'exec',
75
+ command: `node ${serverDist}`,
76
+ restartDelay: 3000,
77
+ env: { SERVER_PORT: '4001', WARD_LEADER: 'false' },
78
+ },
79
+ ];
80
+ async function registerWithRetry(client) {
81
+ for (let i = 0; i < MAX_RETRIES; i++) {
82
+ try {
83
+ const result = await client.register(HOSTNAME, GROUP_NAME);
84
+ console.log(`[에이전트] 서버 등록 완료 (serverId: ${result.serverId})`);
85
+ return result.serverId;
86
+ }
87
+ catch {
88
+ if (i < MAX_RETRIES - 1) {
89
+ if (i % 5 === 0)
90
+ console.log(`[에이전트] 서버 연결 대기 중... (${i + 1}/${MAX_RETRIES})`);
91
+ await new Promise((r) => setTimeout(r, RETRY_INTERVAL_MS));
92
+ }
93
+ }
94
+ }
95
+ console.warn('[에이전트] 서버 등록 실패. 빈 serverId로 계속합니다.');
96
+ return '';
97
+ }
98
+ async function main() {
99
+ // Ward 디렉토리 생성
100
+ const wardDir = (0, AgentConfig_js_1.getWardDir)();
101
+ if (!fs.existsSync(wardDir)) {
102
+ fs.mkdirSync(wardDir, { recursive: true });
103
+ }
104
+ // Ward 서버 exec 서비스 설정 저장
105
+ (0, AgentConfig_js_1.saveConfig)({
106
+ server: { url: SERVER_URL, groupName: GROUP_NAME },
107
+ metrics: { interval: METRICS_INTERVAL },
108
+ services: WARD_SERVICES.map(({ name, method, command, restartDelay }) => ({
109
+ name, method, command, restartDelay,
110
+ })),
111
+ });
112
+ // ServiceWatcher: Ward 서버 exec 서비스로 시작 (stdout/stderr 캡처)
113
+ const serviceWatcher = new ServiceWatcher_js_1.ServiceWatcher();
114
+ // 각 서비스를 환경변수와 함께 실행하기 위해 spawn 래핑
115
+ for (const svc of WARD_SERVICES) {
116
+ const envStr = Object.entries(svc.env)
117
+ .map(([k, v]) => `${k}=${v}`)
118
+ .join(' ');
119
+ const command = process.platform === 'win32'
120
+ ? `node ${serverDist}`
121
+ : `env ${envStr} node ${serverDist}`;
122
+ serviceWatcher.watch({
123
+ name: svc.name,
124
+ method: 'exec',
125
+ command,
126
+ restartDelay: svc.restartDelay,
127
+ });
128
+ }
129
+ console.log('[에이전트] Ward 서버 프로세스 시작 중...');
130
+ // 서버 부팅 대기 후 등록
131
+ const tempClient = new HttpClient_js_1.HttpClient({ serverUrl: SERVER_URL, serverId: '' });
132
+ const serverId = await registerWithRetry(tempClient);
133
+ (0, AgentConfig_js_1.saveState)({ serverId, serverUrl: SERVER_URL, hostname: HOSTNAME });
134
+ // 수집기 초기화
135
+ const cpuCollector = new CpuCollector_js_1.CpuCollector();
136
+ const memoryCollector = new MemoryCollector_js_1.MemoryCollector();
137
+ const diskCollector = new DiskCollector_js_1.DiskCollector();
138
+ const networkCollector = new NetworkCollector_js_1.NetworkCollector();
139
+ const processCollector = new ProcessCollector_js_1.ProcessCollector();
140
+ const ipCollector = new IpCollector_js_1.IpCollector();
141
+ const queue = new Queue_js_1.Queue({ maxSize: 1000, maxRetries: 3 });
142
+ const httpClient = new HttpClient_js_1.HttpClient({ serverUrl: SERVER_URL, serverId });
143
+ // ward-4000, ward-4001 서비스를 DB에 등록 (서비스 탭에 표시되도록)
144
+ await httpClient.syncServices(WARD_SERVICES.map(svc => ({
145
+ name: svc.name,
146
+ type: 'exec',
147
+ config: { name: svc.name, method: 'exec', command: svc.command },
148
+ status: 'running',
149
+ }))).catch((err) => console.warn('[에이전트] 서비스 동기화 실패:', err.message));
150
+ // 로그 포워더: ServiceWatcher 이벤트 → Ward 서버로 전송
151
+ const logForwarder = new LogForwarder_js_1.LogForwarder({ client: httpClient });
152
+ serviceWatcher.on('line', (source, line) => {
153
+ logForwarder.addLog(source, line);
154
+ });
155
+ logForwarder.start();
156
+ const reconnectManager = new ReconnectManager_js_1.ReconnectManager(async () => {
157
+ const ipInfo = await ipCollector.collect();
158
+ await httpClient.sendHeartbeat({
159
+ sentAt: new Date().toISOString(),
160
+ hostname: HOSTNAME,
161
+ ipInfo,
162
+ });
163
+ });
164
+ // 메트릭 수집 및 전송
165
+ async function collectAndSend() {
166
+ try {
167
+ const [cpu, memory, disk, network, processes] = await Promise.all([
168
+ cpuCollector.collect(),
169
+ memoryCollector.collect(),
170
+ diskCollector.collect(),
171
+ networkCollector.collect(),
172
+ processCollector.collect(),
173
+ ]);
174
+ const payload = {
175
+ collectedAt: new Date().toISOString(),
176
+ cpu, memory, disk, network,
177
+ processes: processes.processes, // 서버는 배열을 기대함
178
+ };
179
+ const result = await httpClient.sendMetrics(payload);
180
+ reconnectManager.reportResult(result);
181
+ if (!result.success) {
182
+ queue.enqueue('/api/agent/metrics', payload);
183
+ }
184
+ }
185
+ catch (err) {
186
+ console.error('[에이전트] 메트릭 수집 오류:', err);
187
+ }
188
+ }
189
+ // Heartbeat 전송
190
+ async function sendHeartbeat() {
191
+ try {
192
+ const ipInfo = await ipCollector.collect();
193
+ const serviceStatuses = await Promise.all(WARD_SERVICES.map(async (svc) => {
194
+ const statusInfo = serviceWatcher.getServiceStatus(svc.name);
195
+ let cpuUsage;
196
+ let memUsage;
197
+ if (statusInfo.pid) {
198
+ try {
199
+ const stats = await (0, pidusage_1.default)(statusInfo.pid);
200
+ cpuUsage = stats.cpu;
201
+ memUsage = stats.memory;
202
+ }
203
+ catch { /* 무시 */ }
204
+ }
205
+ return {
206
+ name: svc.name,
207
+ status: statusInfo.status,
208
+ pid: statusInfo.pid,
209
+ restartCount: statusInfo.restartCount,
210
+ startedAt: statusInfo.startedAt?.toISOString(),
211
+ cpuUsage,
212
+ memUsage,
213
+ };
214
+ }));
215
+ // 서비스 목록 주기적 재동기화 (syncServices 초기 실패 복구)
216
+ await httpClient.syncServices(WARD_SERVICES.map((svc, i) => ({
217
+ name: svc.name,
218
+ type: 'exec',
219
+ config: { name: svc.name, method: 'exec', command: svc.command },
220
+ status: (serviceStatuses[i]?.status ?? 'unknown'),
221
+ pid: serviceStatuses[i]?.pid,
222
+ restartCount: serviceStatuses[i]?.restartCount,
223
+ startedAt: serviceStatuses[i]?.startedAt,
224
+ cpuUsage: serviceStatuses[i]?.cpuUsage,
225
+ memUsage: serviceStatuses[i]?.memUsage,
226
+ }))).catch((err) => console.warn('[에이전트] 서비스 재동기화 실패:', err.message));
227
+ const result = await httpClient.sendHeartbeat({
228
+ sentAt: new Date().toISOString(),
229
+ hostname: HOSTNAME,
230
+ ipInfo,
231
+ services: serviceStatuses,
232
+ });
233
+ reconnectManager.reportResult(result);
234
+ if (result.success && result.commands && result.commands.length > 0) {
235
+ for (const cmd of result.commands) {
236
+ console.log(`[에이전트] 명령 수신: ${cmd.serviceName} → ${cmd.action}`);
237
+ if (cmd.action === 'restart') {
238
+ serviceWatcher.restart(cmd.serviceName);
239
+ console.log(`[에이전트] 서비스 재시작: ${cmd.serviceName}`);
240
+ }
241
+ }
242
+ }
243
+ }
244
+ catch (err) {
245
+ console.error('[에이전트] Heartbeat 오류:', err);
246
+ }
247
+ }
248
+ // 즉시 첫 실행
249
+ await collectAndSend();
250
+ await sendHeartbeat();
251
+ const metricsTimer = setInterval(collectAndSend, METRICS_INTERVAL * 1000);
252
+ const heartbeatTimer = setInterval(sendHeartbeat, 30 * 1000);
253
+ console.log(`[에이전트] 모니터링 시작 (메트릭: ${METRICS_INTERVAL}초, 서비스: ${WARD_SERVICES.map(s => s.name).join(', ')})`);
254
+ // 종료 처리
255
+ const shutdown = () => {
256
+ console.log('[에이전트] 종료 중...');
257
+ clearInterval(metricsTimer);
258
+ clearInterval(heartbeatTimer);
259
+ reconnectManager.destroy();
260
+ void logForwarder.stop();
261
+ // 자식 프로세스가 실제로 종료될 때까지 대기 후 종료
262
+ serviceWatcher.unwatchAllAndWait().then(() => process.exit(0));
263
+ };
264
+ process.on('SIGTERM', shutdown);
265
+ process.on('SIGINT', shutdown);
266
+ }
267
+ main().catch((err) => {
268
+ console.error('[에이전트] 시작 실패:', err);
269
+ process.exit(1);
270
+ });
271
+ //# sourceMappingURL=start-self.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-self.js","sourceRoot":"","sources":["../src/start-self.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export declare enum SendErrorType {
2
+ CONNECTION_REFUSED = "CONNECTION_REFUSED",// 서버 다운
3
+ TIMEOUT = "TIMEOUT",
4
+ HTTP_ERROR = "HTTP_ERROR",
5
+ UNKNOWN = "UNKNOWN"
6
+ }
7
+ export interface HttpClientOptions {
8
+ serverUrl: string;
9
+ serverId: string;
10
+ timeoutMs?: number;
11
+ }
12
+ export interface SendResult {
13
+ success: boolean;
14
+ statusCode?: number;
15
+ error?: string;
16
+ errorType?: SendErrorType;
17
+ }
18
+ export declare class HttpClient {
19
+ private readonly serverUrl;
20
+ private readonly serverId;
21
+ private readonly timeoutMs;
22
+ constructor(options: HttpClientOptions);
23
+ private classifyError;
24
+ post(path: string, body: unknown): Promise<SendResult>;
25
+ register(hostname: string, groupName?: string, osInfo?: {
26
+ osName?: string;
27
+ osVersion?: string;
28
+ arch?: string;
29
+ }): Promise<{
30
+ serverId: string;
31
+ }>;
32
+ unregister(): Promise<SendResult>;
33
+ sendMetrics(metrics: unknown): Promise<SendResult>;
34
+ sendHeartbeat(data: unknown): Promise<SendResult & {
35
+ commands?: Array<{
36
+ id: string;
37
+ serviceName: string;
38
+ action: string;
39
+ }>;
40
+ }>;
41
+ syncServices(services: Array<{
42
+ name: string;
43
+ type: string;
44
+ config: object;
45
+ status: string;
46
+ pid?: number;
47
+ restartCount?: number;
48
+ startedAt?: string;
49
+ cpuUsage?: number;
50
+ memUsage?: number;
51
+ }>): Promise<SendResult>;
52
+ }
53
+ //# sourceMappingURL=HttpClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HttpClient.d.ts","sourceRoot":"","sources":["../../src/transport/HttpClient.ts"],"names":[],"mappings":"AAEA,oBAAY,aAAa;IACvB,kBAAkB,uBAAuB,CAAG,QAAQ;IACpD,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAGD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,iBAAiB;IAOtC,OAAO,CAAC,aAAa;IAef,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAoCtD,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9D,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAyB1B,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;IAmCjC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAKlD,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,GAAG;QAAE,QAAQ,CAAC,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAqC7H,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC;QACjC,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CAGzB"}