Перейти к содержимому

Уведомления для системного администратора

Сервер сам должен сообщать вам, когда что-то идёт не так. Не нужно заходить на машину каждые пять минут и смотреть 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-send
sudo tee /etc/notifly.env >/dev/null <<'EOF'
NOTIFLY_URL=https://your-notifly.example.com
NOTIFLY_TOKEN=AGdjfk_L.dKe8q
EOF
sudo chmod 600 /etc/notifly.env

Потом во всех скриптах достаточно подключить переменные:

Окно терминала
set -a; source /etc/notifly.env; set +a
notifly-send "Тест" "Привет с $(hostname)"

Для Windows-серверов используйте PowerShell-функцию Send-Notifly. Сохраните её в профиль C:\Program Files\WindowsPowerShell\Modules\Notifly\Notifly.psm1 (или просто dot-source через . C:\scripts\Notifly.ps1 в начале каждого скрипта):

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"
# Ограничиваем чтение только администраторами и SYSTEM
icacls "C:\ProgramData\Notifly\notifly.json" /inheritance:r /grant:r "SYSTEM:R" "Administrators:R"

Проверка:

Окно терминала
. C:\scripts\Notifly.ps1
Send-Notifly -Title "Тест" -Message "Привет с $env:COMPUTERNAME" -Priority 5

Все Windows-примеры в этом разделе подключают Notifly.ps1 через dot-source и вызывают Send-Notifly.