← Блог

Мониторинг health check маршрута в Laravel для SaaS

Laravel — типичный стек indie SaaS: API биллинга, webhook, админка за Sanctum или session auth. Внешнему мониторингу нужен публичный GET-маршрут с 200 без cookie авторизации — обычно /health или встроенный /up в Laravel 11.

StillOnline выполняет HTTP GET по этому HTTPS URL снаружи VPS или PaaS, публикует страницу статуса и шлёт алерты владельцу через Telegram, Slack или email при сбое проверки. Сбои очереди и Redis часто требуют отдельной проверки или более глубокого handler — не каждая команда сворачивает всё в один маршрут.

Краткий ответ

Laravel routing позволяет зарегистрировать Route::get('/health', …) с 200 JSON быстрее двух секунд на production HTTPS hostname — или использовать фреймворковый /up в Laravel 11+. Зарегистрируйте полный URL в StillOnline (Free: один проект, один URL, внешняя проверка каждые пять минуттарифы). Держите /health лёгким; опциональные ping очереди или Redis — на втором URL с Pro (до 10 проверок на проект).

/health и Laravel /up

МаршрутТипичное использованиеЗаметка для StillOnline
GET /upLiveness по умолчанию в Laravel 11Подходит, если маршрут публичный и без auth
GET /healthКонвенция команды, API docsТа же семантика проверки — выберите один канонический URL
GET /api/healthAPI-only продукт с префиксомУкажите полный путь в README

Выберите один путь и используйте его в runbook, OpenAPI и StillOnline. Смена ломает закладки и путает интеграторов — см. дизайн health endpoint.

Минимальный controller /health

Исключите маршрут из auth middleware и CSRF. Handler должен быть быстрым — без тяжёлых job на каждую внешнюю проверку.

// routes/web.php or routes/api.php
Route::get('/health', function () {
    return response()->json(['status' => 'ok'], 200);
});

Проверьте снаружи ноутбука:

curl -sS https://api.yourproduct.com/health

Laravel middleware выполняется на каждом запросе — добавьте /health в $except у Authenticate и любого глобального редиректа анонимных пользователей на login.

Очередь и Redis: один URL или два?

СтратегияОтдаёт 503 когдаКомпромисс
Только livenessPHP-FPM мёртвЗелёный, пока queue workers остановлены
Redis ping в /healthRedis недоступенШумнее при кратких сбоях кэша
Отдельный /health/queueHeartbeat worker устарелНужен второй URL на Pro в StillOnline

Laravel queues работают в worker-процессах, не в цикле web-запроса. Зелёный /health не доказывает, что php artisan queue:work запущен. Варианты:

  1. Heartbeat worker — worker пишет в cache/БД; /health читает last_worker_ok и отдаёт 503 при устаревании (гайд по workers).
  2. Вторая проверка StillOnline — небольшой публичный маршрут, который обновляют только workers через sidecar HTTP или shared state.
  3. Component на странице статуса — отдельная метка «Фоновые задачи», когда web жив, а очередь нет.

Проверки Redis — Redis::connection()->ping() или Cache::store('redis')->get('ping'); timeout агрессивный (1–2 с), чтобы внешние проверки не зависали.

Деплой и типичные ошибки Octane

ПроблемаРешение
/health за authИсключите путь в middleware
Maintenance mode отдаёт 503Ожидаемо при деплое — опубликуйте запланированное обслуживание
Laravel Octane worker зависЛёгкий /health; политика рестарта отдельно от HTTP-проверок
Неверный APP_URL в редиректахStillOnline следует редиректам — укажите финальный HTTPS URL

Регистрация в StillOnline

  1. Входновый проект.
  2. HTTP-проверка → production /health (или /up), GET, ожидаемый 200, интервал пять минут на Free.
  3. Поделитесь страницей статуса в API docs — быстрый старт health URL.
  4. Настройки → подключите Telegram для алертов владельца.

Pro ($9/мес) — разделите web liveness и глубокую проверку queue/Redis на два URL. Сравнение стеков: health check в Next.js.

Связанные материалы

FAQ

StillOnline мониторит Laravel /up или кастомный /health?

Подойдёт любой вариант, если URL публичный, отдаёт 200, когда приложение обслуживает трафик, и стабилен между деплоями. Большинство команд стандартизируют /health в документации, даже когда /up уже есть.

StillOnline выполняет php artisan или SSH на сервер?

Нет. StillOnline делает только HTTP GET из публичного интернета — как curl снаружи. Смысл «здоров» вы реализуете в маршруте.

Как быстро StillOnline алертит при падении /health?

По умолчанию интервал пять минут и две неудачные проверки подряд — примерно 10 минут после устойчивого сбоя. Настройте маршрут на быстрый fail при мёртвых зависимостях; sub-minute SLA очереди только по HTTP-проверкам не ждите.