Мониторинг 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 /up | Liveness по умолчанию в Laravel 11 | Подходит, если маршрут публичный и без auth |
GET /health | Конвенция команды, API docs | Та же семантика проверки — выберите один канонический URL |
GET /api/health | API-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 когда | Компромисс |
|---|---|---|
| Только liveness | PHP-FPM мёртв | Зелёный, пока queue workers остановлены |
Redis ping в /health | Redis недоступен | Шумнее при кратких сбоях кэша |
Отдельный /health/queue | Heartbeat worker устарел | Нужен второй URL на Pro в StillOnline |
Laravel queues работают в worker-процессах, не в цикле web-запроса. Зелёный /health не доказывает, что php artisan queue:work запущен. Варианты:
- Heartbeat worker — worker пишет в cache/БД;
/healthчитаетlast_worker_okи отдаёт 503 при устаревании (гайд по workers). - Вторая проверка StillOnline — небольшой публичный маршрут, который обновляют только workers через sidecar HTTP или shared state.
- 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
- Вход → новый проект.
- HTTP-проверка → production
/health(или/up), GET, ожидаемый 200, интервал пять минут на Free. - Поделитесь страницей статуса в API docs — быстрый старт health URL.
- Настройки → подключите Telegram для алертов владельца.
Pro ($9/мес) — разделите web liveness и глубокую проверку queue/Redis на два URL. Сравнение стеков: health check в Next.js.
Связанные материалы
- Дизайн health endpoint
- Health check в Next.js SaaS
- Мониторинг фоновых workers и очередей
- Быстрый старт health URL
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-проверкам не ждите.