Нарешті добрався до моніторингу.
Цікаво запустити стандартний стек з VictoriaMetrics + Grafana + Alertmanager не у звичному Kubernetes з Helm-чарту, а просто на хості.
Але підхід той самий, з яким моніторяться сервіси в AWS/Kubernetes – на FreeBSD буде VictoriaMetrics для метрик, Grafana для візуалізації, VMAlert та Alertmanager для алертів.
Хотя в моніторингу моїх EcoFlow зробив алерти через Grafana Alerts, перший раз їх пробував – непогано. Хоча все ж стандартний підхід, коли всі Alert Rules описані в файлах, мені заходить більше.
Всі частини серії по налаштуванню домашнього NAS на FreeBSD:
- FreeBSD: Home NAS, part 1 – налаштування ZFS mirror (RAID1) (тест на віртуальній машині)
- FreeBSD: Home NAS, part 2 – знайомство з Packet Filter (PF) firewall
- FreeBSD: Home NAS, part 3 – WireGuard VPN, Linux peer та routing
- FreeBSD: Home NAS, part 4 – локальний DNS з Unbound
- FreeBSD: Home NAS, part 5 – ZFS pool, datasets, snapshots та моніторинг
- FreeBSD: Home NAS, part 6 – Samba server та підключення клієнтів
- FreeBSD: Home NAS, part 7 – NFSv4 та підключення до Linux
- FreeBSD: Home NAS, part 8 – backup даних NFS та Samba з restic
- FreeBSD: Home NAS, part 9 – backup даних з rclone до AWS S3 та Google Drive
- (current) FreeBSD: Home NAS, part 10 – моніторинг з VictoriaMetrics
- (далі буде)
Оскільки це маленький домашній NAS, до якого доступ тільки в локальній мережі з через VPN – то буду робити без FreeBSD Jails. З ними, може, буду знайомитись ближче іншим разом, бо за всі роки користування FreeBSD (з… 2007 року? десь так) – жодного разу в jails нічого не крутив.
Поїхали.
Зміст
Установка VictoriaMetrics
VictoriaMetrics є в портах FreeBSD і в репозиторії, хоча порти дещо відрізняються від звичної схеми – далі подивимось ці нюанси.
З репозиторію FreeBSD встановлюємо саму VictoriaMetrics:
root@setevoy-nas:~ # pkg install -y victoria-metrics
Перевіряємо що і куди встановило:
root@setevoy-nas:~ # pkg info -l victoria-metrics | grep -E 'bin|rc.d'
/usr/local/bin/victoria-metrics
/usr/local/etc/rc.d/victoria-metrics
У файлі /usr/local/etc/rc.d/victoria-metrics маємо список флагів, які можемо передати через /etc/rc.conf:
root@setevoy-nas:~ # cat /usr/local/etc/rc.d/victoria-metrics | grep victoria_metrics
# PROVIDE: victoria_metrics
name="victoria_metrics"
rcvar="victoria_metrics_enable"
logfile="${logdir}/victoria_metrics.log"
victoria_metrics_args=${victoria_metrics_args-"--storageDataPath=/var/db/victoria-metrics --retentionPeriod=1 --httpListenAddr=:8428"}
victoria_metrics_user="victoria-metrics"
Дані будуть зберігатись в /var/db/victoria-metrics, потім треба буде додати його в бекапи.
Додаємо запуск сервісу до /etc/rc.conf:
root@setevoy-nas:~ # sysrc victoria_metrics_enable="yes" victoria_metrics_enable: -> yes
Запускаємо:
root@setevoy-nas:~ # service victoria-metrics start
Перевіряємо порти:
root@setevoy-nas:~ # netstat -an | grep 8428 tcp4 0 0 *.8428 *.* LISTEN
Відкриваємо в браузері – все працює:
Установка node_exporter
Аби побачити в VictoriaMetrics якісь метрики – встановлюємо теж звичний багатьом node_exporter:
root@setevoy-nas:~ # pkg install -y node_exporter
Додаємо його запуск:
root@setevoy-nas:~ # sysrc node_exporter_enable="yes" node_exporter_enable: -> yes
Запускаємо:
root@setevoy-nas:~ # service node_exporter start Starting node_exporter.
Перевіряємо порт:
root@setevoy-nas:~ # netstat -an | grep 9100 tcp46 0 0 *.9100 *.* LISTEN
Установка VMAgent
Отут вже трохи відмінностей, бо окремого FreeBSD port під VMAgent нема – але є загальний пакет vmutils, який встановлює відразу кілька компонентів:
root@setevoy-nas:~ # pkg install -y vmutils
Перевіряємо, що він нам додав:
root@setevoy-nas:~ # pkg info -l vmutils | grep bin
/usr/local/bin/vmagent
/usr/local/bin/vmalert
/usr/local/bin/vmauth
/usr/local/bin/vmbackup
/usr/local/bin/vmctl
/usr/local/bin/vmrestore
Але з vmutils встановлюється тільки один rc.d скрипт, для самого vmagent:
root@setevoy-nas:~ # pkg info -l vmutils | grep rc.d
/usr/local/etc/rc.d/vmagent
Тому далі для VMAlert будемо писати власний.
Додаємо vmagent в rc.cconf:
root@setevoy-nas:~ # sysrc vmagent_enable="yes" vmagent_enable: -> yes
Поки не запускаємо – налаштуємо збір метрик з node_exporter.
Перевіряємо опції, з якими vmagent запускається – шукаємо дефолтний файл конфігу:
root@setevoy-nas:~ # cat /usr/local/etc/rc.d/vmagent
#!/bin/sh
...
vmagent_args=${vmagent_args-"--remoteWrite.tmpDataPath=/var/db/vmagent --promscrape.config=/usr/local/etc/prometheus/prometheus.yml --remoteWrite.url=http://127.0.0.1:8428/api/v1/write --memory.allowedPercent=80"}
...
Додаємо job="node_exporter" до /usr/local/etc/prometheus/prometheus.yml:
global:
scrape_interval: 15s
scrape_configs:
- job_name: vmagent
scrape_interval: 60s
scrape_timeout: 30s
metrics_path: "/metrics"
static_configs:
- targets:
- 127.0.0.1:8429
labels:
project: vmagent
- job_name: "node_exporter"
static_configs:
- targets:
- "127.0.0.1:9100"
Перевіряємо синтаксис:
root@setevoy-nas:~ # service vmagent checkconfig; echo $? 0
Запускаємо сервіс:
root@setevoy-nas:~ # service vmagent start
Перевіряємо в VMAgent /targets, http://nas.setevoy:8429/targets:
І метрики в VictoriaMetrics:
Установка Grafana
Теж встановлюємо із репозиторію:
root@setevoy-nas:~ # pkg install -y grafana
Конфіг-файл – /usr/local/etc/grafana/grafana.ini.
Додаємо запуск:
root@setevoy-nas:~ # sysrc grafana_enable="yes" grafana_enable: -> yes
Запускаємо:
root@setevoy-nas:~ # service grafana start Starting grafana.
Для тестів можна взяти готовий дашборд – Node Exporter Full.
VictoriaMetrics Grafana data source на FreeBSD
Додаємо datasource:
Але відразу зловив помилку:
Хоча 100% плагін підписаний, бо не вперше ж його використовую в робочих проектах:
Пробував додати allow_loading_unsigned_plugins до /usr/local/etc/grafana/grafana.ini:
... allow_loading_unsigned_plugins = victoriametrics-metrics-datasource ...
Або встановити з Grafaca CLI (перший раз не користувався):
root@setevoy-nas:~ # grafana cli plugins install victoriametrics-metrics-datasource Grafana-server Init Failed: Could not find config defaults, make sure homepath command line parameter is set or working directory is homepat
Не допомогло.
Ну і потім вже глянув логи Grafana:
... logger=installer.fs t=2026-02-06T17:09:29.946038823+02:00 level=info msg="Downloaded and extracted victoriametrics-metrics-datasource v0.21.0 zip successfully to /var/db/grafana/plugins/victoriametrics-metrics-datasource" logger=plugins.backend.start t=2026-02-06T17:09:30.466419686+02:00 level=error msg="Could not start plugin backend" pluginId=victoriametrics-metrics-datasource error="fork/exec /var/db/grafana/plugins/victoriametrics-metrics-datasource/victoriametrics_metrics_backend_plugin_freebsd_amd64: no such file or directory" ...
“victoriametrics_metrics_backend_plugin_freebsd_amd64: no such file or directory”
Oh, c’mon…
Не став розбиратись далі – просто можемо використати стандартний плагін Prometheus (але пізніше розробників VictoriaMetrics потім за цю проблему спитаю).
Власне, якщо не зраджує пам’ять – то раніше, коли власного плагіну для Grafana у VictoriaMetrics не було, то ми і використовували дефолтний Prometheus, який йде в комплекті до Grafana:
Додаємо новий data source:
Називаємо його victoria-metrics, задаємо URL:
І тепер все працює:
Налаштування Alerting
I use Arch ntfy.sh BTW.
Дуже прикольний і простий сервіс. Має web, має мобільну апку. Може напишу якось про нього окремо, бо просто в захваті.
Можна зробити алерти через Telegram – можливо, потім додам і його, але зараз ntfy.sh вистачить з головою.
Отже, VMlert у нас вже є – він рахує правила, які ми йому задаємо, і шле в Alertmanager.
Установка Alertmanager
Теж з репозиторію FreeBSD:
root@setevoy-nas:~ # pkg install -y alertmanager
Додаємо запуск:
root@setevoy-nas:~ # sysrc alertmanager_enable="yes" alertmanager_enable: -> yes
Видаляємо дефолтний файл, бо там багато зайвого:
root@setevoy-nas:~ # mv /usr/local/etc/alertmanager/alertmanager.yml /usr/local/etc/alertmanager/alertmanager.yml-default
Пишемо свій конфіг /usr/local/etc/alertmanager/alertmanager.yml:
global:
resolve_timeout: 5m
route:
receiver: "ntfy"
group_by: ["alertname"]
group_wait: 10s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: "ntfy"
webhook_configs:
- url: "https://ntfy.sh/setevoy-alertmanager-alerts"
http_config:
authorization:
type: Bearer
credentials: "tk_v9c***f2p"
send_resolved: true
Запускаємо Alertmanager:
root@setevoy-nas:~ # service alertmanager restart
Перевіряємо його дашборд – http://nas.setevoy:9093/#/alerts:
Установка VMAlert
Бінарнік vmalert вже встановлено з пакету vmutils, але для нього нема скриптів для rc.d:
root@setevoy-nas:~ # pkg info -l vmutils | grep rc.d
/usr/local/etc/rc.d/vmagent
root@setevoy-nas:~ # pkg info -l vmutils | grep bin
/usr/local/bin/vmagent
/usr/local/bin/vmalert
/usr/local/bin/vmauth
/usr/local/bin/vmbackup
/usr/local/bin/vmctl
/usr/local/bin/vmrestore
Тому пишемо власний /usr/local/etc/rc.d/vmalert – він простий, вайбокодиться без проблем:
#!/bin/sh
# PROVIDE: vmalert
# REQUIRE: LOGIN
# KEYWORD: shutdown
. /etc/rc.subr
name="vmalert"
rcvar="vmalert_enable"
load_rc_config $name
: ${vmalert_enable:="NO"}
: ${vmalert_user:="victoria-metrics"}
: ${vmalert_args:="--datasource.url=http://127.0.0.1:8428 --notifier.url=http://127.0.0.1:9093 --rule=/usr/local/etc/vmalert/*.yml"}
pidfile="/var/run/${name}.pid"
command="/usr/sbin/daemon"
procname="/usr/local/bin/vmalert"
command_args="-f -p ${pidfile} ${procname} ${vmalert_args}"
start_cmd="vmalert_start"
stop_cmd="vmalert_stop"
vmalert_start()
{
echo "Starting vmalert"
${command} ${command_args}
}
vmalert_stop()
{
echo "Stopping vmalert"
kill `cat ${pidfile}`
}
run_rc_command "$1"
Задаємо права на запуск:
# chmod +x /usr/local/etc/rc.d/vmalert
Додаємо в запуск із системою:
root@setevoy-nas:~ # sysrc vmalert_enable="yes" vmalert_enable: -> yes
І запускаємо:
root@setevoy-nas:~ # service vmalert start
Перевіряємо на http://nas.setevoy:8880:
Додавання алертів
Власне, тепер можемо накидати алерти.
Створюємо файл /usr/local/etc/vmalert/node-alerts.yml:
root@setevoy-nas:~ # mkdir -p /usr/local/etc/vmalert/
Описуємо алерт:
groups:
- name: node-exporter-alerts
rules:
- alert: NodeExporterDown
expr: up{job="node_exporter"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "node_exporter down on {{ $labels.instance }}"
description: "node_exporter is not reachable for more than 1 minute"
Перезапускаємо vmalert:
root@setevoy-nas:~ # service vmalert restart
Для тесту зупиняємо node_exporter:
root@setevoy-nas:~ # service node_exporter stop Stopping node_exporter. Waiting for PIDS: 1965.
І отримуємо алерт в VMAlert:
І повідомлення від ntfy.sh.
На телефоні:
Тюнинг Grafana dashboard та node_exporter Memory graphs
Дефолтна дашборда заточена під Linux, і на FreeBSD для правильного відображення графіків у Memory Basic треба трохи затюнити запити і метрики.
Перевіряємо наявні метрики по memory від node_exporter:
{__name__=~"node_memory_.*_bytes"}
Тут з основного маємо:
node_memory_size_bytes: total RAMnode_memory_free_bytes: реально вільнаnode_memory_cache_bytes: filesystem cache (reclaimable)node_memory_buffer_bytes: buffers (reclaimable)node_memory_inactive_bytes: inactive pages (reclaimable)node_memory_active_bytes: активно використовуєтьсяnode_memory_wired_bytes: non-reclaimed памʼять (kernel, drivers)
Що нам тут цікаво – це загальна пам’ять, node_memory_free_bytes та node_memory_active_bytes.
Free RAM у FreeBSD – це дійсно free memory, тобто все поза кешами, inactive, wired, buffers і т.д.
Тому панельку з візуалізацією можемо побудувати з такими запитами:
- загальна пам’ять
node_memory_size_bytes
- used memory – те, що дійсно зайнято і не може бути звільнено:
sum
(
node_memory_active_bytes
+
node_memory_wired_bytes
)
- вільна пам’ять – все поза всякими кешами-буферами і рештою зайнятої пам’яті:
node_memory_free_bytes{instance="$node",job="$job"}
- swap used, хоча в мене його нема:
node_memory_swap_used_bytes{instance="$node",job="$job"}
- відобразити % зайнятої памяті від загальної:
( node_memory_active_bytes + node_memory_wired_bytes ) / node_memory_size_bytes * 100
В результаті маємо такі графіки для пам’яті:
А вся дашборда в мене поки виглядає так (це вже з доданим ZFS Exporter):
Окремо є Small варіант – для виводу на 7-ми дюймовий монітор, який буде стояти в серверній шафі:
Пізніше до дашборду вже пододаю ще корисних графіків і статусів.
Ну і для моніторингу системи і NAS буде корисно додати ще експортерів – smartctl_exporter, zfs_exporter тощо.
![]()

















