Beszel: лёгкий мониторинг сервера с алертами в Telegram

Published: 2026-06-11

Grafana и Prometheus — отличные инструменты, но тяжёлые. Для одного VPS я использую Beszel — Go-бинарник, который даёт графики CPU, памяти, диска и сети в чистом UI практически без конфигурации.

Что такое Beszel

Beszel — панель мониторинга «всё в одном». Состоит из двух компонентов:

  • Hub — веб-интерфейс и хранилище данных (работает как под в k0s)
  • Agent — лёгкий бинарник; запускается на каждом наблюдаемом хосте и отправляет метрики на hub

Hub разворачивается через 12-setup-beszel.sh. Agent работает на хосте (вне кластера) как systemd-сервис.

Деплой hub

yamlcontainers:
  - name: beszel
    image: henrygd/beszel:latest
    ports:
      - containerPort: 8090
    env:
      - name: TZ
        value: "Europe/Moscow"
    volumeMounts:
      - name: data
        mountPath: /beszel_data
    resources:
      requests:
        memory: "32Mi"
        cpu: "10m"
      limits:
        memory: "128Mi"
        cpu: "200m"

Hub хранит SQLite-базу в /beszel_data — каталог смонтирован как hostPath-том из /var/lib/beszel. Лимиты ресурсов минимальны — 128 МБ более чем достаточно для установки с одним хостом.

Telegram-алерты

Скрипт установки создаёт Kubernetes Secret с токеном Telegram-бота и ID чата:

bashkubectl create secret generic beszel-telegram \
    --from-literal=bot-token="$TG_BOT_TOKEN" \
    --from-literal=chat-id="$TG_CHAT_ID"

Beszel читает их и отправляет сообщение в Telegram-чат когда:

  • Загрузка CPU превышает 80% более 5 минут
  • Использование памяти превышает 85%
  • Использование диска превышает 90%
  • Agent отключается (хост недоступен)

Последний алерт — самый полезный: если VPS перезагружается, падает или теряет сеть, Beszel отправляет уведомление в Telegram примерно через 30 секунд.

Agent на хосте

Бинарник agent устанавливается на хосте и работает как systemd-сервис. Он подключается к hub по WebSocket на порту 8090. Hub наружу не публикуется (нет публичного IngressRoute для UI мониторинга — доступ через kubectl port-forward или SSH-туннель).

bash# Открыть локальный туннель к Beszel UI
kubectl port-forward svc/beszel 8090:8090
# Затем открыть http://localhost:8090

Что отслеживается

  • Загрузка CPU по ядрам
  • Использование памяти и swap
  • I/O и использование диска по файловым системам
  • Входящий и исходящий сетевой трафик по интерфейсам
  • Статистика контейнеров (через Docker/containerd socket)

Статистика контейнеров показывает CPU и память по подам — это частично дублирует данные Prometheus. Но для быстрого взгляда графики Beszel читаются легче, чем дашборды Grafana.

Почему не просто Prometheus + Grafana

На VPS с 4 ГБ RAM Prometheus + Grafana + Alertmanager потребляют около 400–500 МБ в простое. Hub и agent Beszel вместе занимают меньше 50 МБ. Компромисс — у Beszel нет языка запросов и собственных правил алертинга, а срок хранения метрик ограничен. Для личного сервера «CPU высокий» — достаточная информация; перцентильные гистограммы мне не нужны.

Prometheus всё равно установлен (через Helm-конфиг k0s), потому что данные kube-state-metrics полезны. Но Grafana не развёрнута — встроенного UI Prometheus хватает для редких случаев, когда нужно покопаться во внутренностях кластера.


Установка

bash# 12-setup-beszel.sh создаёт Deployment и Service
kubectl apply -f k0s-setup/manifests/beszel.yaml

# Установка agent на хосте
curl -sL https://raw.githubusercontent.com/henrygd/beszel/main/supplemental/install-agent.sh | \
  bash -s -- -p 45876 -k "<публичный-ключ-hub>"

# Включить и запустить
systemctl enable --now beszel-agent

Hub генерирует публичный ключ при первом запуске. Скопировать его из UI Beszel: System → Add System → Public key.


Персистентное хранилище

Hub пишет метрики в SQLite в /beszel_data. С hostPath данные переживают перезапуски пода, но не переустановку хоста. Для долгосрочного хранения периодически делать бэкап /var/lib/beszel:

bash# Cron-бэкап в объектное хранилище
0 3 * * * tar -czf /tmp/beszel-backup.tar.gz /var/lib/beszel && \
  s3cmd put /tmp/beszel-backup.tar.gz s3://backups/beszel/$(date +%Y%m%d).tar.gz

Безопасный доступ к Beszel UI

Hub не должен быть доступен публично — он показывает метрики сервера, и в нём есть админские функции. Только SSH-туннель или kubectl port-forward:

bash# Вариант 1: kubectl port-forward
kubectl port-forward -n monitoring svc/beszel 8090:8090

# Вариант 2: SSH-туннель с локальной машины
ssh -L 8090:127.0.0.1:8090 user@vps-ip -N

Затем открыть http://localhost:8090 в браузере.