Завдання
Що ми зробили
Моніторинг, який довелося навчити жити без root
Ми зробили панель, щоб бачити свій сервер: навантаження, диск, мережу, доступність сайтів, помилки в логах і рахунки за хмарні сервіси. Потім її попросили клієнти — і панель стала продуктом.
Складність була не в графіках. Складність у тому, що половина клієнтів сидить на шаред-хостингу, де немає ні root, ні доступу до системних лічильників, ні SSH для оновлення.
Верхній ряд відповідає на питання «все гаразд?» за одну секунду. Решта панелі — на питання «а що саме».
Дві половини однієї панелі
Збирач і веб-панель розведені навмисно. Збирач запускається раз на хвилину від root — інакше він не побачить ні системних лічильників, ні логів вебсервера, ні конфігів доменів. Панель працює від звичайного користувача й не має доступу нікуди, крім однієї бази.
Між ними SQLite. Метрики живуть тридцять п’ять днів, помилки — сім. Це не архів, це вікно, у якому видно, що змінилося за останній місяць.
Навантаження, яке видно цілком
Процесор, пам’ять, підкачка, диск, введення-виведення, IOPS, мережа, кількість процесів і PHP-воркерів — усе на одному екрані, з вибором періоду від тридцяти хвилин до тридцяти днів. Там, де є жорстка межа, пунктиром показана вона: не «багато чи мало», а скільки залишилося до стелі.
Сайти опитуються в обхід DNS
Кожен домен панель перевіряє раз на хвилину — але звертається не за публічним DNS, а прямо на IP сервера. Це дрібниця з великими наслідками: якщо сайт відповідає по IP, але не відповідає за іменем, проблема не в сайті, а в записі DNS. Панель це розрізняє й пише про це прямо.
Окремо й рідше перевіряється те, що не змінюється щохвилини: DNS раз на чверть години, сертифікати раз на шість годин. У таблиці видно код відповіді, час відгуку, доступність за добу, строк сертифіката і кількість помилок.
Помилки без шуму
Лог вебсервера читається дописом: панель пам’ятає, на якому місці зупинилася, і при ротації не перечитує файл заново. Але головне не в цьому, а у фільтрі.
Домени, закриті навмисно, щохвилини пишуть у лог «доступ заборонено» — це працює захист, а не аварія. Записи від нашого ж моніторингу теж не помилки. Попередження й повідомлення не рахуються за збої. Без цієї чистки список помилок перетворюється на стрічку, у яку перестають дивитися.
Гроші поруч із метриками
Сервер падає не тільки від навантаження — іноді від рахунку. Тому в панелі є місячний трафік із часткою від квоти, витрати на сховище з прогнозом до кінця місяця й витрати на API з розбивкою за моделями. Прогноз рахується від реального темпу, а не від середнього за місяць.
Публічна сторінка окремо від панелі
Те, що бачить власник, і те, що можна показати клієнтам, — різні речі. Панель під паролем, а поруч публічна сторінка статусу: смуги доступності за дев’яносто днів, середній час відповіді й одна фраза зверху — працює чи ні.
Оновлення без доступу до чужого сервера
У нас немає SSH на сервери клієнтів і не повинно бути. Тому зв’язок улаштований у зворотний бік: установка сама раз на добу звертається до нашої панелі, підтверджує ліцензію й забирає оновлення, якщо воно є.
Ліцензія підписана й перевіряється офлайн на кожному запиті, а не запитом до нас — якщо наш сервер лежить, клієнтські панелі продовжують працювати. На випадок довгого простою закладено двотижневий запас: наша аварія не має гасити чужі установки.
Дрібні оновлення ставляться самі, великі — кнопкою. З нашої панелі можна розкотити версію примусово, але тільки на ті установки, у коді яких уже є приймач такого наказу. Це чесне обмеження архітектури, і воно видно в інтерфейсі.
Як це робилося
Що під капотом
Збирач
PHP за розкладом від root, читання системних лічильників, опитування доменів прямо на IP, дописне читання логів з фіксацією позиції. Зберігання — SQLite: метрики 35 днів, помилки 7.
Панель
Жодних зовнішніх бібліотек: графіки малюються в SVG на сервері. Ролі адміністратора й спостерігача, публічна сторінка статусу окремим шаром.
Продукт
Ліцензії на підписі Ed25519, офлайн-перевірка на кожному запиті, добовий checkin, двотижневий запас. Оновлення тягне сама установка — SSH до клієнта не потрібен.
Що вийшло
Панель, яку ми писали для себе, стоїть на восьми установках, п’ять із них — на доменах клієнтів. Вона однаково працює на VPS із повним доступом і на шаред-хостингу, де половина метрик недосяжна: у другому випадку вона просто не показує того, чого не може знати, замість того щоб малювати нулі.
І головне архітектурне рішення виявилося правильним: за весь час жодне оновлення не вимагало заходити на чужий сервер.
Схожий проєкт?
Обговорімо ваші цілі й подивімося, чим ми можемо допомогти.
Замовити безкоштовний кошторис →
