- Unify API: lib/api.ts uses /api/v1, inbox uses /api/inbox (rewrites) - Remove localhost refs: openapi, inbox page - Add rewrites: /api/inbox|tmc -> inbox-server, /api/v1 -> FastAPI - Add stub routes: knowledge/insights, recommendations, search, log-error - Transfer from PAPA: prompts (inspection, tmc), scripts, supabase, data/tmc-requests - Fix inbox-server: ORDER BY created_at, package.json - Remove redundant app/api/inbox/files route (rewrites handle it) - knowledge/ in gitignore (large PDFs) Co-authored-by: Cursor <cursoragent@cursor.com>
7.4 KiB
Резервное копирование и мониторинг
Резервное копирование
Автоматическое резервное копирование
Скрипт резервного копирования находится в scripts/backup-database.ts.
Настройка
Добавьте переменные окружения в .env.local:
DB_HOST=localhost
DB_PORT=5432
DB_NAME=klg_db
DB_USER=postgres
DB_PASSWORD=your-password
BACKUP_DIR=./backups
MAX_BACKUPS=30
COMPRESS_BACKUPS=true
Запуск вручную
npm run backup:db
Автоматический запуск через cron
Добавьте в crontab для ежедневного резервного копирования в 2:00:
0 2 * * * cd /path/to/klg_asutk_app && npm run backup:db
Или для резервного копирования каждый час:
0 * * * * cd /path/to/klg_asutk_app && npm run backup:db
Восстановление из резервной копии
npm run restore:db -- backups/backup_klg_db_2025-01-21T10-00-00.sql.gz
Или список доступных резервных копий:
npm run restore:db
Хранение резервных копий
Резервные копии сохраняются в директории backups/ (или указанной в BACKUP_DIR).
Рекомендации:
- Храните резервные копии в безопасном месте (не на том же сервере)
- Используйте облачное хранилище (S3, Google Cloud Storage)
- Шифруйте резервные копии перед отправкой
- Тестируйте восстановление регулярно
Версионирование
Система автоматически:
- Создает резервные копии с timestamp в имени файла
- Удаляет старые резервные копии (по умолчанию хранит 30 последних)
- Сжимает резервные копии (gzip)
Мониторинг
Health Checks
API endpoint для проверки здоровья системы: /api/health
Проверяет:
- Состояние базы данных (PostgreSQL)
- Состояние Redis
- Свободное место на диске
Ответ:
{
"status": "healthy",
"checks": {
"database": { "status": "ok" },
"redis": { "status": "ok" },
"disk": { "status": "ok", "freeSpace": 100 }
},
"timestamp": "2025-01-21T10:00:00.000Z"
}
Статусы:
healthy- все системы работаютdegraded- некоторые системы недоступны (но не критичные)unhealthy- критические системы недоступны
Метрики производительности
API endpoint для получения метрик: /api/metrics
Параметры:
type- тип метрик (performance,performance-details,all)endpoint- фильтр по endpoint (опционально)startTime- начало периода (опционально)endTime- конец периода (опционально)
Примеры:
# Статистика производительности
GET /api/metrics?type=performance
# Детальные метрики
GET /api/metrics?type=performance-details&endpoint=/api/aircraft
# Все метрики за период
GET /api/metrics?startTime=2025-01-21T00:00:00Z&endTime=2025-01-21T23:59:59Z
Автоматическое отслеживание
Система автоматически записывает:
- Время ответа каждого API запроса
- Код статуса ответа
- Медленные запросы (> 1 секунды) логируются
Страница мониторинга
Доступна по адресу /monitoring:
- Отображает состояние системы в реальном времени
- Показывает метрики производительности
- Автоматически обновляется каждые 30 секунд
Интеграция с внешними системами мониторинга
Prometheus
Для интеграции с Prometheus создайте endpoint /api/metrics/prometheus:
export async function GET() {
const stats = getPerformanceStats();
return new Response(
`# HELP api_requests_total Total number of API requests
# TYPE api_requests_total counter
api_requests_total ${stats.count}
# HELP api_request_duration_seconds Request duration in seconds
# TYPE api_request_duration_seconds histogram
api_request_duration_seconds ${stats.avgDuration / 1000}
`,
{ headers: { 'Content-Type': 'text/plain' } }
);
}
DataDog
Установите DataDog Agent и настройте интеграцию:
import { StatsD } from 'node-statsd';
const client = new StatsD();
recordPerformance(endpoint, method, duration, statusCode) {
client.timing('api.request.duration', duration, { endpoint, method });
client.increment('api.requests', 1, { endpoint, method, status: statusCode });
}
Sentry
Для отслеживания ошибок:
import * as Sentry from '@sentry/nextjs';
Sentry.init({
dsn: process.env.SENTRY_DSN,
tracesSampleRate: 1.0,
});
Алерты
Настройка алертов
Рекомендуется настроить алерты для:
- Критические ошибки - статус системы
unhealthy - Медленные запросы - время ответа > 2 секунд
- Высокий процент ошибок - > 5% запросов возвращают ошибку
- Недоступность БД - база данных не отвечает
- Недоступность Redis - Redis не отвечает
- Мало места на диске - < 10% свободного места
Email уведомления
Пример интеграции с email:
import { sendEmail } from '@/lib/notifications/email';
if (health.status === 'unhealthy') {
await sendEmail({
to: 'admin@example.com',
subject: '⚠️ Система неисправна',
body: `Статус системы: ${health.status}`,
});
}
Webhook уведомления
async function sendWebhookAlert(health: HealthStatus) {
await fetch(process.env.WEBHOOK_URL, {
method: 'POST',
body: JSON.stringify({
text: `Система неисправна: ${health.status}`,
}),
});
}
Рекомендации
- Регулярное тестирование восстановления - проверяйте резервные копии раз в месяц
- Мониторинг 24/7 - используйте внешние сервисы (UptimeRobot, Pingdom)
- Логирование - сохраняйте логи для анализа
- Метрики - отслеживайте тренды производительности
- Алерты - настройте уведомления для критических событий
Дата создания: 2025-01-21
Версия: 1.0