Настройка Uptime Monitoring для сайта
Uptime мониторинг — первая линия обороны. Пока не настроен базовый HTTP-check, всё остальное мониторирование не имеет смысла: вы можете не знать, что сайт упал, до первого звонка от клиента.
Задача здесь не только «пингануть главную страницу», но и покрыть критичные точки: API, admin-панель, health endpoint, CDN.
Self-hosted: Uptime Kuma
Uptime Kuma — бесплатный self-hosted инструмент с простым UI, поддержкой множества типов проверок и нотификаций.
# docker-compose.yml
services:
uptime-kuma:
image: louislam/uptime-kuma:1
volumes:
- uptime-kuma:/app/data
ports:
- "3001:3001"
restart: unless-stopped
volumes:
uptime-kuma:
Поддерживаемые типы мониторов: HTTP(S), TCP port, Ping, DNS, SSL certificate, Keyword (проверка наличия текста), JSON Query, Push (heartbeat), Steam Game Server, Docker Container.
Настройки через UI или через REST API:
# Создать монитор через API (Bearer token в Settings → API Keys)
curl -X POST http://uptime-kuma:3001/api/monitor \
-H "Authorization: Bearer your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Main Site",
"type": "http",
"url": "https://example.com/",
"interval": 60,
"retryInterval": 30,
"maxretries": 2,
"keyword": "Добро пожаловать",
"httpBodyEncoding": "json"
}'
Нотификации: Telegram, Slack, Email, PagerDuty, Webhook и ещё ~90 провайдеров.
Что мониторить
Минимальный набор для production сайта:
| URL | Тип | Интервал | Алерт при |
|---|---|---|---|
https://example.com/ |
HTTP + keyword | 60s | downtime > 1 мин |
https://example.com/health |
HTTP + JSON | 60s | status != 200 |
https://api.example.com/ping |
HTTP | 30s | downtime > 30s |
| SSL cert | Certificate | 1d | expires < 14d |
https://example.com/ |
DNS | 5m | resolve fails |
Health endpoint — простой контроллер, который проверяет базовые зависимости:
// routes/web.php
Route::get('/health', function () {
$checks = [
'database' => fn() => DB::connection()->getPdo() !== null,
'cache' => fn() => Cache::store('redis')->ping(),
'queue' => fn() => \Illuminate\Support\Facades\Queue::size() < 10000,
];
$results = [];
$healthy = true;
foreach ($checks as $name => $check) {
try {
$results[$name] = $check() ? 'ok' : 'fail';
} catch (\Throwable $e) {
$results[$name] = 'error: ' . $e->getMessage();
$healthy = false;
}
}
return response()->json([
'status' => $healthy ? 'ok' : 'degraded',
'checks' => $results,
'timestamp' => now()->toISOString(),
], $healthy ? 200 : 503);
})->middleware('throttle:60,1');
SaaS-решения
Если self-hosted неудобен или нужны мониторинговые узлы из разных гео-локаций:
Better Uptime / Better Stack — проверки из 10+ локаций, статус-страница, on-call scheduling. Есть бесплатный план.
UptimeRobot — 50 мониторов бесплатно, интервал 5 минут. Для старта достаточно.
Pingdom / Datadog Synthetics — enterprise-уровень, дорогие, оправданы при SLA.
Для критичных сервисов имеет смысл комбинировать: Uptime Kuma на своей инфраструктуре (частые проверки) + UptimeRobot (внешний observer из другой сети).
SSL-сертификаты
Отдельная точка внимания — истечение SSL. Браузеры не предупреждают, сайт просто становится недоступным.
Uptime Kuma имеет встроенный тип монитора SSL Certificate. Настроить алерт за 14 дней до истечения.
Альтернатива — скрипт в cron:
#!/bin/bash
DOMAIN=$1
DAYS_THRESHOLD=14
EXPIRY=$(echo | openssl s_client -connect ${DOMAIN}:443 -servername ${DOMAIN} 2>/dev/null \
| openssl x509 -noout -enddate 2>/dev/null \
| cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 ))
if [ "$DAYS_LEFT" -lt "$DAYS_THRESHOLD" ]; then
curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
-d "chat_id=$CHAT_ID" \
-d "text=SSL cert for $DOMAIN expires in $DAYS_LEFT days!"
fi
Status Page
Публичная статус-страница — опционально, но полезна при инцидентах: вместо отвечать на сотни одинаковых вопросов «сайт не работает?» — дать ссылку на страницу с актуальным статусом.
Uptime Kuma генерирует статус-страницу из коробки. Настроить на отдельном домене: status.example.com.
Сроки
Развёртывание Uptime Kuma, настройка 5-10 мониторов, Telegram-нотификации, базовая статус-страница: 2-3 часа.







