133 lines
4.2 KiB
Markdown
133 lines
4.2 KiB
Markdown
# 🔍 MikroTik Monitor
|
||
|
||
Мониторинг IP-адресов через MikroTik API с уведомлениями в Telegram.
|
||
Деплой через Portainer Stack — без лишних зависимостей.
|
||
|
||
---
|
||
|
||
## Как это работает
|
||
|
||
```
|
||
[Docker Container]
|
||
│
|
||
├─→ Подключается к MikroTik по API (порт 8728)
|
||
│ └─→ Выполняет /ping для каждого IP из списка
|
||
│
|
||
└─→ Если хост не отвечает N раз подряд → Telegram уведомление
|
||
```
|
||
|
||
**Логика уведомлений:**
|
||
- 🔴 `DOWN` — хост не ответил `FAILURE_THRESHOLD` раз подряд
|
||
- ✅ `UP` — хост восстановился после даунтайма
|
||
- ⚠️ `ERROR` — не удалось подключиться к MikroTik
|
||
|
||
---
|
||
|
||
## Структура репозитория
|
||
|
||
```
|
||
.
|
||
├── Dockerfile # Образ с встроенным скриптом
|
||
├── monitor.py # Основной скрипт мониторинга
|
||
├── stack.yml # Portainer Stack
|
||
├── .env.example # Шаблон переменных окружения
|
||
└── README.md
|
||
```
|
||
|
||
---
|
||
|
||
## Быстрый старт
|
||
|
||
### 1. Настройте MikroTik
|
||
|
||
```routeros
|
||
/ip service enable api
|
||
|
||
/user group add name=monitor policy=api,read,test
|
||
/user add name=monitor password=StrongPass group=monitor
|
||
```
|
||
|
||
### 2. Создайте Telegram-бота
|
||
|
||
1. [@BotFather](https://t.me/BotFather) → `/newbot` → скопируйте токен
|
||
2. Добавьте бота в чат, напишите любое сообщение
|
||
3. Получите `chat_id`:
|
||
```
|
||
https://api.telegram.org/bot<TOKEN>/getUpdates
|
||
```
|
||
|
||
### 3. Соберите Docker-образ на сервере
|
||
|
||
```bash
|
||
git clone https://gitea.example.com/yourname/mikrotik-monitor.git
|
||
cd mikrotik-monitor
|
||
docker build -t mikrotik-monitor:latest .
|
||
```
|
||
|
||
### 4. Задеплойте через Portainer
|
||
|
||
1. **Stacks** → **Add Stack**
|
||
2. Имя: `mikrotik-monitor`
|
||
3. **Web editor** → вставьте содержимое `stack.yml`
|
||
4. Заполните переменные окружения
|
||
5. **Deploy the stack**
|
||
|
||
---
|
||
|
||
## Переменные окружения
|
||
|
||
| Переменная | Обязательная | По умолчанию | Описание |
|
||
|---|:---:|---|---|
|
||
| `MIKROTIK_HOST` | ✅ | — | IP или hostname MikroTik |
|
||
| `MIKROTIK_PORT` | | `8728` | API-порт (8729 для SSL) |
|
||
| `MIKROTIK_USER` | ✅ | — | Логин |
|
||
| `MIKROTIK_PASSWORD` | ✅ | — | Пароль |
|
||
| `TELEGRAM_BOT_TOKEN` | ✅ | — | Токен бота от @BotFather |
|
||
| `TELEGRAM_CHAT_ID` | ✅ | — | ID чата/группы/канала |
|
||
| `IP_LIST` | ✅ | — | Адреса через запятую |
|
||
| `CHECK_INTERVAL` | | `60` | Интервал проверок (сек) |
|
||
| `PING_COUNT` | | `3` | Кол-во пинг-пакетов |
|
||
| `PING_TIMEOUT_MS` | | `1000` | Таймаут пинга (мс) |
|
||
| `FAILURE_THRESHOLD` | | `2` | Провалов подряд → DOWN |
|
||
| `TZ` | | `Europe/Moscow` | Временная зона |
|
||
|
||
### Рекомендуемый способ: переменные Portainer
|
||
|
||
В `stack.yml` используйте синтаксис `${VAR}`:
|
||
```yaml
|
||
environment:
|
||
- MIKROTIK_PASSWORD=${MIKROTIK_PASSWORD}
|
||
- TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
|
||
```
|
||
Значения добавляйте в раздел **Environment variables** в UI Portainer — они хранятся зашифрованно.
|
||
|
||
---
|
||
|
||
## Обновление
|
||
|
||
```bash
|
||
# Пересобрать образ
|
||
cd mikrotik-monitor
|
||
git pull
|
||
docker build -t mikrotik-monitor:latest .
|
||
```
|
||
|
||
Затем в Portainer: **Stacks → mikrotik-monitor → Update the stack**.
|
||
|
||
---
|
||
|
||
## Просмотр логов
|
||
|
||
```bash
|
||
docker logs -f mikrotik-monitor
|
||
```
|
||
|
||
Пример вывода:
|
||
```
|
||
2024-01-15 14:30:00 [INFO] === MikroTik Monitor запущен ===
|
||
2024-01-15 14:30:00 [INFO] Хосты: ['192.168.1.1', '192.168.1.10']
|
||
2024-01-15 14:30:01 [INFO] Подключено к MikroTik
|
||
2024-01-15 14:30:02 [INFO] ✅ 192.168.1.1 avg-rtt=0.8 ms
|
||
2024-01-15 14:30:03 [WARNING] ❌ 192.168.1.10 не отвечает (1/2)
|
||
```
|