feat: push-based monitoring with remote agent
- Add database migration 006 for agent_key, agent_installed, agent_install_path, agent_last_seen_at columns - Add Server model methods: findByAgentKey, generateAgentKey, regenerateAgentKey, updateAgentLastSeen, setAgentInstalled - Auto-generate agent_key on server creation - Create AgentService for SSH-based install/uninstall of remote agent - Create bin/agent.sh - bash agent script for remote servers - Create install/agent-install.sh and install/agent-uninstall.sh - Create install/servermanager-agent.service systemd unit - Add POST /api/metrics/push endpoint (auth via agent_key) - Add web routes for agent install/uninstall/regenerate-key - Add agent status section to server detail view with install/uninstall modals - Make MonitoringService::saveMetrics() public for reuse
This commit is contained in:
@@ -114,6 +114,8 @@ class ApiController
|
||||
$monitoringService = new MonitoringService();
|
||||
$metrics = $monitoringService->getLatestMetrics($id);
|
||||
|
||||
unset($server['agent_key'], $server['ssh_password'], $server['ssh_key']);
|
||||
|
||||
$this->view->json([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
@@ -296,6 +298,43 @@ class ApiController
|
||||
]);
|
||||
}
|
||||
|
||||
public function pushMetrics(): void
|
||||
{
|
||||
$input = json_decode(file_get_contents('php://input'), true);
|
||||
|
||||
if (!$input || empty($input['agent_key'])) {
|
||||
$this->view->json(['error' => 'agent_key is required'], 401);
|
||||
}
|
||||
|
||||
$serverModel = new Server();
|
||||
$server = $serverModel->findByAgentKey($input['agent_key']);
|
||||
|
||||
if (!$server || !$server['is_active']) {
|
||||
$this->view->json(['error' => 'Invalid agent key'], 401);
|
||||
}
|
||||
|
||||
$cpu = isset($input['cpu']) ? max(0, min(100, (float) $input['cpu'])) : 0;
|
||||
$ram = isset($input['ram']) ? max(0, min(100, (float) $input['ram'])) : 0;
|
||||
$disk = isset($input['disk']) ? max(0, min(100, (float) $input['disk'])) : 0;
|
||||
$load = (float) ($input['load'] ?? 0);
|
||||
$uptime = (string) ($input['uptime'] ?? '');
|
||||
|
||||
$monitoring = new MonitoringService();
|
||||
$monitoring->saveMetrics([
|
||||
'server_id' => (int) $server['id'],
|
||||
'status' => 'online',
|
||||
'cpu_usage' => $cpu,
|
||||
'ram_usage' => $ram,
|
||||
'disk_usage' => $disk,
|
||||
'load_average' => $load,
|
||||
'uptime' => $uptime,
|
||||
]);
|
||||
|
||||
$serverModel->updateAgentLastSeen((int) $server['id']);
|
||||
|
||||
$this->view->json(['success' => true]);
|
||||
}
|
||||
|
||||
public function refreshAllMetrics(): void
|
||||
{
|
||||
$user = $this->authenticateRequest();
|
||||
|
||||
Reference in New Issue
Block a user