Статус Страницы - не все так просто
Пару лет назад мне понадобилась Статус Страница (statuspage) для проекта. Требования были стандартными, но важными:
- Несколько страниц, компоненты, статусы и подписчики.
- Готовый облачный сервис без необходимости самостоятельного хостинга.
- Поддержка русского языка.
- Интеграция по API.
Я проанализировал рынок и быстро понял, что подходящих решений практически нет. Существующие западные сервисы не поддерживали русский язык, а из-за санкций возникли сложности с оплатой и доступом. Open-source решения не подходили, так как требовали самостоятельного хостинга и имели те же проблемы с локализацией.
Так я приступил к созданию собственного сервиса для развертывания Статус Страниц. Изначально я думал управиться за пару недель, но, как это часто бывает, всё оказалось сложнее.
Меня зовут Сергей Пронин, и в этой статье я расскажу о процессе разработки и о том, как родился сервис Pingera.
Первые сложности
Казалось бы, статус-пейдж — это просто список сервисов и их статусов для отображения пользователю. Но в процессе разработки выделилось три основных компонента:
- Backend: база данных и API.
- Frontend админки: для настройки компонентов, создания инцидентов и управления.
- Frontend публичных страниц: для отображения сервисов и статусов конечным пользователям.
API и авторизация
Наши Статус Страницы должны быть публичными, то есть доступными любому пользователю в интернете. При этом некоторые запросы к API требуют авторизации, а другие — нет. Это сразу добавило сложности: например, если страница не опубликована, мы не возвращаем список сервисов или инцидентов.
Инциденты
Логика инцидентов оказалась на удивление сложной. У каждого инцидента есть несколько ключевых параметров:
- Статус: от «открыт» до «закрыт» с промежуточными этапами, такими как «поиск решения».
- Критичность: не все инциденты одинаково опасны.
- Связанные сервисы (компоненты): их статусы могут меняться в течение жизни инцидента.
- Оповещение подписчиков.
- Обновление инцидентов.
Всё это должно поддерживать полный цикл CRUD (создание, чтение, обновление, удаление) для пользователей. Проработка и кодирование этой логики для двух фронтендов и бэкенда заняла значительное время. После завершения работы над бэкендом разработка UI пошла намного быстрее.
Подписчики
Подписчики — это пользователи, которые хотят получать уведомления об инцидентах в ваших сервисах. Для предотвращения спама обязательна верификация, например, по электронной почте. Отправка уведомлений реализована асинхронно, чтобы создание инцидента не задерживалось ожиданием ответа от API.
Домены
Все Статус Страницы в Pingera доступны по субдоменам (например, status.pingera.ru). Это достаточно легко настроить через wildcard-сертификат в Nginx.
Однако с опцией Bring Your Own Domain (использование собственного домена, например, status.mycompany.ru) всё оказалось сложнее. Изначально мы писали собственные скрипты для добавления сертификатов и доменов в Nginx, но быстро поняли, что дублируем функциональность Ingress в Kubernetes с cert-manager (для сертификатов Let’s Encrypt). Так мы перешли на развёртывание всего проекта в Kubernetes.
Теперь, когда пользователь настраивает свой домен в админке, мы автоматически создаём Ingress-объект. Это обеспечивает мгновенное получение TLS-сертификата с автоматическим обновлением для всех страниц.
Где мы сейчас
Из относительно простого pet-проекта Pingera вырос в полноценный сервис, позволяющий создавать Статус Страницы с гибкой настройкой внешнего вида (CSS, различные шаблоны), структуры и обширной логикой. Кроме того, мы добавили мониторинг. Сейчас мы умеем мониторить веб-сайты, API, TCP-соединения и SSL-сертификаты. Синтетические проверки находятся на стадии разработки.
Мы не стремимся заменить полноценные системы мониторинга. Наша цель — фокусироваться на внешнем периметре. Серверы, с которых запускаются проверки, расположены как в России, так и по всему миру. Мы помогаем обнаруживать проблемы извне, если по какой-то причине ваш внутренний мониторинг их не видит или недоступен. А Статус Страницы Pingera позволяют вам открыто и честно информировать пользователей о любых проблемах и инцидентах.
У нас есть бесплатный тариф без необходимости привязки банковской карты. Вам не нужно быть инженером, чтобы создать Статус Страницу или настроить мониторинг веб-сайта с Pingera.