Знаете это чувство? Звонит клиент. Говорит: «Сайт не открывается». Вы проверяете — действительно, 502 ошибка. Пока разбирались, пока чинили, прошло 40 минут. Клиент уже написал в соцсети, что ваш сайт «вечно лежит». Репутация — в минус.
А ведь можно было узнать о проблеме через 30 секунд после её возникновения. Получить алерт в Telegram. Открыть ноутбук. Починить. Клиент даже не успел бы заметить.
Разница между этими двумя сценариями — одна: мониторинг. Не «какой-нибудь плагин для аптайма», а полноценная система observability, которая видит всё: доступность сайта, скорость ответа, нагрузку на сервер, состояние базы данных, срок действия SSL-сертификата.
Сегодня построим такую систему с нуля. Бесплатно. На своём сервере. Без зависимости от сторонних сервисов, которые могут закрыться или поднять цены.
Что вообще нужно мониторить
Прежде чем ставить инструменты, давайте определимся, что именно мы хотим видеть. Мониторинг WordPress — это не одна метрика. Это четыре слоя.
Слой 1: Доступность (Uptime)
Самое базовое. Отвечает ли сайт? Какой код возвращает? Сколько времени отвечает? Если сайт лежит — вы должны узнать об этом первыми, а не от клиентов.
Слой 2: Производительность (Performance)
Сайт может быть доступен, но тормозить. TTFB выше 800 мс, LCP больше 2.5 секунд, CLS скачет. Google это видит. Пользователи тоже. Но без мониторинга вы об этом не узнаете, пока не проверите PageSpeed вручную.
Слой 3: Ресурсы сервера (Infrastructure)
CPU, RAM, диск, сеть. Если PHP-FPM съедает всю память — сайт начнёт падать с 502 ошибкой (мы разбирали это в статье про 502). Если диск забьётся логами — перестанут писаться новые данные. Если MySQL упрётся в лимит подключений — база встанет.
Слой 4: Бизнес-метрики (Application)
Для WooCommerce это количество заказов в час, брошенные корзины, время оформления заказа. Для блога — количество комментариев, время генерации страницы. Эти метрики говорят о здоровье бизнеса, а не только о здоровье сервера.
Сегодня настроим все четыре слоя. Начнём с самого простого — проверки доступности.
Uptime Kuma: ваш личный сторожевой пёс
Помните, как мы упоминали Uptime Kuma в статье про бэкапы? Тогда это был просто способ проверить, работает ли сайт. Теперь поговорим о нём серьёзно.
Uptime Kuma — это self-hosted инструмент мониторинга. Красивый интерфейс, поддержка HTTP(S), TCP, DNS, push-мониторинга, SSL-сертификатов. И главное — он бесплатный, с открытым кодом, и работает на вашем сервере.
Установка через Docker (рекомендуется)
Самый чистый способ — через Docker. Создаём папку и запускаем:
mkdir -p /opt/uptime-kuma
cd /opt/uptime-kuma
# Создаём docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
ports:
- "3001:3001"
volumes:
- ./data:/app/data
restart: unless-stopped
EOF
# Запускаем
docker-compose up -dЧерез минуту Uptime Kuma доступен по адресу http://your-server:3001. Открываем, создаём администратора, и можно добавлять мониторы.
Установка без Docker (для shared-хостинга)
Если Docker недоступен, ставим напрямую:
# Установка Node.js 18+
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs
# Клонируем Uptime Kuma
git clone https://github.com/louislam/uptime-kuma.git
cd uptime-kuma
npm run setup
# Запускаем
node server/server.jsДля автозапуска через systemd создаём сервис:
sudo nano /etc/systemd/system/uptime-kuma.serviceСодержимое:
[Unit]
Description=Uptime Kuma
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/uptime-kuma
ExecStart=/usr/bin/node server/server.js
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.targetАктивируем:
sudo systemctl daemon-reload
sudo systemctl enable uptime-kuma
sudo systemctl start uptime-kumaНастройка мониторов для WordPress
Теперь добавим мониторы. В Uptime Kuma жмём «Add New Monitor» и создаём несколько проверок.
Монитор 1: Главная страница (HTTP)
- Тип: HTTP(s)
- URL:
https://custom-code.ru/ - Интервал: 60 секунд
- Expected HTTP Status: 200
- Heartbeat Interval: 60
- Retries: 3
Это базовая проверка. Если сайт вернёт не 200 — получите алерт.
Монитор 2: Админка WordPress
- Тип: HTTP(s)
- URL:
https://custom-code.ru/wp-login.php - Expected HTTP Status: 200
- Интервал: 300 секунд (5 минут)
Если админка недоступна — вы не сможете войти и что-то исправить. Лучше узнать об этом сразу.
Монитор 3: TTFB (время ответа сервера)
Uptime Kuma показывает время ответа, но не даёт алертов по нему напрямую. Поэтому создаём отдельный скрипт-проверку.
Создаём файл /opt/uptime-kuma/check-ttfb.sh:
#!/bin/bash
URL="https://custom-code.ru/"
MAX_TTFB=800 # Максимальный TTFB в мс
# Делаем запрос и получаем время до первого байта
TTFB=$(curl -o /dev/null -s -w '%{time_starttransfer}' "$URL" | awk '{printf "%.0f", $1 * 1000}')
if [ "$TTFB" -gt "$MAX_TTFB" ]; then
echo "TTFB too high: ${TTFB}ms (max: ${MAX_TTFB}ms)"
exit 1
else
echo "TTFB OK: ${TTFB}ms"
exit 0
fiДелаем исполняемым:
chmod +x /opt/uptime-kuma/check-ttfb.shВ Uptime Kuma добавляем монитор типа «Push» и вызываем этот скрипт через cron каждые 5 минут.
Монитор 4: SSL-сертификат
Uptime Kuma умеет проверять срок действия SSL. Добавляем монитор:
- Тип: HTTP(s)
- URL:
https://custom-code.ru/ - Включаем: «Ignore TLS/SSL errors» — нет, наоборот, проверяем сертификат
- Max Redirects: 0
Uptime Kuma автоматически отправит алерт за 14 дней до истечения сертификата. Больше никаких просроченных SSL.
Монитор 5: База данных (MySQL)
Если база недоступна — сайт падает. Добавляем TCP-монитор:
- Тип: TCP Port
- Host:
localhost - Port:
3306 - Интервал: 60 секунд
Если MySQL упадёт — узнаете через минуту.
Монитор 6: Redis
Аналогично для Redis:
- Тип: TCP Port
- Host:
localhost - Port:
6379
Алерты в Telegram: чтобы не пропустить
Мониторинг без алертов — это просто красивые графики, на которые никто не смотрит. Настоящая ценность — в мгновенных уведомлениях.
Создаём Telegram-бота
- Открываем в Telegram
@BotFather - Отправляем
/newbot - Придумываем имя и username
- Получаем токен вида
123456789:ABCdefGHIjklMNOpqrsTUVwxyz
Получаем chat_id
Пишем что-нибудь нашему боту, потом открываем:
curl https://api.telegram.org/bot/getUpdates В ответе ищем "chat":{"id":123456789} — это ваш chat_id.
Настраиваем в Uptime Kuma
Идём в Settings → Notifications → Add New Notification → Telegram. Заполняем:
- Bot Token: ваш токен
- Chat ID: ваш chat_id
Жмём «Test» — должно прийти тестовое сообщение. Если пришло — сохраняем и применяем ко всем мониторам.
Что приходит в алерте:
🔴 [DOWN] Custom Code - Main Page
Time (UTC): 2026-06-21 14:30:00
Type: HTTP(s)
https://custom-code.ru/
Error: connect ECONNREFUSED 127.0.0.1:443А когда сайт восстановится:
✅ [UP] Custom Code - Main Page
Time (UTC): 2026-06-21 14:32:00
Type: HTTP(s)
https://custom-code.ru/Prometheus + Grafana: мониторинг ресурсов сервера
Uptime Kuma отлично проверяет доступность. Но он не показывает, что происходит внутри сервера. Для этого нужен Prometheus (собирает метрики) и Grafana (рисует красивые графики).
Установка через Docker Compose
Создаём папку /opt/monitoring и добавляем в docker-compose.yml:
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
restart: unless-stopped
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|container)($$|/)'
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=your_password_here
restart: unless-stopped
volumes:
prometheus-data:
grafana-data:Конфигурация Prometheus
Создаём prometheus.yml:
global:
scrape_interval: 15s
scrape_configs:
# Метрики сервера
- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100']
# Метрики Nginx (если установлен nginx-prometheus-exporter)
- job_name: 'nginx'
static_configs:
- targets: ['localhost:9113']
# Метрики MySQL
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104']Устанавливаем экспортеры
Для Nginx:
docker run -d --name nginx-exporter \
-p 9113:9113 \
nginx/nginx-prometheus-exporter:latest \
-nginx.scrape-uri=http://localhost:8080/stub_statusДля MySQL:
docker run -d --name mysql-exporter \
-p 9104:9104 \
-e DATA_SOURCE_NAME="wordpress_user:password@(localhost:3306)/" \
prom/mysqld-exporterОткрываем Grafana
Заходим на http://your-server:3000. Логин: admin, пароль: тот, что указали в docker-compose.yml.
Добавляем Prometheus как Data Source:
- Configuration → Data Sources → Add data source
- Выбираем Prometheus
- URL:
http://prometheus:9090 - Save & Test
Импортируем готовые дашборды
В Grafana тысячи готовых дашбордов. Импортируем самые полезные:
- Node Exporter Full: ID
1860— метрики сервера (CPU, RAM, диск, сеть) - Nginx: ID
12621— метрики веб-сервера - MySQL Overview: ID
7362— метрики базы данных
Импорт: Dashboards → Import → вводим ID → выбираем Prometheus → Import.
Мониторинг Core Web Vitals
Доступность и ресурсы — это хорошо. Но что с производительностью с точки зрения пользователя? Здесь на помощь приходит CrUX API от Google.
Скрипт для проверки CWV
Создаём /opt/monitoring/check-cwv.sh:
#!/bin/bash
URL="https://custom-code.ru/"
API_KEY="your_google_api_key"
# Запрос к CrUX API
RESPONSE=$(curl -s "https://chromeuxreport.googleapis.com/v1/records:queryRecord?url=$URL&key=$API_KEY")
# Парсим метрики
LCP=$(echo $RESPONSE | jq -r '.record.metrics.largest_contentful_paint.percentile')
INP=$(echo $RESPONSE | jq -r '.record.metrics.interaction_to_next_paint.percentile')
CLS=$(echo $RESPONSE | jq -r '.record.metrics.cumulative_layout_shift.percentile')
# Конвертируем в нормальные единицы
LCP_SEC=$(echo "scale=2; $LCP / 1000" | bc)
CLS_FIXED=$(echo "scale=3; $CLS / 100" | bc)
echo "LCP: ${LCP_SEC}s | INP: ${INP}ms | CLS: $CLS_FIXED"
# Алерт, если метрики плохие
if [ "$LCP" -gt 2500 ] || [ "$INP" -gt 200 ] || [ "$CLS" -gt 10 ]; then
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="⚠️ Core Web Vitals Alert for $URL:
LCP: ${LCP_SEC}s (target: < 2.5s)
INP: ${INP}ms (target: < 200ms)
CLS: $CLS_FIXED (target: < 0.1)"
fiПолучить Google API Key можно в Google Cloud Console. CrUX API бесплатный до 25 000 запросов в день.
Добавляем в cron:
# Каждый день в 12:00
0 12 * * * /opt/monitoring/check-cwv.shМониторинг PHP-FPM
PHP-FPM — это сердце WordPress. Если он тормозит или переполнен — сайт падает. Настроим мониторинг его статуса.
Включаем status page
В конфиге пула PHP-FPM (/etc/php/8.2/fpm/pool.d/www.conf) раскомментируем:
pm.status_path = /status
ping.path = /pingВ конфиге Nginx добавляем:
location ~ ^/(status|ping)$ {
access_log off;
allow 127.0.0.1;
deny all;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}Перезагружаем:
sudo systemctl reload php8.2-fpm
sudo systemctl reload nginxСкрипт мониторинга PHP-FPM
Создаём /opt/monitoring/check-php-fpm.sh:
#!/bin/bash
STATUS_URL="http://127.0.0.1/status?json"
MAX_ACTIVE=40 # Максимум активных процессов
# Получаем статус
RESPONSE=$(curl -s "$STATUS_URL")
# Парсим метрики
ACTIVE=$(echo $RESPONSE | jq -r '.["active processes"]')
IDLE=$(echo $RESPONSE | jq -r '.["idle processes"]')
TOTAL=$(echo $RESPONSE | jq -r '.["total processes"]')
MAX_CHILDREN=$(echo $RESPONSE | jq -r '.["max children reached"]')
SLOW_REQ=$(echo $RESPONSE | jq -r '.["slow requests"]')
echo "Active: $ACTIVE | Idle: $IDLE | Total: $TOTAL | Max reached: $MAX_CHILDREN | Slow: $SLOW_REQ"
# Алерт, если слишком много активных процессов
if [ "$ACTIVE" -gt "$MAX_ACTIVE" ]; then
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="⚠️ PHP-FPM Alert:
Active processes: $ACTIVE (max: $MAX_ACTIVE)
Total processes: $TOTAL
Slow requests: $SLOW_REQ
Max children reached: $MAX_CHILDREN"
fi
# Алерт, если есть медленные запросы
if [ "$SLOW_REQ" -gt 10 ]; then
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="⚠️ PHP-FPM: $SLOW_REQ slow requests detected. Check slow.log"Добавляем в cron (каждые 5 минут):
*/5 * * * * /opt/monitoring/check-php-fpm.shМониторинг дискового пространства
Одна из самых частых причин падений — забитый диск. Логи, кэш, бэкапы — всё это растёт со временем.
Скрипт проверки диска
Создаём /opt/monitoring/check-disk.sh:
#!/bin/bash
THRESHOLD=85 # Порог в процентах
# Проверяем все смонтированные файловые системы
df -h | awk 'NR>1 {print $5 " " $6}' | while read usage mount; do
percent=${usage%\%}
if [ "$percent" -gt "$THRESHOLD" ]; then
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d text="⚠️ Disk Alert: $mount is ${usage} full"
fi
doneДобавляем в cron (каждые 15 минут):
*/15 * * * * /opt/monitoring/check-disk.shЦентрализованный скрипт алертов
Чтобы не плодить кучу скриптов, соберём всё в один. Создаём /opt/monitoring/monitor-all.sh:
#!/bin/bash
# Конфигурация
BOT_TOKEN="your_bot_token"
CHAT_ID="your_chat_id"
SITE_URL="https://custom-code.ru"
MAX_TTFB=800
# Функция отправки в Telegram
send_alert() {
curl -s -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d chat_id="$CHAT_ID" \
-d parse_mode="HTML" \
-d text="$1"
}
# 1. Проверка доступности
HTTP_CODE=$(curl -o /dev/null -s -w '%{http_code}' "$SITE_URL")
if [ "$HTTP_CODE" != "200" ]; then
send_alert "🔴 Site DOWN
URL: $SITE_URL
HTTP Code: $HTTP_CODE"
fi
# 2. Проверка TTFB
TTFB=$(curl -o /dev/null -s -w '%{time_starttransfer}' "$SITE_URL" | awk '{printf "%.0f", $1 * 1000}')
if [ "$TTFB" -gt "$MAX_TTFB" ]; then
send_alert "⚠️ Slow Response
URL: $SITE_URL
TTFB: ${TTFB}ms (max: ${MAX_TTFB}ms)"
fi
# 3. Проверка SSL
DAYS_LEFT=$(echo | openssl s_client -connect custom-code.ru:443 -servername custom-code.ru 2>/dev/null | openssl x509 -noout -enddate | awk -F= '{print $2}' | xargs -I {} date -d {} +%s)
NOW=$(date +%s)
DAYS=$(( (DAYS_LEFT - NOW) / 86400 ))
if [ "$DAYS" -lt 14 ]; then
send_alert "⚠️ SSL Expiring
Domain: custom-code.ru
Days left: $DAYS"
fi
# 4. Проверка PHP-FPM
ACTIVE=$(curl -s "http://127.0.0.1/status?json" | jq -r '.["active processes"]')
if [ "$ACTIVE" -gt 40 ]; then
send_alert "⚠️ PHP-FPM Overloaded
Active processes: $ACTIVE"
fi
# 5. Проверка MySQL
if ! mysqladmin -u wordpress -p'password' ping > /dev/null 2>&1; then
send_alert "🔴 MySQL DOWN
Cannot connect to database"
fi
# 6. Проверка Redis
if ! redis-cli ping > /dev/null 2>&1; then
send_alert "🔴 Redis DOWN
Cannot connect to Redis"
fi
# 7. Проверка диска
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
if [ "$DISK_USAGE" -gt 85 ]; then
send_alert "⚠️ Disk Space Low
Usage: ${DISK_USAGE}%"
fi
echo "[$(date)] Monitoring check completed"Делаем исполняемым и добавляем в cron:
chmod +x /opt/monitoring/monitor-all.sh
# Каждые 5 минут
*/5 * * * * /opt/monitoring/monitor-all.sh >> /var/log/monitoring.log 2>&1Мониторинг Core Web Vitals через Lighthouse CI
Для регулярной проверки производительности используем Lighthouse CI. Он запускает реальные тесты PageSpeed и сохраняет результаты.
Установка:
npm install -g @lhci/cli@latestКонфигурация lighthouserc.json:
{
"ci": {
"collect": {
"url": [
"https://custom-code.ru/",
"https://custom-code.ru/sample-article/"
],
"numberOfRuns": 3
},
"assert": {
"assertions": {
"categories:performance": ["error", {"minScore": 0.9}],
"categories:accessibility": ["error", {"minScore": 0.9}],
"largest-contentful-paint": ["warn", {"maxNumericValue": 2500}],
"cumulative-layout-shift": ["warn", {"maxNumericValue": 0.1}]
}
},
"upload": {
"target": "temporary-public-storage"
}
}
}Запуск:
lhci autorunДобавляем в cron (раз в день):
0 3 * * * cd /opt/monitoring && lhci autorun >> /var/log/lighthouse.log 2>&1Дашборд Grafana: всё в одном месте
Теперь собираем всё в красивый дашборд. В Grafana создаём новый Dashboard и добавляем панели:
Панель 1: Uptime за 30 дней
Используем данные из Prometheus:
avg_over_time(up{job="wordpress"}[30d]) * 100Показывает процент доступности. Цель — 99.9%.
Панель 2: TTFB в реальном времени
probe_duration_seconds{job="blackbox"}Панель 3: CPU и RAM
# CPU
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# RAM
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100Панель 4: PHP-FPM активные процессы
Для этого нужен PHP-FPM exporter. Устанавливаем:
docker run -d --name php-fpm-exporter \
-p 9253:9253 \
hipages/php-fpm_exporter \
--php-fpm.scrape-uri "http://localhost/status?json"Панель 5: MySQL connections
mysql_global_status_threads_connectedАлерты в Grafana
Grafana умеет сама отправлять алерты. Настраиваем:
- Alerting → Contact points → Add contact point
- Тип: Telegram
- Вводим Bot Token и Chat ID
- Save
Теперь создаём правила:
Правило 1: Высокая нагрузка CPU
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80Алерт, если CPU > 80% в течение 5 минут.
Правило 2: Мало места на диске
(1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100 > 85Правило 3: MySQL down
mysql_up == 0Правило 4: PHP-FPM перегружен
php_fpm_active_processes > 40Чек-лист настройки мониторинга
- ✅ Uptime Kuma установлен и доступен
- ✅ Добавлены мониторы: главная, админка, SSL, MySQL, Redis
- ✅ Настроены Telegram-алерты
- ✅ Prometheus + Node Exporter установлены
- ✅ Grafana установлена с дашбордами
- ✅ Импортированы готовые дашборды (Node, Nginx, MySQL)
- ✅ Настроен мониторинг PHP-FPM
- ✅ Настроен мониторинг Core Web Vitals
- ✅ Настроены алерты в Grafana
- ✅ Централизованный скрипт мониторинга работает через cron
- ✅ Протестированы алерты (искусственно «уронили» сервис)
Решение частых проблем
Uptime Kuma показывает «DOWN», но сайт работает
Проверьте три вещи:
- Firewall: возможно, сервер блокирует запросы от Uptime Kuma
- Cloudflare: если сайт за Cloudflare, он может блокировать «подозрительные» запросы
- User-Agent: добавьте в Uptime Kuma кастомный заголовок
User-Agent: UptimeKumaи разрешите его в Nginx
Telegram-алерты не приходят
Проверьте:
# Тестируем отправку вручную
curl -X POST "https://api.telegram.org/bot/sendMessage" \
-d chat_id= \
-d text="Test message"
# Если не работает — проверьте токен и chat_id
# Если работает — проблема в настройках Uptime Kuma или Grafana Grafana не показывает данные
Проверьте:
# Prometheus работает?
curl http://localhost:9090/-/healthy
# Node Exporter работает?
curl http://localhost:9100/metrics | head
# Prometheus видит цели?
curl http://localhost:9090/api/v1/targetsАлерты приходят слишком часто (alert fatigue)
Это классическая проблема. Если алертов слишком много — вы перестаёте на них реагировать. Решения:
- Увеличьте пороги: вместо CPU > 80% поставьте > 90%
- Добавьте задержку: алерт только если проблема длится больше 5 минут
- Группируйте алерты: один алерт вместо десяти
- Настройте quiet hours: не будить ночью, если не критично
Как мониторить WordPress Multisite?
Для сети сайтов добавьте в Uptime Kuma мониторы для каждого подсайта. Или используйте скрипт:
#!/bin/bash
# Мониторинг всех сайтов сети
SITES=$(wp site list --field=url --path=/var/www/wordpress)
for site in $SITES; do
HTTP_CODE=$(curl -o /dev/null -s -w '%{http_code}' "$site")
if [ "$HTTP_CODE" != "200" ]; then
send_alert "🔴 Site DOWN: $site (HTTP $HTTP_CODE)"
fi
doneИтог
Мониторинг — это не роскошь. Это необходимость. Без него вы слепы. Сайт может лежать часами, а вы будете об этом знать только от злых клиентов. SSL-сертификат может истечь, и браузеры будут пугать посетителей. База данных может медленно умирать, а вы заметите это, только когда она окончательно встанет.
С настройкой мониторинга из этой статьи вы получаете:
- Мгновенные алерты в Telegram при любых проблемах
- Полную видимость состояния сервера и приложений
- Историю метрик для анализа трендов
- Проактивное обнаружение проблем до того, как они станут критичными
Настройка занимает 2-3 часа. Но она окупается в первый же раз, когда вы получаете алерт о падении сайта в 3 часа ночи, чините его за 5 минут, и никто из пользователей даже не замечает проблемы.
Начните с простого: установите Uptime Kuma и настройте Telegram-алерты. Этого уже достаточно, чтобы спать спокойно. Потом добавляйте Prometheus и Grafana — когда будете готовы к более глубокой аналитике.
И помните: мониторинг — это не «поставил и забыл». Это живой процесс. Пороги нужно настраивать. Алерты — тюнинговать. Дашборды — обновлять. Но это та работа, которая спасает репутацию, нервы и деньги.