📖 Wiki — RouterMon
Повна документація по всіх функціях системи моніторингу
Технологічний стек: Python 3 · Flask · SQLite · Gunicorn · Nginx · Server-Sent Events (live оновлення)
RouterMon розгортається на Debian 11/12 або Ubuntu 22.04/24.04. Автоматичний скрипт налаштовує Python venv, systemd, Nginx, firewall і опціонально SSL.
Запусти PowerShell-скрипт на своєму ПК:
Скрипт запитає IP VPS, завантажить файли через SCP і запустить deploy.sh на сервері.
| Крок | Дія |
|---|---|
| 1. Пакети | apt-get install python3, nginx, ufw, fping, mtr-tiny, (certbot) |
| 2. Юзер | Створює системний user phpmon без shell |
| 3. Backup DB | При оновленні копіює routers.db → /var/backups/phpmon/ |
| 4. Python venv | Створює venv, встановлює залежності з requirements.txt |
| 5. Secret key | Генерує /opt/phpmon/.env з SECRET_KEY (зберігається між рестартами) |
| 6. Systemd | Gunicorn сервіс з hardening (NoNewPrivileges, PrivateTmp) |
| 7. Log rotation | Ротація access/error логів щодня, 14 днів |
| 8. Nginx | Proxy до :8080, SSE buffering off, security headers |
| 9. SSL (опт.) | Let's Encrypt через certbot, HTTP→HTTPS redirect |
| 10. Firewall | ufw: SSH + 80 (+ 443 якщо SSL) |
Маршрут / — центральна сторінка з live-таблицею всіх роутерів.
Показують: Всього роутерів · Онлайн · Офлайн · Середня latency · Health Score. Оновлюються автоматично через SSE.
| Колонка | Опис |
|---|---|
| Статус | Онлайн / Офлайн / Невідомо — оновлюється live без перезавантаження сторінки |
| Назва | Клікабельна — веде на сторінку History. Показує SNMP CPU/RAM якщо налаштовано. Показує нотатку (📝) якщо вказана. |
| IP адреса | IP:порт (порт тільки якщо не 80) |
| Latency | Час відповіді в мс з кольором: зелений <10мс · жовтий <50мс · червоний ≥50мс · оранжевий при перевищенні порогу ⚠. Показує % loss якщо є втрати. |
| Група | Кольоровий бейдж групи якщо призначено |
| Адреса | Місце розташування пристрою |
| TCP | ✓ або ✗ для TCP-порту якщо налаштовано |
| Оновлено | Час останньої перевірки |
Пошук по назві/IP/локації · Фільтр по статусу (онлайн/офлайн) · Фільтр по групі · Сортування: за статусом, назвою, latency, часом оновлення, групою.
Таблиця оновлюється кожні 5 секунд через Server-Sent Events без перезавантаження сторінки. При зміні статусу рядок миготить червоним або зеленим. Кнопка «Голос» вмикає аудіо-сповіщення в браузері.
Пінгувати зараз — примусово запускає перевірку всіх роутерів. Додати роутер — відкриває форму додавання. Кнопка 🔄 поряд з кожним роутером — пінгує тільки цей один.
| Поле | Опис |
|---|---|
| Назва * | Відображувана назва пристрою |
| IP адреса * | IPv4-адреса або hostname для пінгу |
| Порт веб-інтерфейсу | Лише для кнопки «Відкрити», на пінг не впливає (default 80) |
| Адреса розміщення | Текстовий опис місця: «Офіс 3», «Серверна» |
| TCP порт | Додатково перевіряти TCP-з'єднання (наприклад 22 для SSH, 23 для Telnet) |
| Поріг latency мс | Якщо latency перевищить це значення — прийде алерт (cooldown 10 хвилин) |
| Група | Прив'язка до групи роутерів |
| Кількість пінгів | 1–10 пакетів за одну перевірку (впливає на packet loss %) |
| Розмір пакету | Байт (1–65500, default 32) |
| TTL | Time To Live для ICMP пакетів (опційно) |
| SNMP Community | Рядок community для SNMP v2c (порожньо = вимкнено) |
| SNMP Port | UDP порт SNMP (default 161) |
| DNS Hostname | Hostname для перевірки відповідності IP (DNS моніторинг) |
| Інтервал пінгу | Індивідуальний інтервал в секундах (порожньо = глобальний) |
| Нотатки | Вільний текст, відображається в таблиці та на history сторінці |
| Увімкнути моніторинг | Чекбокс — можна вимкнути без видалення |
| HTTP перевірка | Додатково робить GET запит на http://IP:PORT/ і фіксує HTTP OK/FAIL |
Масовий імпорт роутерів з CSV файлу. Обов'язкові колонки: name, ip. Опційні: location, port.
Кожен роутер має унікальний 6-символьний код (наприклад A3B7K2). Клієнти Telegram-бота надсилають /start A3B7K2 щоб підписатися на сповіщення про конкретний пристрій.
Маршрут /groups — організація роутерів у логічні групи (наприклад «Офіс», «Філіали», «Серверна»). Кожній групі задається назва і колір.
Групи використовуються для: фільтрації на головній · сортування по групах · відображення кольорового бейджа · аналітики в розрізі груп.
Кожна перевірка роутера виконується утилітою ping (системна команда). Підтримується Windows та Linux.
| Параметр | Опис |
|---|---|
| Інтервал пінгу | Як часто пінгувати всі пристрої: 30с / 60с / 300с / 600с |
| Поріг офлайн | Скільки невдач підряд потрібно щоб позначити офлайн: 1 / 2 / 3 / 5 |
Кожен роутер може мати свій власний інтервал пінгу (мінімум 10с). Поллер перевіряє кожні 10 секунд які роутери вже «просрочені» і пінгує тільки їх. Це дозволяє критичні пристрої пінгувати кожні 30с, а менш важливі — кожні 10 хвилин.
При кількість пінгів > 1 система рахує відсоток втрачених пакетів. Наприклад при 4 пінгах і 1 відповіді — 75% loss. Зберігається в ping_history.packet_loss та routers.packet_loss. Відображається в таблиці та history.
Два типи автоматичних алертів (з cooldown 10 хвилин):
- Порогова latency — якщо latency перевищила значення зі поля «Поріг latency мс»
- Стрибок latency — якщо поточна latency вдвічі більша за середню останніх 5 вимірювань і більше 20мс
Якщо включено чекбокс «HTTP перевірка» — після успішного ping система виконує GET-запит на http://IP:PORT/. Результат OK/FAIL зберігається в ping_history.http_ok.
Якщо вказано «TCP порт» — система намагається встановити TCP-з'єднання на вказаний порт (timeout 3с). Корисно для перевірки SSH (22), Telnet (23), RDP (3389), HTTPS (443) тощо.
Якщо вказано «DNS Hostname» — система резолвить hostname та порівнює з IP роутера. Якщо hostname перестав резолвитися або повертає інший IP — приходить алерт.
Підтримується SNMP v2c. Збирає три метрики через стандартні OID:
| Метрика | OID | Опис |
|---|---|---|
| CPU % | 1.3.6.1.2.1.25.3.3.1.2.1 | Завантаження процесора |
| RAM % | 1.3.6.1.2.1.25.2.3.1.6/5.1 | Відсоток використаної пам'яті |
| Uptime | 1.3.6.1.2.1.1.3.0 | Час роботи пристрою |
Дані відображаються рядком під назвою роутера: CPU 23% · MEM 67% · up 5д 3год
Відсоток втрачених ICMP пакетів за одну перевірку. Розраховується з виводу ping -c N.
Кольорова схема в таблиці history: 0% — зелений · <25% — жовтий · ≥25% — червоний.
Маршрут /history/<id> — детальна статистика конкретного пристрою.
1 год · 6 год · 24 год · 7 днів
Uptime % · Всього перевірок · Онлайн / Офлайн · Gauge середньої latency · Min/Max latency · Packet Loss % (середній)
Упtime-calendar у стилі GitHub contributions. Кольори: сірий = немає даних · червоний = <95% · жовтий = 95-99% · зелений = 99-100% · яскраво-зелений = 100%.
SLA за 7 і 30 днів — відсоток успішних перевірок.
Лінійний графік з latency по часу.
Горизонтальна смуга з тіками — кожен тік = одна перевірка. Зелений = онлайн, червоний = офлайн. Tooltip показує час і latency.
Таблиця з колонками: Час · Статус · Latency · Packet Loss. Максимум 100 останніх рядків.
10 останніх падінь з часом початку, відновлення і тривалістю. Посилання на повний downtime лог.
Маршрут /sla — зведена таблиця SLA для всіх роутерів.
Колонки: Роутер · Статус · SLA 1д · SLA 7д · SLA 30д · SLA 90д · Avg latency. Сортування за SLA 30д (найгірші вгорі). Кольорове кодування: ≥99% зелений · ≥95% синій · <95% червоний.
Маршрут /analytics — зведений дашборд за 30 і 14 днів.
| Блок | Опис |
|---|---|
| Summary KPI | Uptime 30д · Uptime 7д · Кількість інцидентів · MTTR · Активних роутерів · Найкращий/найгірший |
| Network availability | Area chart — % доступності мережі по днях за 30д |
| Latency trend | Line chart — avg/min/max latency по днях за 14д |
| Incident heatmap (год) | Розподіл інцидентів по годинах доби (0–23) |
| Incident heatmap (день) | Розподіл по днях тижня (Пн–Нд) |
| Router stats table | Uptime 7д / 30д · avg latency · кількість інцидентів · MTTR для кожного роутера |
| Comparison chart | Горизонтальний бар-чарт порівняння uptime 30д по роутерах |
Маршрут /downtime — повний журнал всіх падінь.
Фільтри: Пошук по назві/IP · По роутеру · Діапазон (сьогодні/тиждень/місяць/всі) · Тільки активні (ще не відновлені)
Summary блок (топ-10): Кількість інцидентів · Сумарний downtime · Avg recovery time · Активних зараз
MTTR (Mean Time To Recovery) — середній час відновлення за 30 днів в хвилинах.
Маршрут /problems — показує роутери з активними або недавніми інцидентами.
Роутер потрапляє в список якщо: зараз офлайн АБО відновився менш ніж N хвилин тому. Час «пам'яті» налаштовується: 10хв · 30хв · 1год · 3год · 6год · 12год · 24год.
Колонки: Роутер · IP · Статус · Інцидентів за 30д · Сумарний downtime · Avg recovery · Активних зараз.
Маршрут /mtr/<id> — комбінований traceroute + ping кожного хопа.
# хоп · IP · Hostname · Loss% · Snt · Rcv · Last · Avg · Best · Wrst · мінімальний bar chart
Кольори Loss%: зелений = 0% · жовтий = <20% · червоний ≥ 20%
Маршрут /mtr/<id>/snapshots — збереження та порівняння трасувань.
Запусти MTR → дочекайся завершення → натисни кнопку «Зберегти знімок». Знімок зберігається в БД з датою і всіма хопами.
Вибери два знімки (кнопки A / B) — система показує таблицю з diff:
| Маркер | Значення |
|---|---|
| + | Новий хоп (є в A, відсутній в B) |
| − | Зник хоп (є в B, відсутній в A) |
| ~ | Змінився: IP або latency +30% або loss ±10% |
| = | Однаковий хоп |
Колонка Δ Avg — різниця latency: +5 мс червоний (погіршилось) · -3 мс зелений (покращилось).
Маршрут /live/<id> — пінг конкретного роутера в реальному часі, щосекунди.
Кнопка «Live Ping» на сторінці History кожного роутера, або напряму: http://IP/live/<router_id>
| Елемент | Опис |
|---|---|
| Ring gauge | Кругова шкала від 0 до 300мс — заповнюється пропорційно latency. Колір: зелений <30мс · синій <75мс · жовтий <150мс · червоний ≥150мс |
| Велике число | Поточна latency в мс. При timeout — «—» червоним |
| Статус-індикатор | Пульсуючий зелений = Онлайн · Червоний = Timeout · Сірий = Зупинено/Пауза |
| Min / Max / Avg | Мінімум, максимум, середня latency з початку сесії |
| Loss % | Відсоток timeout-відповідей з початку сесії |
| Відправлено / Отримано | Лічильники пакетів. Отримано зеленим якщо 100% |
| Блок | Опис |
|---|---|
| Scrolling chart | Лінійний графік — останні 60 пінгів (≈ 1 хвилина). Кольорові точки за рівнем latency. Розрив у лінії при timeout. |
| Лог пінгів | Час · ● OK / ● TIMEOUT · ms · % loss. До 200 рядків з прокруткою. |
▶ Старт — починає пінгування · ⏸ Пауза — зупиняє SSE потік · 🔄 — скидає всю статистику і зупиняє
Внизу сторінки — collapsible панель «⚙ Налаштування роутера». Дозволяє змінити всі параметри без переходу на іншу сторінку:
Назва · IP · Порт · Локація · Група · Кількість пінгів · Розмір пакету · TTL · Поріг latency · Індивідуальний інтервал · TCP порт · DNS hostname · HTTP check · SNMP · Нотатки
Зміни зберігаються через POST /api/router/<id>/update без перезавантаження. Кнопка «Зберегти» стає зеленою при успіху або червоною з текстом помилки при невдачі.
Пінг запускається через GET /api/live-ping/<id> — SSE потік, що генерує один пінг на секунду. Використовує ті самі параметри що й фоновий поллер (ping_count, ping_size, ping_ttl). При закритті сторінки SSE автоматично закривається.
Маршрут /noc — fullscreen сторінка для великого екрана або телевізора в серверній кімнаті. Повністю автономна (без sidebar), живі оновлення через SSE.
Sidebar → NOC Board ↗ (відкривається в новій вкладці). Потім натисни F11 для повноекранного режиму, або кнопку ⛶ в правому верхньому куті сторінки.
| Елемент | Опис |
|---|---|
| ● RouterMon NOC | Логотип з пульсуючою зеленою точкою |
| KPI бейджи | X роутерів · Y онлайн · Z офлайн — оновлюються через SSE щосекунди |
| Годинник | HH:MM:SS у реальному часі |
| ⛶ Fullscreen | Вхід/вихід з повноекранного режиму. Іконка змінюється. |
| ← Вихід | Повернення до звичайного інтерфейсу |
Якщо налаштовані групи — відображається рядок кнопок: «Всі» та по одній кнопці на групу. Клік фільтрує плитки без перезавантаження сторінки.
| Стан | Вигляд |
|---|---|
| Онлайн | Зелена рамка + легкий зелений фон + пульсуючий зелений dot |
| Офлайн | Червона рамка що мигає + червоний фон + великий текст ОФЛАЙН |
| Невідомо | Сіра рамка |
Кожна плитка містить: назва + IP · велика latency (кольорова) або ОФЛАЙН · 20-тиків uptime bar · badge статусу · TCP ✓/✗ · % loss · час останньої перевірки.
- Офлайн → Онлайн: зелений flash по всій плитці
- Онлайн → Офлайн: червоний flash + мигання рамки
- Uptime bars перезавантажуються кожні 30 секунд з /api/router-mini
Маршрут /scan/<id> — TCP-сканування портів конкретного роутера через SSE (результати приходять в реальному часі).
За замовчуванням сканується: 21, 22, 23, 25, 53, 80, 110, 143, 443, 3306, 3389, 8080, 8443
Можна задати власний список портів через кому. Максимум 100 портів. Timeout 1 секунда на порт.
Маршрут /subnet-scan — виявлення активних хостів у підмережі.
Вводиш підмережу у форматі 192.168.1.0/24 (або просто 192.168.1.0 — автоматично /24). Максимум /22 (1022 хости).
Всі хости пінгуються паралельно. Для кожного активного хоста показується: IP · hostname · latency · чи вже є в моніторингу. Кнопка «+ Додати» одразу додає в RouterMon.
Маршрут /ip-info?ip=X.X.X.X — збір інформації про IP-адресу.
| Джерело | Дані |
|---|---|
| ip-api.com | Країна · Місто · ISP · AS · Координати · Часовий пояс |
| WHOIS | Повний текст WHOIS через whois.iana.org → referral сервер |
Для приватних IP (RFC1918) WHOIS не запитується.
Повний доступ до управління системою. Один адміністратор (один chat_id).
| Команда | Дія |
|---|---|
| /start | Підключення бота, показ chat_id |
| /status | Статус всіх роутерів: онлайн/офлайн з latency |
| /offline | Список тільки офлайн роутерів |
| /top | Топ 5 роутерів з найвищою latency |
| /ping <назва або IP> | Пінгує конкретний роутер зараз, показує latency + loss |
| /pinglist | Список кнопок для вибору роутера для пінгу |
| /addrouter <назва> <IP> | Додає новий роутер в моніторинг |
| /delrouter | Список кнопок для видалення роутера |
| /history [назва] | Детальна статистика роутера з кнопками 1/6/24год/7днів |
| /code [назва] | Коди доступу для клієнтів (/start CODE) |
| /settings | Поточні налаштування системи |
| /help | Список всіх команд |
Клієнти підписуються на конкретні роутери через код доступу. Отримують сповіщення тільки про «свої» пристрої.
Команди client бота: /status · /offline · /top · /ping · /pinglist · /history · /help
Відправляються обом ботам (admin + всім підписаним клієнтам) при:
- Роутер перейшов офлайн або відновився
- Перевищено поріг latency (cooldown 10 хвилин)
- Стрибок latency (вдвічі більше середнього, cooldown 10 хвилин)
- DNS збій — hostname не резолвиться або вказує не на той IP
Налаштування в Налаштування → Email.
| Параметр | Опис |
|---|---|
| SMTP Host | Хост сервера (smtp.gmail.com, smtp.ukr.net тощо) |
| SMTP Port | Порт (587 для STARTTLS, 465 для SSL) |
| User / Password | Логін та пароль |
| From | Email відправника (якщо порожньо — використовується User) |
| To | Email одержувача алертів |
Кнопка «Тест» відправляє тестовий лист. Email відправляється асинхронно в окремому потоці.
POST-запит на вказаний URL при зміні статусу роутера. Інтеграція зі Slack, Discord, n8n, Make тощо.
За замовчуванням захист вимкнений. Після встановлення пароля в Налаштування → Безпека — вхід потрібен для всіх сторінок крім публічного статусу.
| Параметр | Опис |
|---|---|
| Логін | Ім'я користувача (default: admin) |
| Пароль | Зберігається як SHA-256 хеш. Кнопка «Зняти захист» скидає пароль. |
Маршрут /status — публічна сторінка без авторизації. Показує всі увімкнені роутери: онлайн/офлайн + uptime bar за останні 90 днів. Можна поділитися з клієнтами.
API /api/risk — прогнозує ймовірність проблем у роутера (0–100) на основі:
| Фактор | Вага | Логіка |
|---|---|---|
| Поточна серія збоїв | до 30 | +15 за кожну невдачу підряд |
| Збої в останніх 20 перевірках | до 25 | Якщо частіше ніж середнє за тиждень |
| Зростання latency | до 20 | Якщо поточна latency >1.4× від середньої за 7д |
| Небезпечна година | до 15 | Якщо в цю годину доби часто падає |
| Небезпечний день | до 10 | Якщо в цей день тижня часто падає |
Кеш 120 секунд. Відображається у вигляді помаранчевого/червоного індикатора на картці роутера.
API /api/health-score — загальна оцінка здоров'я мережі 0–100.
| Score | Мітка | Колір |
|---|---|---|
| 99–100 | Відмінно | ● |
| 95–98 | Добре | ● |
| 85–94 | Задовільно | ● |
| 70–84 | Погано | ● |
| 0–69 | Критично | ● |
Формула: базовий % онлайн − штраф за серії збоїв − штраф за latency спайки − штраф за порушення порогів.
Маршрут /logs — журнал всіх дій адміністратора: вхід/вихід · додавання роутерів · редагування · видалення · збереження налаштувань. Останні 300 записів.
Маршрут /settings — 4 вкладки.
| Вкладка | Параметри |
|---|---|
| Моніторинг | Інтервал пінгу · Поріг офлайн · Webhook URL |
| Telegram | Токен admin бота · Chat ID admin · Токен client бота · Chat ID client · Кнопки тестування |
| SMTP host/port/user/password/from/to · Кнопка тест | |
| Безпека | Логін · Пароль (SHA-256) · Кнопка «Зняти захист» |
| Команда | Дія |
|---|---|
| systemctl status phpmon | Статус сервісу |
| systemctl restart phpmon | Перезапуск |
| journalctl -u phpmon -f | Логи в реальному часі |
| tail -f /var/log/phpmon/access.log | HTTP access log |
| bash /opt/phpmon/deploy.sh | Оновлення (backup DB автоматично) |
| ls /var/backups/phpmon/ | Список резервних копій БД |