Продовження серії по налаштуванню домашнього NAS.
Моніторинг в цілому вже налаштований в попередніх частинах, але залишилось налаштувати роботу з логами – бо робити це в консолі з tail -f /var/log/messages, звісно, можна – але є і більш зручні інструменти.
Використаємо VictoriaLogs – тим більш для метрик на моїй FreeBSD вже є стек VictoriaMetrics + VMAlert + Alertmanager.
Всі частини серії по налаштуванню домашнього 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
- FreeBSD: Home NAS, part 10 – моніторинг з VictoriaMetrics
- FreeBSD: Home NAS, part 11 – extended моніторинг з додатковими експортерами
- FreeBSD: Home NAS, part 12: синхронізація даних з Syncthing
- FreeBSD: Home NAS, part 13: планування зберігання даних та бекапів
- (current) FreeBSD: Home NAS, part 14 – логи з VictoriaLogs і алерти з VMAlert
Зміст
Установка VictoriaLogs
Є в репозиторії, просто встановлюємо з pkg:
root@setevoy-nas:~ # pkg install -y victoria-logs
Глянемо, які файлу додасть в систему:
root@setevoy-nas:~ # pkg info -l victoria-logs victoria-logs-1.43.1_2: /usr/local/bin/victoria-logs /usr/local/bin/vlogscli /usr/local/etc/rc.d/victoria-logs ...
Глянемо, що в скрипті rc.d:
root@setevoy-nas:~ # cat /usr/local/etc/rc.d/victoria-logs ... rcvar="victoria_logs_enable" ... victoria_logs_user="victoria-logs" ...
Додаємо до /etc/rc.conf:
root@setevoy-nas:~ # sysrc victoria_logs_enable="YES" victoria_logs_enable: -> YES
Запускаємо сервіс:
root@setevoy-nas:~ # service victoria-logs start
Перевіряємо порт:
root@setevoy-nas:~ # sockstat -4 -l | grep logs victoria-logs victoria-l 33088 5 tcp4 *:9428 *:*
Відкриваємо в браузері на порту 9428:
Поки тут пусто – додаємо збір логів.
Установка Fluent Bit
Хотів взяти Vector.dev – але його нема в репозиторії і портах FreeBSD, і нема навіть в списку підтримуваних систем.
Є відкрита GitHub issue – ще у 2020 році.
Що є з інших рішень:
- Promtail: від Grafana – не хочу, і вони його наче вже депрікейтять
- Filebeat: від Elastic, на Go – але пам’ятаю, що трохи важкуватий по ресурсам
- Fluent Bit: на C, швидкий, легкий, хоча конфіг може показатись незручним
- Logstash: Java – nuff said
- Rsyslog: ну от де конфіг справді незручний, тому ні (див. rsyslog: добавление наблюдения за файлом в конфигурацию – 2014 рік)
Отже, візьмемо Fluent Bit.
Глянемо, чи є в репозиторії:
root@setevoy-nas:~ # pkg search fluent fluent-bit-4.2.2_2 Fast and lightweight data forwarder
Встановлюємо:
root@setevoy-nas:~ # pkg install -y fluent-bit
Перевіряємо, які файли додає в систему:
root@setevoy-nas:~ # pkg info -l fluent-bit | grep etc /usr/local/etc/fluent-bit/fluent-bit.conf.sample /usr/local/etc/fluent-bit/parsers.conf.sample /usr/local/etc/fluent-bit/plugins.conf /usr/local/etc/rc.d/fluent-bit
Дефолтний конфіг /usr/local/etc/fluent-bit/fluent-bit.conf.
Перевіряємо, як запускається:
root@setevoy-nas:~ # cat /usr/local/etc/rc.d/fluent-bit
...
# fluent_bit_enable (bool): Set to YES to enable fluent-bit
# Default: NO
# fluent_bit_config (str): config files to use
# Default: /usr/local/etc/fluent-bit/fluent-bit.conf
# fluent_bit_flags (str): Extra flags passed to fluent-bit
# fluent_bit_user (str): Default run as user nobody
# fluent_bit_group (str): Default run as group nogroup
...
: ${fluent_bit_enable:="NO"}
: ${fluent_bit_user:="nobody"}
: ${fluent_bit_group:="nogroup"}
: ${fluent_bit_config:="/usr/local/etc/fluent-bit/fluent-bit.conf"}
pidfile=/var/run/${name}.pid
procname="/usr/local/bin/fluent-bit"
command="/usr/sbin/daemon"
command_args="-H -p ${pidfile} -o /var/log/${name}/${name}.log -t ${name} ${procname} --quiet --config ${fluent_bit_config} ${fluent_bit_flags}"
...
Що нам треба буде – додати fluent_bit_enable в /etc/rc.conf. І звертаємо увагу на fluent_bit_user та fluent_bit_group.
Створюємо каталог для його бази – fluent-bit буде сюди записувати позиції в файлах логів:
root@setevoy-nas:~ # mkdir -p /var/db/fluent-bit root@setevoy-nas:~ # chown nobody:nogroup /var/db/fluent-bit/
Видаляємо (переносимо) дефолтний конфіг:
root@setevoy-nas:~ # mv /usr/local/etc/fluent-bit/fluent-bit.conf /usr/local/etc/fluent-bit/fluent-bit.conf-default
Пишемо свій файл /usr/local/etc/fluent-bit/fluent-bit.conf, поки додаємо збір тільки /var/log/messages:
[SERVICE]
flush 5
daemon Off
log_level info
parsers_file parsers.conf
plugins_file plugins.conf
[INPUT]
name tail
path /var/log/messages
tag freebsd.messages
db /var/db/fluent-bit/messages.db
[OUTPUT]
name loki
match *
host localhost
port 9428
uri /insert/loki/api/v1/push?_msg_field=log&_time_field=date
labels job=fluent-bit, host=setevoy-nas, logfile=messages
В полі uri вказуємо адресу VictoriaLogs, задаємо поле для _msg, в labels вказуємо набір тегів, які будуть додаватись до логів.
Запускаємо для тесту:
root@setevoy-nas:~ # vim /usr/local/etc/fluent-bit/fluent-bit.conf ^C
root@setevoy-nas:~ # fluent-bit -c /usr/local/etc/fluent-bit/fluent-bit.conf
Fluent Bit v4.2.2
* Copyright (C) 2015-2025 The Fluent Bit Authors
* Fluent Bit is a CNCF graduated project under the Fluent organization
* https://fluentbit.io
______ _ _ ______ _ _ ___ _____
| ___| | | | | ___ (_) | / | / __ \
| |_ | |_ _ ___ _ __ | |_ | |_/ /_| |_ __ __/ /| | `' / /'
| _| | | | | |/ _ \ '_ \| __| | ___ \ | __| \ \ / / /_| | / /
| | | | |_| | __/ | | | |_ | |_/ / | |_ \ V /\___ |_./ /___
\_| |_|\__,_|\___|_| |_|\__| \____/|_|\__| \_/ |_(_)_____/
Fluent Bit v4.2 – Direct Routes Ahead
Celebrating 10 Years of Open, Fluent Innovation!
...
[2026/02/28 16:38:18.797199771] [ info] [output:loki:loki.0] configured, hostname=localhost:9428
...
Записуємо повідомлення в /var/log/messages:
root@setevoy-nas:~ # logger "test message from fluent-bit"
Перевіряємо ім’я:
root@setevoy-nas:~ # cat /usr/local/etc/rc.d/fluent-bit | grep name
name="fluent_bit"
rcvar=${name}_enable
...
Додаємо в автостарт:
root@setevoy-nas:~ # sysrc fluent_bit_enable="YES"
Запускаємо:
root@setevoy-nas:~ # service fluent-bit start Starting fluent_bit.
VictoriaLogs та робота з логами з консолі
VictoriaLogs прям дуже зручна в плані роботи з даними з консолі, і, думаю, юзери FreeBSD це оцінять.
Для роботи у нас два варіанти – або робити запити з curl, а потім їх парсити – або використати vlogscli.
Запити з curl
Приклад з curl:
root@setevoy-nas:~ # curl -s 'http://localhost:9428/select/logsql/query?query=*'
{"_time":"2026-02-28T14:42:00.20468201Z","_stream_id":"0000000000000000782dd9afdaaf4d53bfb843de46a3d91b","_stream":"{host=\"setevoy-nas\",job=\"fluent-bit\",logfile=\"messages\"}","_msg":"Feb 28 16:42:00 setevoy-nas setevoy[36200]: test message from fluent-bit 2","host":"setevoy-nas","job":"fluent-bit","logfile":"messages"}
Результат отримуємо в JSON, тому можна передати в jq:
І робити всякі пайпи:
root@setevoy-nas:~ # curl -s http://localhost:9428/select/logsql/query -d 'query=test' | jq -r '._time + " " + ._msg' 2026-02-28T14:42:00.20468201Z Feb 28 16:42:00 setevoy-nas setevoy[36200]: test message from fluent-bit 2 2026-02-28T14:53:49.481172045Z Feb 28 16:48:41 setevoy-nas setevoy[36663]: test message from fluent-bit 3 2026-02-28T14:54:05.981200313Z Feb 28 16:54:05 setevoy-nas setevoy[37055]: test message from fluent-bit 3 2026-02-28T15:06:21.481220267Z Feb 28 17:06:21 setevoy-nas setevoy[37991]: test message from fluent-bit 2026-02-28T15:12:46.231202127Z Feb 28 17:12:46 setevoy-nas setevoy[38385]: test message from fluent-bit 2026-02-28T15:14:42.731213928Z Feb 28 17:14:42 setevoy-nas setevoy[38502]: test message for vlogscli 2026-02-28T15:15:48.981198786Z Feb 28 17:15:48 setevoy-nas setevoy[38569]: test message for vlogscli 2026-02-28T15:17:59.731198268Z Feb 28 17:17:59 setevoy-nas setevoy[38684]: test message for vlogscli
Запити з vlogscli
Запускаємо vlogscli:
root@setevoy-nas:~ # vlogscli sending queries to -datasource.url=http://localhost:9428/select/logsql/query type ? and press enter to see available commands ;>
І, наприклад, запустити \tail:
;> \tail *;
executing [*]...; duration: client 9.003s
{
"_msg": "Feb 28 17:17:59 setevoy-nas setevoy[38684]: test message for vlogscli",
"_stream": "{host=\"setevoy-nas\",job=\"fluent-bit\",logfile=\"messages\"}",
"_stream_id": "0000000000000000782dd9afdaaf4d53bfb843de46a3d91b",
"_time": "2026-02-28T15:17:59.731198268Z",
"host": "setevoy-nas",
"job": "fluent-bit",
"logfile": "messages"
}
Або використовувати різні LogsQL filters та pipes, наприклад – Time filter:
;> _time:5m;
executing [_time:5m]...; duration: server 0.000s
{
"_msg": "Feb 28 17:17:59 setevoy-nas setevoy[38684]: test message for vlogscli",
"_stream": "{host=\"setevoy-nas\",job=\"fluent-bit\",logfile=\"messages\"}",
"_stream_id": "0000000000000000782dd9afdaaf4d53bfb843de46a3d91b",
"_time": "2026-02-28T15:17:59.731198268Z",
"host": "setevoy-nas",
"job": "fluent-bit",
"logfile": "messages"
}
Або включити compact mode:
;> \c compact output mode
І тоді результат буде таким:
vmalert та алерти з логів
Для vmalert можна створити Recodring Rules – читати логи, генерувати метрики, а потім з цих метрик або можемо малювати графіки в Grafana – або створювати алерти.
Див. VictoriaLogs: створення Recording Rules з VMAlert.
Але для цього vmalert треба робити запити до двох datasources:
- до VictoriaLogs на порт 9428 і URI
/select/logsql/– аби прочитати логи - до VictoriaMetrics на порт 8428 – аби записати метрики і виконати запити для створення алерту
Але два --datasource.url для vmalert задати не можна – але можна зробити базовий роутинг через vmauth, як я робив на робочому проекті, де в мене це все працює в Kubernetes – а потім для vmalert в --datasource.url вказати адресу vmauth.
Див. VictoriaMetrics: VMAuth – проксі, аутентифиікація та авторизація.
Налаштування vmauth
vmauth в мене вже встановлена з пакету vmutils, зараз треба просто додати конфіг з роутами та rc.d скрипт, бо в комплекті vmutils його нема:
root@setevoy-nas:~ # pkg info -l vmutils | grep vmauth /usr/local/bin/vmauth /usr/local/share/doc/vmutils/vmauth.md /usr/local/share/doc/vmutils/vmauth_flags.md
Створюємо конфіг /usr/local/etc/vmauth.yml з двома роутами – для VictoriaLogs та VictoriaMetrics:
unauthorized_user:
url_map:
- src_paths:
- "/select/logsql/.*"
url_prefix: "http://127.0.0.1:9428"
- src_paths:
- "/.*"
url_prefix: "http://127.0.0.1:8428"
Пишемо rc.d скрипт – /usr/local/etc/rc.d/vmauth:
#!/bin/sh
# PROVIDE: vmauth
# REQUIRE: LOGIN
# KEYWORD: shutdown
. /etc/rc.subr
name="vmauth"
rcvar="vmauth_enable"
load_rc_config $name
: ${vmauth_enable:="NO"}
: ${vmauth_user:="victoria-metrics"}
: ${vmauth_logfile:="/var/log/vmauth.log"}
: ${vmauth_args:="-auth.config=/usr/local/etc/vmauth.yml -httpListenAddr=:8427"}
pidfile="/var/run/${name}.pid"
command="/usr/sbin/daemon"
procname="/usr/local/bin/vmauth"
command_args="-f -o ${vmauth_logfile} -p ${pidfile} ${procname} ${vmauth_args}"
start_cmd="vmauth_start"
stop_cmd="vmauth_stop"
vmauth_start()
{
echo "Starting vmauth"
touch ${vmauth_logfile}
chown ${vmauth_user} ${vmauth_logfile}
${command} ${command_args}
}
vmauth_stop()
{
echo "Stopping vmauth"
kill `cat ${pidfile}`
}
run_rc_command "$1"
Задаємо execution права:
root@setevoy-nas:~ # chmod +x /usr/local/etc/rc.d/vmauth
Додаємо запуск в /etc/rc.conf:
root@setevoy-nas:~ # sysrc vmauth_enable="YES" vmauth_enable: -> YES
Запускаємо:
root@setevoy-nas:~ # service vmauth start Starting vmauth
Перевіряємо порт:
root@setevoy-nas:~ # sockstat -4 -l | grep vmauth root vmauth 42277 4 tcp4 *:8427 *:*
Додаємо vmalert_args:
root@setevoy-nas:~ # sysrc vmalert_args="--datasource.url=http://127.0.0.1:8427 --notifier.url=http://127.0.0.1:9093 --rule=/usr/local/etc/vmalert/*.yml --remoteWrite.url=http://127.0.0.1:8428"
Тут:
--datasource.url=http://127.0.0.1:8427: адреса vmauth, який буде роутити запити по URI до VictoriaLogs або VictoriaMetrics--notifier.url=http://127.0.0.1:9093: адреса Alertmanager--remoteWrite.url=http://127.0.0.1:8428: адреса VictoriaMetrics, в яку будемо писати згенеровані метрики
Створення vmalert Recording Rule та алерту
І приклад метрики та алерту – файл /usr/local/etc/vmalert/freebsd-system-alerts.yml:
groups:
- name: freebsd-logs-records
type: vlogs
interval: 1m
rules:
- record: freebsd:messages:errors_per_minute
expr: 'error | stats count() as errors_count'
- name: freebsd-logs-alerts
rules:
- alert: FreeBSDTooManyErrors
expr: freebsd:messages:errors_per_minute > 1
for: 1m
labels:
severity: warning
annotations:
summary: "Too many errors in logs"
Перезапускаємо vmalert:
root@setevoy-nas:~ # service vmalert restart Stopping vmalert Starting vmalert
Запускаємо для тесту запис “error” до /var/log/messages:
root@setevoy-nas:~ # while true; do logger "error test message"; sleep 1; done
Перевіряємо в VictoriaMetircs:
Перевіряємо в VMAlert:
Отримуємо алерт в Alertmanager:
І алерт в Telegram (бот робився для алертів EcoFlow, тому ім’я таке):
Готово.
![]()







