Статус Страницы - не все так просто
Пару лет назад мне понадобилась Статус Страница (statuspage) для проекта. Требования были стандартными, но важными:
- Несколько страниц, компоненты, статусы и подписчики.
- Готовый облачный сервис без необходимости самостоятельного хостинга.
- Поддержка русского языка.
- Интеграция по API.
Я проанализировал рынок и быстро понял, что подходящих решений практически нет. Существующие западные сервисы не поддерживали русский язык, а из-за санкций возникли сложности с оплатой и доступом. Open-source решения не подходили, так как требовали самостоятельного хостинга и имели те же проблемы с локализацией.
Так я приступил к созданию собственного сервиса для развертывания Статус Страниц. Изначально я думал управиться за пару недель, но, как это часто бывает, всё оказалось сложнее.
Меня зовут Сергей Пронин, и в этой статье я расскажу о процессе разработки и о том, как родился сервис Pingera. Казалось бы, статус-пейдж — это просто список сервисов и их статусов для отображения пользователю. Но в процессе разработки выделилось три основных компонента: Наши Статус Страницы должны быть публичными, то есть доступными любому пользователю в интернете. При этом некоторые запросы к 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.

Первые сложности
API и авторизация
Инциденты
Подписчики
Домены
Где мы сейчас