Головна » Blog » Статус-панель — моніторинг сервера і сайтів, що став продуктом
CRM Моніторинг / Власний продукт

Статус-панель — моніторинг сервера і сайтів, що став продуктом

Seganiko
Клієнт Seganiko
Галузь Моніторинг / Власний продукт
Тип CRM
Використані технології PHP, SQLite, графіки в SVG без бібліотек, ліцензії Ed25519, канал оновлень, профілі VPS і шаред-хостингу
Контекст

Завдання

Змусити моніторинг працювати там, де він не має права існувати: на шаред-хостингу, без root, без системних лічильників і без SSH, щоб доставити оновлення на сервер клієнта.
Наш підхід

Що ми зробили

Збирач від root, розведений з інтерфейсом, SQLite між ними, графіки намальовані вручну в SVG. Домени опитуються прямо за IP, щоб відрізнити збій DNS від збою сайту, логи читаються дописом через фільтр шуму. У продуктовій частині: підписані ліцензії з офлайн-перевіркою, двотижневий запас і оновлення, які тягне сама установка.
Деталі проєкту

Моніторинг, який довелося навчити жити без root

Ми зробили панель, щоб бачити свій сервер: навантаження, диск, мережу, доступність сайтів, помилки в логах і рахунки за хмарні сервіси. Потім її попросили клієнти — і панель стала продуктом.

Складність була не в графіках. Складність у тому, що половина клієнтів сидить на шаред-хостингу, де немає ні root, ні доступу до системних лічильників, ні SSH для оновлення.

Статус-панель: плитки процесора, пам’яті, диска й доступності сайтів

Верхній ряд відповідає на питання «все гаразд?» за одну секунду. Решта панелі — на питання «а що саме».

Що це

  • Продукт: власна розробка Seganiko
  • Призначення: моніторинг сервера й сайтів
  • Установки: вісім, з них п’ять на доменах клієнтів
  • Оточення: VPS і шаред-хостинг

Завдання

  • Показати стан сервера й сайтів так, щоб це читалося без інструкції.
  • Працювати там, де системні метрики недоступні в принципі.
  • Оновлювати клієнтські установки без доступу до їхніх серверів.
  • Відрізняти справжню аварію від шуму в логах.

Що всередині

  • Збирач метрик, що працює від root за розкладом.
  • Панель без зовнішніх бібліотек: графіки малюються в SVG.
  • Підписані ліцензії й канал оновлень.
  • Модулі витрат: сховище, API, трафік.

Дві половини однієї панелі

Збирач і веб-панель розведені навмисно. Збирач запускається раз на хвилину від root — інакше він не побачить ні системних лічильників, ні логів вебсервера, ні конфігів доменів. Панель працює від звичайного користувача й не має доступу нікуди, крім однієї бази.

Між ними SQLite. Метрики живуть тридцять п’ять днів, помилки — сім. Це не архів, це вікно, у якому видно, що змінилося за останній місяць.

Чому не бібліотека графіків: панель має відкриватися швидко й на слабкому каналі, а кожна стороння бібліотека — це ще кількасот кілобайт і ще одна залежність, яка одного дня оновиться не так. Усі графіки малюються вручну в SVG.

Навантаження, яке видно цілком

Процесор, пам’ять, підкачка, диск, введення-виведення, IOPS, мережа, кількість процесів і PHP-воркерів — усе на одному екрані, з вибором періоду від тридцяти хвилин до тридцяти днів. Там, де є жорстка межа, пунктиром показана вона: не «багато чи мало», а скільки залишилося до стелі.

Сітка графіків: диск, середнє навантаження, PHP-воркери, підкачка, IOPS, мережа

Сайти опитуються в обхід DNS

Кожен домен панель перевіряє раз на хвилину — але звертається не за публічним DNS, а прямо на IP сервера. Це дрібниця з великими наслідками: якщо сайт відповідає по IP, але не відповідає за іменем, проблема не в сайті, а в записі DNS. Панель це розрізняє й пише про це прямо.

Окремо й рідше перевіряється те, що не змінюється щохвилини: DNS раз на чверть години, сертифікати раз на шість годин. У таблиці видно код відповіді, час відгуку, доступність за добу, строк сертифіката і кількість помилок.

Таблиця сайтів: код відповіді, час відгуку, доступність за добу, DNS, SSL і помилки

Помилки без шуму

Лог вебсервера читається дописом: панель пам’ятає, на якому місці зупинилася, і при ротації не перечитує файл заново. Але головне не в цьому, а у фільтрі.

Домени, закриті навмисно, щохвилини пишуть у лог «доступ заборонено» — це працює захист, а не аварія. Записи від нашого ж моніторингу теж не помилки. Попередження й повідомлення не рахуються за збої. Без цієї чистки список помилок перетворюється на стрічку, у яку перестають дивитися.

Гроші поруч із метриками

Сервер падає не тільки від навантаження — іноді від рахунку. Тому в панелі є місячний трафік із часткою від квоти, витрати на сховище з прогнозом до кінця місяця й витрати на API з розбивкою за моделями. Прогноз рахується від реального темпу, а не від середнього за місяць.

Блоки витрат: Cloudflare R2 і OpenAI API з прогнозом до кінця місяця

Публічна сторінка окремо від панелі

Те, що бачить власник, і те, що можна показати клієнтам, — різні речі. Панель під паролем, а поруч публічна сторінка статусу: смуги доступності за дев’яносто днів, середній час відповіді й одна фраза зверху — працює чи ні.

Публічна сторінка статусу з історією доступності за 90 днів

Оновлення без доступу до чужого сервера

У нас немає SSH на сервери клієнтів і не повинно бути. Тому зв’язок улаштований у зворотний бік: установка сама раз на добу звертається до нашої панелі, підтверджує ліцензію й забирає оновлення, якщо воно є.

Ліцензія підписана й перевіряється офлайн на кожному запиті, а не запитом до нас — якщо наш сервер лежить, клієнтські панелі продовжують працювати. На випадок довгого простою закладено двотижневий запас: наша аварія не має гасити чужі установки.

Дрібні оновлення ставляться самі, великі — кнопкою. З нашої панелі можна розкотити версію примусово, але тільки на ті установки, у коді яких уже є приймач такого наказу. Це чесне обмеження архітектури, і воно видно в інтерфейсі.

Як це робилося

1
Етап 1
Збирач
Метрики системи, опитування доменів в обхід DNS, перевірка сертифікатів, дописне читання логів із фільтром шуму.
2
Етап 2
Панель
Графіки в SVG без бібліотек, межі на графіках, вибір періоду, таблиця сайтів, публічна сторінка статусу окремо від приватної.
3
Етап 3
Продукт
Підписані ліцензії з офлайн-перевіркою, канал оновлень, панель-мати з релізами й установками, два профілі оточення.
4
Етап 4
Шаред-хостинг
Профіль, у якому системні метрики просто відсутні, а доступність, DNS, сертифікати й помилки лишаються. Визначається пробою при встановленні.

Що під капотом

Збирач

PHP за розкладом від root, читання системних лічильників, опитування доменів прямо на IP, дописне читання логів з фіксацією позиції. Зберігання — SQLite: метрики 35 днів, помилки 7.

Панель

Жодних зовнішніх бібліотек: графіки малюються в SVG на сервері. Ролі адміністратора й спостерігача, публічна сторінка статусу окремим шаром.

Продукт

Ліцензії на підписі Ed25519, офлайн-перевірка на кожному запиті, добовий checkin, двотижневий запас. Оновлення тягне сама установка — SSH до клієнта не потрібен.

Що вийшло

Панель, яку ми писали для себе, стоїть на восьми установках, п’ять із них — на доменах клієнтів. Вона однаково працює на VPS із повним доступом і на шаред-хостингу, де половина метрик недосяжна: у другому випадку вона просто не показує того, чого не може знати, замість того щоб малювати нулі.

І головне архітектурне рішення виявилося правильним: за весь час жодне оновлення не вимагало заходити на чужий сервер.


Схожий проєкт?

Обговорімо ваші цілі й подивімося, чим ми можемо допомогти.

Замовити безкоштовний кошторис →
Є питання?

Поговорімо про
ваш проєкт.

Перша розмова безкоштовна, без зобов’язань.