Sumchenko Works
ENEnglish versionСменить тему
P—04 · РазработкаВ работе

Website Health Monitor

Сервис на Go, который круглосуточно проверяет, что мои проекты живы и действительно работают, — с веб-интерфейсом, API и историей в PostgreSQL.

Код
Роль
Постановка, архитектура, разработка на Go с Claude Code
Период
2026.01 → …
Статус
В работе
Стек
Go · PostgreSQL · Docker · GitHub Actions · Grafana

Интерфейс

01 / 05
Сводка проектовУпавшие цели наверху, сводка «Не работает: 1 из 7», последняя проверка, время ответа и аптайм за 24 ч. Цели — реальные адреса этого портфолио.

Задача

Ссылки на пет-проекты уходят работодателям, и нельзя, чтобы по ссылке открылся упавший сервис. Проекты живут на VPS и бесплатных хостингах — они засыпают, отвечают с холодным стартом, а бесплатная база Supabase замирает после недели без запросов. Узнавать о падении от рекрутера — поздно.

Решение

Монитор по расписанию проверяет каждую цель — не только код ответа, но и ключевое слово на странице, — пишет результат в PostgreSQL и показывает сводку «всё зелёное / что-то упало» с аптаймом за сутки. Цели добавляются, меняются и отключаются в веб-интерфейсе или через API и подхватываются без перезапуска.

Первую версию я написал в январе как учебный проект на Go. В октябре вернулся к нему с новой целью — следить за проектами из этого портфолио — провёл аудит, нашёл 10 проблем и составил план из 7 этапов. Код пишется в Claude Code по этому плану с журналом решений; три этапа готовы.

Цели

  1. 01Узнавать о падении раньше работодателя
  2. 02Проверять, что проект работает, а не просто отвечает
  3. 03Добавлять и отключать проекты без пересборки
  4. 04Держать бесплатные сервисы активными

Функции

Проверка кода ответа и ключевого словаСвои интервал, таймаут и заголовки у целиИзменения применяются на летуВеб-интерфейс со сводкой и аптаймом за 24 чJSON API для целейBasic Auth и защита от CSRFВстроенные миграции PostgreSQLDocker, healthcheck и CI с тестами

Ключевые требования

IDТребованиеПриоритет
FR-01Цель «жива», если ответ пришёл с ожидаемым кодом (по умолчанию любой 2xx после редиректов) и, если задано, содержит ключевое слово.Must
FR-02Добавление, изменение и отключение цели применяются без перезапуска сервиса.Must
FR-03Одна цель никогда не проверяется параллельно сама с собой.Must
FR-04Интервал не меньше 30 с, таймаут не больше 120 с и меньше интервала.Must
FR-05Уведомления в Telegram о падении и восстановлении — без спама.Should
NFR-01Остановка или деплой сервиса не порождают ложных падений.Must
NFR-02Интерфейс и API — только с паролем; /healthz открыт для внешнего мониторинга.Must
NFR-03Схема БД меняется только новыми миграциями; старые данные переносятся.Must

Сценарии

ВладелецПроект упал
  1. 01Проверка не нашла ключевое слово: страница отдала 200, но это заглушка с ошибкой
  2. 02Результат с причиной записывается в health_checks
  3. 03В интерфейсе цель поднимается наверх списка красной, сводка — «1 упал»
  4. 04После этапа 5 — сообщение в Telegram и ещё одно при восстановлении
ВладелецНовый проект в портфолио
  1. 01Добавляет цель в форме: адрес, ключевое слово, таймаут на холодный старт
  2. 02Сервер проверяет настройки и сохраняет цель
  3. 03Планировщик сразу запускает проверки — без перезапуска

Ход работы

  1. 2026.01Первая версияПроверки по списку в коде, PostgreSQL, Docker, CI с тестами, вывод в Grafana.
  2. 2026.10Этап 0: аудит и планНовая цель — мониторинг портфолио; 10 найденных проблем и план из 7 этапов.
  3. 2026.10Этапы 1–2: ядро и цели в БДЛогика статусов, таймауты, миграции, pgx, корректная остановка; таблица целей, ключевое слово, заголовки, подхват на лету.
  4. 2026.10Этап 3: интерфейс и APIВеб-интерфейс без JS-фреймворков, JSON API, валидация, Basic Auth, защита от CSRF, /healthz.
  5. ДалееЭтапы 4–7Grafana как код, уведомления в Telegram, качество и CI, деплой на VPS с внешним мониторингом самого чекера.

Сложности

«Отвечает» не значит «работает»Упавшее приложение может отдавать 200 со страницей ошибки. Поэтому у цели есть ключевое слово, которое ищется в первом мегабайте ответа.
Ложные падения при деплоеПроверки, прерванные остановкой сервиса или изменением цели, отбрасываются, а обработчик дописывает все результаты до закрытия канала.
Изменения целей без рестартаГорутина на цель и семафор вместо пула воркеров: планировщик сверяет список с БД и точечно запускает, останавливает или перезапускает проверки.
Basic Auth и CSRFБраузер сам подставляет Basic Auth в запросы с чужих сайтов. Формы и API закрыты http.CrossOriginProtection из Go 1.25.

Результат

Готовы три этапа из семи — около 3 200 строк Go вместе с 34 тестами, включая интеграционные на PostgreSQL. Сервис проверяет цели, применяет изменения на лету и показывает сводку с аптаймом.

Дальше — дашборд Grafana из репозитория, уведомления в Telegram и деплой на VPS рядом с проектами, за которыми он следит.

Технологии

Следующий · P—01Mito