BIG_UPDATE deleted vps, added s3 infrastructure.
This commit is contained in:
308
ospabhost/METRICS_GUIDE.md
Normal file
308
ospabhost/METRICS_GUIDE.md
Normal file
@@ -0,0 +1,308 @@
|
||||
# Система статистики и мониторинга серверов
|
||||
|
||||
## 📊 Что добавлено
|
||||
|
||||
### Backend (API):
|
||||
|
||||
1. **Новая модель Prisma**: `ServerMetric`
|
||||
- Хранит историю метрик каждого сервера
|
||||
- Поля: CPU, Memory, Disk, Network, Status, Uptime
|
||||
- Автоматическое удаление при удалении сервера (CASCADE)
|
||||
|
||||
2. **3 новых API endpoint'а**:
|
||||
- `GET /api/server/:id/metrics` - Получить текущие метрики (+ сохранение в БД)
|
||||
- `GET /api/server/:id/metrics/history?period=24h` - История за период (1h, 6h, 24h, 7d, 30d)
|
||||
- `GET /api/server/:id/metrics/summary` - Сводка за 24 часа (средние, макс, мин)
|
||||
|
||||
3. **Автоматическое сохранение**:
|
||||
- При каждом запросе текущих метрик данные сохраняются в БД
|
||||
- Создаётся точка для графиков
|
||||
|
||||
### Frontend (React):
|
||||
|
||||
1. **Компонент `ServerMetrics.tsx`**:
|
||||
- 4 карточки с текущими показателями (CPU, RAM, Disk, Network)
|
||||
- Цветовая индикация нагрузки (зелёный/жёлтый/красный)
|
||||
- Фильтр периода (1 час, 6 часов, 24 часа, 7 дней, 30 дней)
|
||||
- 3 интерактивных графика (Recharts):
|
||||
- CPU Usage (Area Chart)
|
||||
- Memory + Disk (Line Chart)
|
||||
- Network Traffic (Area Chart)
|
||||
- Автообновление каждую минуту
|
||||
|
||||
2. **Интеграция**:
|
||||
- Встроен в панель управления сервером
|
||||
- Вкладка "Мониторинг" теперь показывает реальные данные
|
||||
|
||||
## 🚀 Установка
|
||||
|
||||
### 1. SQL миграция:
|
||||
```bash
|
||||
cd /var/www/ospab-host/backend
|
||||
mysql -u root -p ospabhost < prisma/migrations/add_server_metrics.sql
|
||||
```
|
||||
|
||||
### 2. Обновление Prisma:
|
||||
```bash
|
||||
cd /var/www/ospab-host/backend
|
||||
npx prisma generate
|
||||
```
|
||||
|
||||
### 3. Сборка backend:
|
||||
```bash
|
||||
npm run build
|
||||
pm2 restart ospab-backend
|
||||
```
|
||||
|
||||
### 4. Сборка frontend:
|
||||
```bash
|
||||
cd /var/www/ospab-host/frontend
|
||||
npm install recharts
|
||||
npm run build
|
||||
# Деплой dist/
|
||||
```
|
||||
|
||||
## 📈 Как работает
|
||||
|
||||
### Сбор данных:
|
||||
1. Frontend запрашивает `/api/server/:id/metrics`
|
||||
2. Backend получает данные от Proxmox API
|
||||
3. Данные сохраняются в таблицу `server_metrics`
|
||||
4. Возвращаются пользователю
|
||||
|
||||
### Графики:
|
||||
1. Frontend запрашивает историю за период
|
||||
2. Backend агрегирует данные с интервалами:
|
||||
- 1h → каждую минуту
|
||||
- 6h → каждые 5 минут
|
||||
- 24h → каждые 15 минут
|
||||
- 7d → каждый час
|
||||
- 30d → каждые 6 часов
|
||||
3. Recharts строит интерактивные графики
|
||||
|
||||
### Автоочистка (рекомендуется):
|
||||
Добавьте cron-задачу для удаления старых метрик:
|
||||
```sql
|
||||
-- Удалять метрики старше 30 дней
|
||||
DELETE FROM server_metrics WHERE timestamp < DATE_SUB(NOW(), INTERVAL 30 DAY);
|
||||
```
|
||||
|
||||
Или в crontab:
|
||||
```bash
|
||||
0 2 * * * mysql -u root -pПАРОЛЬ ospabhost -e "DELETE FROM server_metrics WHERE timestamp < DATE_SUB(NOW(), INTERVAL 30 DAY);"
|
||||
```
|
||||
|
||||
## 🎨 Внешний вид
|
||||
|
||||
### Карточки метрик:
|
||||
- **CPU**: Процент загрузки с цветовой индикацией
|
||||
- **Память**: Процент + используемый объём / всего
|
||||
- **Диск**: Процент + используемый объём / всего
|
||||
- **Сеть**: Входящий/исходящий трафик + Uptime
|
||||
|
||||
### Графики:
|
||||
- **CPU**: Плавная заливка оранжевым
|
||||
- **Memory/Disk**: Двойной линейный график (синий/зелёный)
|
||||
- **Network**: Двойная заливка (фиолетовый/розовый)
|
||||
|
||||
## 🔧 API примеры
|
||||
|
||||
### Получить текущие метрики:
|
||||
```bash
|
||||
curl -H "Authorization: Bearer TOKEN" \
|
||||
http://localhost:5000/api/server/1/metrics
|
||||
```
|
||||
|
||||
Ответ:
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"data": {
|
||||
"vmid": 105,
|
||||
"status": "running",
|
||||
"uptime": 3600,
|
||||
"cpu": 0.15,
|
||||
"memory": {
|
||||
"used": 536870912,
|
||||
"max": 1073741824,
|
||||
"usage": 50.0
|
||||
},
|
||||
"disk": {
|
||||
"used": 2147483648,
|
||||
"max": 10737418240,
|
||||
"usage": 20.0
|
||||
},
|
||||
"network": {
|
||||
"in": 1048576,
|
||||
"out": 524288
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Получить историю:
|
||||
```bash
|
||||
curl -H "Authorization: Bearer TOKEN" \
|
||||
"http://localhost:5000/api/server/1/metrics/history?period=24h"
|
||||
```
|
||||
|
||||
Ответ:
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"period": "24h",
|
||||
"data": [
|
||||
{
|
||||
"timestamp": "2025-11-01T10:00:00.000Z",
|
||||
"cpuUsage": 15.2,
|
||||
"memoryUsage": 48.5,
|
||||
"diskUsage": 20.1,
|
||||
"networkIn": 1048576,
|
||||
"networkOut": 524288,
|
||||
"status": "running"
|
||||
}
|
||||
],
|
||||
"total": 96
|
||||
}
|
||||
```
|
||||
|
||||
### Получить сводку:
|
||||
```bash
|
||||
curl -H "Authorization: Bearer TOKEN" \
|
||||
http://localhost:5000/api/server/1/metrics/summary
|
||||
```
|
||||
|
||||
Ответ:
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"data": {
|
||||
"cpu": { "avg": 12.5, "max": 45.2, "min": 2.1 },
|
||||
"memory": { "avg": 48.3, "max": 72.1, "min": 35.2 },
|
||||
"disk": { "avg": 20.0, "max": 21.5, "min": 19.8 },
|
||||
"network": {
|
||||
"totalIn": 104857600,
|
||||
"totalOut": 52428800
|
||||
},
|
||||
"uptime": 86400
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🔒 Безопасность
|
||||
|
||||
- ✅ Все endpoints требуют авторизации (authMiddleware)
|
||||
- ✅ Пользователь видит только метрики своих серверов
|
||||
- ✅ CASCADE DELETE - метрики удаляются вместе с сервером
|
||||
- ✅ Нет лимитов на количество запросов (можно добавить rate limiting)
|
||||
|
||||
## 📊 База данных
|
||||
|
||||
Структура таблицы:
|
||||
```sql
|
||||
CREATE TABLE `server_metrics` (
|
||||
`id` INT AUTO_INCREMENT PRIMARY KEY,
|
||||
`serverId` INT NOT NULL,
|
||||
`cpuUsage` DOUBLE DEFAULT 0,
|
||||
`memoryUsage` DOUBLE DEFAULT 0,
|
||||
`memoryUsed` BIGINT DEFAULT 0,
|
||||
`memoryMax` BIGINT DEFAULT 0,
|
||||
`diskUsage` DOUBLE DEFAULT 0,
|
||||
`diskUsed` BIGINT DEFAULT 0,
|
||||
`diskMax` BIGINT DEFAULT 0,
|
||||
`networkIn` BIGINT DEFAULT 0,
|
||||
`networkOut` BIGINT DEFAULT 0,
|
||||
`status` VARCHAR(191) DEFAULT 'unknown',
|
||||
`uptime` BIGINT DEFAULT 0,
|
||||
`timestamp` DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3),
|
||||
INDEX `server_metrics_serverId_timestamp_idx` (`serverId`, `timestamp`),
|
||||
FOREIGN KEY (`serverId`) REFERENCES `server`(`id`) ON DELETE CASCADE
|
||||
);
|
||||
```
|
||||
|
||||
Размер записи: ~100 байт
|
||||
При частоте 1 метрика/минуту: ~144 KB/день/сервер
|
||||
|
||||
## 🎯 Рекомендации
|
||||
|
||||
1. **Cron для сбора метрик**:
|
||||
Создайте задачу, которая каждые 5 минут запрашивает метрики всех серверов:
|
||||
```javascript
|
||||
// backend/src/cron/collectMetrics.ts
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
import { getContainerStats } from './modules/server/proxmoxApi';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
async function collectAllMetrics() {
|
||||
const servers = await prisma.server.findMany({
|
||||
where: { status: 'running' }
|
||||
});
|
||||
|
||||
for (const server of servers) {
|
||||
if (!server.proxmoxId) continue;
|
||||
try {
|
||||
const stats = await getContainerStats(server.proxmoxId);
|
||||
if (stats.status === 'success' && stats.data) {
|
||||
await prisma.serverMetric.create({ /* ... */ });
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`Ошибка сбора метрик для сервера ${server.id}:`, err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Запускать каждые 5 минут
|
||||
setInterval(collectAllMetrics, 5 * 60 * 1000);
|
||||
```
|
||||
|
||||
2. **Партиционирование таблицы** (для высоких нагрузок):
|
||||
```sql
|
||||
ALTER TABLE server_metrics
|
||||
PARTITION BY RANGE (YEAR(timestamp) * 100 + MONTH(timestamp)) (
|
||||
PARTITION p202511 VALUES LESS THAN (202512),
|
||||
PARTITION p202512 VALUES LESS THAN (202601),
|
||||
PARTITION pmax VALUES LESS THAN MAXVALUE
|
||||
);
|
||||
```
|
||||
|
||||
3. **Кэширование**:
|
||||
Добавьте Redis для кэширования текущих метрик (TTL 30 секунд).
|
||||
|
||||
## 📝 Changelog
|
||||
|
||||
**1 ноября 2025**:
|
||||
- ✅ Добавлена модель ServerMetric в Prisma
|
||||
- ✅ Созданы 3 API endpoint'а для метрик
|
||||
- ✅ Реализован компонент ServerMetrics с графиками
|
||||
- ✅ Интегрирован в панель управления сервером
|
||||
- ✅ Установлена библиотека Recharts для графиков
|
||||
- ✅ Добавлена SQL миграция
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
**Проблема**: Графики не отображаются
|
||||
- Проверьте консоль браузера на ошибки API
|
||||
- Убедитесь, что сервер запущен и метрики собираются
|
||||
- Проверьте, что таблица `server_metrics` создана
|
||||
|
||||
**Проблема**: "Cannot read property 'cpu' of undefined"
|
||||
- Сервер ещё не имеет метрик в БД
|
||||
- Подождите 1-2 минуты после создания сервера
|
||||
- Вручную запросите `/api/server/:id/metrics`
|
||||
|
||||
**Проблема**: Слишком большая база данных
|
||||
- Настройте автоочистку старых метрик (см. выше)
|
||||
- Уменьшите частоту сбора данных
|
||||
- Используйте партиционирование
|
||||
|
||||
## 🎉 Готово!
|
||||
|
||||
Теперь у вас полноценная система мониторинга с:
|
||||
- ✅ Реал-тайм метриками
|
||||
- ✅ Интерактивными графиками
|
||||
- ✅ Историей данных
|
||||
- ✅ Красивым интерфейсом
|
||||
- ✅ Автоматическим обновлением
|
||||
|
||||
Пользователи могут отслеживать нагрузку на свои серверы в режиме реального времени! 🚀
|
||||
Reference in New Issue
Block a user