Мониторинг health check в Next.js для SaaS
Next.js (App Router на Vercel, Railway или self-hosted) — дефолтный стек многих indie SaaS. Нужен /api/health Route Handler, который внешний мониторинг вызывает без session cookie — и нужно решить, что значит «здоров», не сливая секреты и не долбя Postgres на каждую внешнюю проверку.
StillOnline выполняет HTTP GET с этого маршрута снаружи хоста, публикует страницу статуса и шлёт алерты через бота StillOnline, Slack или email.
Краткий ответ
Route Handlers в Next.js позволяют добавить app/api/health/route.ts с 200 + { "status": "ok" } быстрее двух секунд на production HTTPS. Зарегистрируйте URL в StillOnline — на Free один проект, один URL, проверка каждые пять минут (тарифы). По умолчанию liveness; DB ping — только если «up» = «БД доступна»; без секретов в JSON.
Шаблон Route Handler (App Router)
Для Vercel Edge держите handler edge-compatible — или runtime = 'nodejs', если нужны Prisma и native drivers.
// app/api/health/route.ts
import { NextResponse } from "next/server";
export const dynamic = "force-dynamic"; // не кэшировать проверку
export async function GET() {
return NextResponse.json({ status: "ok" }, { status: 200 });
}
Опциональный DB ping с коротким timeout на serverless — только если готовы к более шумным проверкам.
Трейдоффы: дизайн health URL.
Что не светить публично
| Не возвращать | Почему |
|---|---|
| URL БД и API keys | Утечка на публичном маршруте |
| Версии зависимостей детально | Поверхность атаки |
| Счётчики пользователей и выручки | Приватность и шум |
| Stack trace при ошибке | { "status": "error" } + 503 |
StillOnline смотрит код и время ответа — но /api/health читают и сканеры.
Кэш и CDN
| Проблема | Решение |
|---|---|
/api/health закэширован как static | dynamic = "force-dynamic" или revalidate = 0 |
| Middleware редиректит без auth | Исключите /api/health |
| Cold start Vercel | Минимальный handler — гайд Vercel |
Снаружи:
curl -sS https://yourdomain.com/api/health
StillOnline
- Вход.
- Новый проект.
/api/health, GET, 200, 5 мин (Free).- Страница статуса в API docs — быстрый старт.
Настройки → бот StillOnline — Telegram.
Связанные материалы
FAQ
Health в Next.js должен пинговать Postgres или Supabase?
Только если «up» = «БД доступна». Liveness-only снижает ложные срабатывания при миграциях — дизайн health · Neon/PlanetScale.
StillOnline работает с Next.js на Vercel Edge Runtime?
Да, если /api/health отдаёт 200 по публичному HTTPS. Edge не тянет некоторые Node DB drivers — проектируйте health или используйте nodejs runtime для DB ping.