Files
mikrotik-monitor/README.md
T

171 lines
5.8 KiB
Markdown

# 🔍 MikroTik Monitor
Мониторинг IP-адресов через MikroTik API с уведомлениями в Telegram и MAX (VK Teams).
Список адресов берётся прямо с MikroTik из `/ip firewall address-list`.
Деплой через Portainer Stack — без лишних зависимостей.
---
## Как это работает
```
[Docker Container]
├─→ Подключается к MikroTik по API (порт 8728)
│ ├─→ Читает адреса из /ip firewall address-list
│ └─→ Выполняет /ping для каждого IP
├─→ Если хост не отвечает N раз подряд → уведомление DOWN
└─→ Когда хост восстановился → уведомление UP
```
**Уведомления отправляются параллельно в:**
- 📱 Telegram
- 💬 MAX (VK Teams) — опционально
**Логика уведомлений:**
- 🔴 `DOWN` — хост не ответил `FAILURE_THRESHOLD` раз подряд
-`UP` — хост восстановился после даунтайма
- ⚠️ `ERROR` — не удалось подключиться к MikroTik
---
## Структура репозитория
```
.
├── Dockerfile # Docker-образ
├── monitor.py # Основной скрипт мониторинга
├── stack.yml # Portainer Stack
├── .env.example # Шаблон переменных окружения
└── README.md
```
---
## Быстрый старт
### 1. Настройте MikroTik
Включите API и создайте пользователя с минимальными правами:
```routeros
/ip service enable api
/user group add name=monitor policy=api,read,test
/user add name=monitor password=StrongPass group=monitor
```
Добавьте адреса для мониторинга в address-list:
```routeros
/ip firewall address-list
add list=monitor address=192.168.1.1 comment="Роутер"
add list=monitor address=192.168.1.10 comment="Камера 1"
```
### 2. Создайте Telegram-бота
1. [@BotFather](https://t.me/BotFather) → `/newbot` → скопируйте токен
2. Добавьте бота в чат, напишите любое сообщение
3. Получите `chat_id`:
```
https://api.telegram.org/bot<TOKEN>/getUpdates
```
### 3. Создайте бота в MAX (опционально)
1. Зайдите на [dev.max.ru](https://dev.max.ru) → создайте бота → скопируйте токен
2. Получите `chat_id` списка чатов бота:
```
https://platform-api.max.ru/chats?access_token=<TOKEN>
```
### 4. Соберите Docker-образ на сервере
```bash
git clone https://gitea.example.com/yourname/mikrotik-monitor.git
cd mikrotik-monitor
docker build -t mikrotik-monitor:latest .
```
### 5. Задеплойте через Portainer
1. **Stacks** → **Add Stack**
2. Имя: `mikrotik-monitor`
3. **Web editor** → вставьте содержимое `stack.yml`
4. Заполните переменные окружения
5. **Deploy the stack**
---
## Переменные окружения
### MikroTik
| Переменная | Обязательная | По умолчанию | Описание |
|---|:---:|---|---|
| `MIKROTIK_HOST` | ✅ | — | IP или hostname MikroTik |
| `MIKROTIK_PORT` | | `8728` | API-порт (8729 для SSL) |
| `MIKROTIK_USER` | ✅ | — | Логин |
| `MIKROTIK_PASSWORD` | ✅ | — | Пароль |
| `ADDRESS_LIST_NAME` | ✅ | — | Имя списка в `/ip firewall address-list` |
### Telegram
| Переменная | Обязательная | По умолчанию | Описание |
|---|:---:|---|---|
| `TELEGRAM_BOT_TOKEN` | ✅ | — | Токен бота от @BotFather |
| `TELEGRAM_CHAT_ID` | ✅ | — | ID чата/группы/канала |
| `TELEGRAM_API_URL` | | `https://api.telegram.org` | URL API (замените на прокси если заблокирован) |
### MAX (VK Teams)
| Переменная | Обязательная | По умолчанию | Описание |
|---|:---:|---|---|
| `MAX_BOT_TOKEN` | | — | Токен бота MAX |
| `MAX_CHAT_ID` | | — | ID чата в MAX |
| `MAX_API_URL` | | `https://platform-api.max.ru` | URL API MAX |
> Если `MAX_BOT_TOKEN` или `MAX_CHAT_ID` не заданы — уведомления в MAX не отправляются.
### Мониторинг
| Переменная | Обязательная | По умолчанию | Описание |
|---|:---:|---|---|
| `CHECK_INTERVAL` | | `60` | Интервал проверок (сек) |
| `PING_COUNT` | | `3` | Кол-во пинг-пакетов |
| `PING_TIMEOUT_MS` | | `1000` | Таймаут пинга (мс) |
| `FAILURE_THRESHOLD` | | `2` | Провалов подряд → DOWN |
| `TZ` | | `Europe/Moscow` | Временная зона |
---
## Обновление
```bash
cd /opt/mikrotik-monitor
git pull
docker build -t mikrotik-monitor:latest .
```
Затем в Portainer: **Stacks → mikrotik-monitor → Update the stack**.
---
## Просмотр логов
```bash
docker logs -f mikrotik-monitor
```
Пример вывода:
```
2026-05-18 12:42:28 [INFO] === MikroTik Monitor запущен ===
2026-05-18 12:42:28 [INFO] Подключено к MikroTik
2026-05-18 12:42:28 [INFO] Адресов для проверки: 3
2026-05-18 12:42:28 [INFO] ✅ 192.168.1.1 (Роутер) avg-rtt=0.8 ms
2026-05-18 12:42:29 [INFO] ✅ 192.168.1.10 (Камера 1) avg-rtt=1.2 ms
2026-05-18 12:42:30 [WARNING] ❌ 192.168.1.20 (Камера 2) не отвечает (1/2)
```