BIG_UPDATE deleted vps, added s3 infrastructure.

This commit is contained in:
Georgiy Syralev
2025-11-23 14:35:16 +03:00
parent ae1f93a934
commit c4c2610480
173 changed files with 22684 additions and 5894 deletions

308
ospabhost/METRICS_GUIDE.md Normal file
View 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`
**Проблема**: Слишком большая база данных
- Настройте автоочистку старых метрик (см. выше)
- Уменьшите частоту сбора данных
- Используйте партиционирование
## 🎉 Готово!
Теперь у вас полноценная система мониторинга с:
- ✅ Реал-тайм метриками
- ✅ Интерактивными графиками
- ✅ Историей данных
- ✅ Красивым интерфейсом
- ✅ Автоматическим обновлением
Пользователи могут отслеживать нагрузку на свои серверы в режиме реального времени! 🚀