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 в браузере.