Post

Beszel: легкий та сучасний моніторинг серверів і Docker без монструозного Grafana

Beszel: легкий та сучасний моніторинг серверів і Docker без монструозного Grafana

🇬🇧 Read this article in English


Якщо ви адмініструєте кілька VPS або тримаєте домашній сервер (Homelab) з десятками Docker-контейнерів, ви точно стикалися з дилемою моніторингу:

  • Prometheus + Grafana + Node Exporter: індустріальний стандарт, але для пет-проєктів і скромних VPS це справжній оверхед. Сам стек забирає 500–800 МБ оперативної пам’яті, вимагає вивчення мови запитів PromQL і купу часу на налаштування панелей.
  • Netdata: крута деталізація в реальному часі, але перевантажений інтерфейс із тисячами графіків і помітне навантаження на диск та процесор.
  • Uptime Kuma: ідеальний сервіс, про який ми вже писали раніше, проте він відповідає лише на запитання «чи живий сайт/порт?», але не показує, який саме контейнер щойно з’їв 95% пам’яті сервера.

Саме тому в спільнотах r/selfhosted та r/devops справжнім хітом став Beszel — мінімалістичний, надзвичайно швидкий і візуально приємний моніторинг із відкритим вихідним кодом.

Дашборд моніторингу Beszel з метриками Docker та хостів Мал. 1. Головний дашборд Beszel: статус хостів у реальному часі, графіки завантаження та деталізація ресурсів кожного Docker-контейнера


Чому саме Beszel? Головні переваги

Beszel розроблений мовою Go на базі PocketBase (для хаба) та нативних системних викликів. Він вирішує завдання моніторингу елегантно:

  1. Агент важить сльози: фоновий процес агента споживає всього ~10–15 МБ RAM і практично 0% CPU.
  2. Автентифікація через SSH Ed25519: зв’язок між центральним хабом і серверами захищений криптографічними ключами без потреби налаштовувати складні TLS-сертифікати чи паролі.
  3. Глибока інтеграція з Docker: з коробки показує використання CPU, RAM і пам’яті для кожного контейнера окремо.
  4. Історія та графіки: дані зберігаються в компактній вбудованій базі SQLite, дозволяючи переглядати історію за години, дні, тижні чи місяці.
  5. Вбудовані алерти: сповіщення в Telegram, Discord, Ntfy, Pushover чи на електронну пошту, якщо пам’ять або процесор зашкалюють.

Порівняльна таблиця

КритерійBeszelGrafana + PrometheusNetdataUptime Kuma
Споживання RAM агента~12 МБ100–300 МБ80–150 МБНемає агента
Складність розгортання2 хвилиниВисока (PromQL/конфіги)Низька2 хвилини
Моніторинг контейнерів DockerТак (з коробки)Потрібен cAdvisorТакНі
Історичні графікиТакТакТакТільки Uptime
Ідеальне призначенняVPS, Homelab, мікросервісиEnterprise, великі кластериДебаг у реальному часіПеревірка доступності URL

Архітектура: як працює зв’язка Hub та Agent

Система складається з двох компонентів:

  • Beszel Hub: центральний веб-інтерфейс і база даних. Зазвичай встановлюється на один головний сервер (наприклад, ваш основний VPS або домашній сервер).
  • Beszel Agent: мініатюрний клієнт, що запускається на кожному сервері, який потрібно моніторити (включно із самим сервером, де стоїть Hub).

Зв’язок побудовано геніально просто: Hub генерує публічний ключ Ed25519. Ви передаєте цей ключ агенту через змінну середовища. Коли Hub опитує агент через вказаний порт, агент перевіряє криптографічний підпис. Чужий не зможе отримати доступ до ваших метрик!


Крок 1. Розгортання Beszel Hub (Серверна частина)

Створимо каталог для центральної панелі на основному сервері:

1
2
mkdir -p /opt/beszel-hub
cd /opt/beszel-hub

Створюємо файл docker-compose.yml:

1
2
3
4
5
6
7
8
9
10
11
services:
  beszel:
    image: henrygd/beszel:latest
    container_name: beszel-hub
    restart: unless-stopped
    ports:
      - "8090:8090"
    volumes:
      - ./beszel_data:/beszel_data
    environment:
      - PORT=8090

Запускаємо контейнер:

1
docker compose up -d

Перевіряємо працездатність:

1
docker compose ps

Відкриваємо веб-браузер за адресою http://IP_ВАШОГО_СЕРВЕРА:8090. При першому переході Beszel запропонує створити обліковий запис адміністратора (Email та пароль).


Крок 2. Отримання публічного ключа в інтерфейсі

  1. Увійдіть у щойно створений кабінет.
  2. Натисніть кнопку Add System (або значок + у верхньому кутку).
  3. У діалоговому вікні ви побачите згенерований Public Key вигляду:
    1
    
    ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...
    
  4. Скопіюйте цей ключ — він знадобиться для запуску агентів на всіх ваших машинах.

Крок 3. Встановлення Beszel Agent на хости

Агент можна встановити як через Docker (найзручніше), так і як системний бінарник через systemd (якщо на якомусь із серверів немає Docker).

Варіант А: Через Docker Compose (Рекомендовано)

На кожному сервері, за яким хочете стежити (включно з тим, де стоїть Hub), створіть docker-compose.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
services:
  beszel-agent:
    image: henrygd/beszel-agent:latest
    container_name: beszel-agent
    restart: unless-stopped
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # Для коректного обліку використання дискового простору:
      - /:/extra-filesystems/root:ro
    environment:
      PORT: 45679
      KEY: "ВСТАВТЕ_ВАШ_ПУБЛІЧНИЙ_КЛЮЧ_З_КРОКУ_2"

Важливо:

  • Директива network_mode: host необхідна для того, щоб агент бачив реальний мережевий трафік мережевих інтерфейсів хоста (eth0, wg0, tailscale0) і не потребував прокидання портів через Docker NAT.
  • Монтування /var/run/docker.sock надає агенту доступ у режимі read-only до статистики запущених контейнерів.

Запустіть агент:

1
docker compose up -d

Варіант Б: Автоматичний скрипт без Docker (через systemd)

Якщо у вас є чиста віртуальна машина без Docker:

1
2
3
curl -sL https://raw.githubusercontent.com/henrygd/beszel/main/supplemental/scripts/install-agent.sh -o install-agent.sh
chmod +x install-agent.sh
sudo ./install-agent.sh -p 45679 -k "ВСТАВТЕ_ВАШ_ПУБЛІЧНИЙ_КЛЮЧ"

Скрипт завантажить офіційний бінарник для вашої архітектури (amd64 / arm64) і створить службу beszel-agent.service.


Крок 4. Додавання системи в панель Beszel

Поверніться у веб-інтерфейс Beszel Hub і заповніть форму:

  • Name: Зрозуміла назва сервера (наприклад, vps-production, homelab-truenas, backup-node).
  • Host / IP: IP-адреса або доменне ім’я сервера, де встановлено агент (якщо агент стоїть на тому ж сервері, де й Hub, можна вказати локальний IP або 172.17.0.1).
  • Port: 45679 (або порт, який ви вказали).

Натисніть Save. Буквально за 3–5 секунд статус зміниться на зелений ONLINE, і на екрані з’являться перші графіки:

  • Завантаження ядер процесора (CPU usage).
  • Оперативна пам’ять та Swap.
  • Дискові операції I/O та вільне місце.
  • Вхідний та вихідний мережевий трафік.
  • Таблиця Docker-контейнерів з детальним розбиттям по кожному сервісу!

Крок 5. Налаштування сповіщень (Alerts)

Ніхто не хоче дивитися на графіки цілодобово — моніторинг має сповіщати сам, коли виникає аномалія.

У Beszel налаштування алертів інтегроване безпосередньо у веб-панель:

  1. Перейдіть у вкладку Alerts або натисніть на іконку дзвіночка біля конкретного сервера.
  2. Оберіть провайдер доставки:
    • Telegram: вкажіть Bot Token та Chat ID.
    • Discord: вставте Webhook URL.
    • Ntfy / Pushover / Email: стандартні параметри вашого улюбленого сервера сповіщень.
  3. Встановіть пороги спрацьовування:
    • Status: сповіщення, якщо сервер перестав відповідати понад 1 хвилину.
    • CPU Usage: понад 85% протягом 10 хвилин.
    • Memory Usage: понад 90%.
    • Disk Usage: заповнення розділу понад 85%.

Крок 6. Безпечний доступ через HTTPS та домен

Відкривати порт 8090 у публічний інтернет без SSL не варто. Найпростіший спосіб захистити панель — пустити її через Reverse Proxy або Tailscale:

Варіант з Caddy:

beszel.yourdomain.com {
    reverse_proxy 127.0.0.1:8090
}

Варіант з Nginx Proxy Manager:

Створіть Proxy Host:

  • Domain Names: beszel.yourdomain.com
  • Forward Hostname/IP: 172.17.0.1 (або внутрішній IP сервера)
  • Forward Port: 8090
  • Увімкніть Websockets Support і випустіть безкоштовний сертифікат Let’s Encrypt у вкладці SSL.

Підсумки та власні враження

Після кількох тижнів використання Beszel на основних VPS-нодах та домашньому сервері повертатися до складних стеків моніторингу взагалі не виникає бажання.

Головні враження:

  • Швидкість: веб-інтерфейс відкривається миттєво, без очікування рендерингу важких дашбордів Grafana.
  • Чесність щодо ресурсів: 12 МБ пам’яті на агенті дозволяють без докорів сумління ставити його навіть на найдешевші віртуальні машини з 512 МБ або 1 ГБ RAM.
  • Docker-статистика: можливість в один клік побачити, який саме контейнер під час нічного бекапу навантажив процесор або пам’ять — безцінна.

Якщо ви шукали моніторинг, який налаштовується за 5 хвилин, не навантажує залізо і просто робить свою роботу — Beszel сьогодні є безальтернативно найкращим вибором.

Спробуйте розгорнути його на своїх серверах, а питання та власний досвід пишіть у коментарях нижче!

This post is licensed under CC BY 4.0 by the author.