Уведомления для системного администратора
Сервер сам должен сообщать вам, когда что-то идёт не так. Не нужно
заходить на машину каждые пять минут и смотреть df -h, journalctl или статус
бэкапа — пусть сервер просто звонит, когда наступит порог.
Все рецепты на этих страницах работают на чистом Linux без дополнительных агентов
мониторинга. Достаточно bash, curl и cron/systemd. Для Windows-серверов
аналогичные сценарии реализуются через PowerShell + Task Scheduler — см.
секции Windows: PowerShell + Task Scheduler в каждом рецепте.
Доступные рецепты
Заголовок раздела «Доступные рецепты»| Сценарий | Когда придёт уведомление |
|---|---|
| Кончается место на диске | Свободного места меньше N % |
| Падение systemd-сервиса | Любой важный сервис ушёл в failed |
| Подозрительные SSH-входы | Удачный или неудачный вход по SSH |
| Срабатывание Fail2ban | Бан или разбан IP |
| Завершение бэкапа | Бэкап успешно сделан или упал |
| Истечение SSL-сертификата | До истечения < N дней |
| Высокая нагрузка / OOM | Загрузка CPU/RAM выше порога |
| Неудачные cron-задачи | Cron-job завершился с ошибкой |
Зачем это вообще
Заголовок раздела «Зачем это вообще»Базовый принцип: молчание — это не «всё хорошо», молчание — это «не знаю». Отдельные «успешные» уведомления (зелёные) тоже нужны, чтобы убедиться, что система жива и сама проверка работает. Например, ежедневный бэкап должен прислать «OK» — если его нет, что-то сломалось в самой проверке.
Шаблон скрипта
Заголовок раздела «Шаблон скрипта»Везде в этом разделе используется одинаковая обёртка для отправки. Сохраните её
один раз в /usr/local/bin/notifly-send:
#!/usr/bin/env bash# Использование:# notifly-send "Заголовок" "Текст сообщения" [priority]set -eu: "${NOTIFLY_URL:?NOTIFLY_URL not set}": "${NOTIFLY_TOKEN:?NOTIFLY_TOKEN not set}"
TITLE="${1:?title required}"MESSAGE="${2:?message required}"PRIORITY="${3:-5}"
curl -s --max-time 10 \ "$NOTIFLY_URL/message?token=$NOTIFLY_TOKEN" \ -H "Content-Type: application/json" \ -d "$(jq -n --arg t "$TITLE" --arg m "$MESSAGE" --argjson p "$PRIORITY" \ '{title:$t, message:$m, priority:$p}')" >/dev/nullСделайте файл исполняемым и положите токены в /etc/notifly.env:
sudo chmod +x /usr/local/bin/notifly-sendsudo tee /etc/notifly.env >/dev/null <<'EOF'NOTIFLY_URL=https://your-notifly.example.comNOTIFLY_TOKEN=AGdjfk_L.dKe8qEOFsudo chmod 600 /etc/notifly.envПотом во всех скриптах достаточно подключить переменные:
set -a; source /etc/notifly.env; set +anotifly-send "Тест" "Привет с $(hostname)"Шаблон скрипта (Windows)
Заголовок раздела «Шаблон скрипта (Windows)»Для Windows-серверов используйте PowerShell-функцию Send-Notifly. Сохраните её
в профиль C:\Program Files\WindowsPowerShell\Modules\Notifly\Notifly.psm1
(или просто dot-source через . C:\scripts\Notifly.ps1 в начале каждого скрипта):
$NotiflyConfigPath = "C:\ProgramData\Notifly\notifly.json"
function Send-Notifly { param( [Parameter(Mandatory)] [string] $Title, [string] $Message = "", [int] $Priority = 5 ) $cfg = Get-Content $NotiflyConfigPath -Raw | ConvertFrom-Json $body = @{ title = $Title; message = $Message; priority = $Priority } | ConvertTo-Json -Compress try { Invoke-RestMethod -Method Post ` -Uri "$($cfg.url)/message?token=$($cfg.token)" ` -ContentType "application/json; charset=utf-8" ` -Body ([System.Text.Encoding]::UTF8.GetBytes($body)) ` -TimeoutSec 10 | Out-Null } catch { Write-EventLog -LogName Application -Source "Notifly" -EntryType Warning ` -EventId 1000 -Message "Send-Notifly failed: $_" -ErrorAction SilentlyContinue }}Создайте конфиг (один раз, от администратора):
New-Item -ItemType Directory -Path "C:\ProgramData\Notifly" -Force | Out-Null@{ url = "https://your-notifly.example.com" token = "AGdjfk_L.dKe8q"} | ConvertTo-Json | Set-Content "C:\ProgramData\Notifly\notifly.json"
# Ограничиваем чтение только администраторами и SYSTEMicacls "C:\ProgramData\Notifly\notifly.json" /inheritance:r /grant:r "SYSTEM:R" "Administrators:R"Проверка:
. C:\scripts\Notifly.ps1Send-Notifly -Title "Тест" -Message "Привет с $env:COMPUTERNAME" -Priority 5Все Windows-примеры в этом разделе подключают Notifly.ps1 через dot-source
и вызывают Send-Notifly.