# Watchdog — мониторинг инфраструктуры

## Назначение

Мониторинг здоровья всех сервисов платформы MyFitCRM. Обнаружение сбоев, алерты в Telegram, автоматическое восстановление (PM2 restart, очистка кэша Next.js), отслеживание нереализованных API-эндпоинтов.

**Расположение:** `apps/watchdog/`
**PM2 процесс:** `fitcrm-watchdog`
**Стек:** TypeScript, чистый Node.js (без зависимостей)

## Мониторируемые сервисы (7)

| Сервис | URL / Метод | Тип проверки | Критичность |
|--------|-------------|--------------|-------------|
| api | http://localhost:3000/ | HTTP + PM2 | CRITICAL |
| web-admin | http://localhost:3001/ | HTTP + Content + 3 API endpoints | HIGH |
| web-club-admin | http://localhost:3002/ | HTTP + Content + 15 API endpoints | HIGH |
| web-platform-admin | http://localhost:3003/ | HTTP + Content + 4 API endpoints | HIGH |
| lp (Landing) | http://localhost:3050/ | HTTP + Content | MEDIUM |
| postgres | Docker: pg_isready | Docker exec | CRITICAL |
| redis | Docker: redis-cli PING | Docker exec | CRITICAL |

## Типы проверок

- **HTTP**: GET запрос, коды 200/301/302/307/308, таймаут 10 сек
- **Content**: проверка на "зависшую загрузку", доступность JS-чанков `/_next/static/chunks/`
- **PM2**: статус процесса через `pm2 jlist`
- **Docker**: `docker exec` с pg_isready / redis-cli
- **API Endpoints**: проверка 404 (не реализован) -> dev backlog

## Workflow алертов

```
Проверка не прошла -> consecutiveFailures++ -> Flapping? (4+ раз за 10 мин)
  -> Порог (2+ подряд) -> Создание инцидента -> Auto-fix попытка (макс 2)
  -> Telegram алерт (кулдаун 15 мин) -> Восстановление -> алерт с даунтаймом
```

## Auto-fix

- **PM2 restart**: перезапуск упавшего процесса
- **Next.js cache clear**: очистка `.next/cache` при битых чанках
- Максимум 2 попытки на инцидент, кулдаун 5 мин между попытками

## Конфигурация

```env
WATCHDOG_INTERVAL=120000           # Проверка каждые 2 мин
WATCHDOG_FAILURES_BEFORE_ALERT=2   # Алерт после 2 подряд
WATCHDOG_FLAP_WINDOW=600000        # 10-минутное окно flapping
WATCHDOG_FLAP_THRESHOLD=4          # Flapping после 4 переключений
WATCHDOG_COOLDOWN=900000           # 15-мин кулдаун алертов
WATCHDOG_AUTOFIX_MAX=2             # Макс 2 попытки auto-fix
WATCHDOG_AUTOFIX_COOLDOWN=300000   # 5-мин кулдаун между попытками
WATCHDOG_DEPLOY_GRACE=90000        # Пауза 90 сек при деплое
```

## Структура файлов

```
apps/watchdog/
├── src/
│   ├── index.ts          # Главный цикл, управление состоянием
│   ├── config.ts         # Определения сервисов, env, пороги
│   ├── types.ts          # TypeScript интерфейсы
│   ├── checker.ts        # Реализация проверок: HTTP, PM2, Docker, Content
│   ├── notifier.ts       # Telegram интеграция через InnerVoice (localhost:3456)
│   ├── auto-fix.ts       # Автоматическое восстановление
│   ├── state.ts          # In-memory состояние, flapping detection
│   ├── task-queue.ts     # Управление инцидентами (JSON)
│   ├── deploy-lock.ts    # Пауза при деплое (.deploy.lock)
│   ├── dev-backlog.ts    # Трекинг нереализованных API-эндпоинтов
│   └── logger.ts         # JSON логирование
├── dist/                 # Скомпилированный JS
└── package.json
```

## Хранение данных

- **Инциденты:** `/home/fitcrm/data/incidents/*.json` (автоочистка через 30 дней)
- **Dev backlog:** `/home/fitcrm/data/dev-backlog.json`
- **Логи:** `/home/fitcrm/logs/watchdog/watchdog.log` (JSON lines)

## Интеграция с InnerVoice

- Алерты: `POST http://localhost:3456/notify`
- Вопросы: `POST http://localhost:3456/ask` (при обнаружении новых missing endpoints)
- Задачи: `POST http://localhost:3456/tasks` (создание задач для Claude)

## Команды

```bash
pnpm --filter watchdog build     # Сборка (tsc)
pnpm --filter watchdog dev       # Разработка (tsx watch)
pnpm --filter watchdog start     # Запуск
pm2 restart fitcrm-watchdog      # Перезапуск через PM2
```
