Вже потроху наближаюсь до завершення історії з налаштування домашнього NAS на FreeBSD.
Вже є ZFS pool, є датасети, є моніторинг – можна починати налаштування автоматизації бекапів.
Але якщо на початку все здавалось доволі просто – “просто скопіювати потрібні каталоги з робочого ноутбука”, то чим далі – тим цікавішою виявлялась задача.
Більш детальний опис планування та автоматизації бекапів опишу окремо, а сьогодні познайомимось з ще одною класною утилітою – Syncthing.
Всі частини серії по налаштуванню домашнього 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 моніторинг з додатковими експортерами
- (current) FreeBSD: Home NAS, part 12: синхронізація даних з Syncthing
- (далі буде)
Зміст
Syncthing overview
Отже, для чого вона мені: є кілька хостів (робочий та домашній ноутбуки, ігровий ПК), між якими треба синхронізувати загальні дані.
Загальні дані – це каталоги з фотками, музикою, картинками – все те, що змінюється не дуже часто, і де нема “мусора” типу каталогів .git, logs або tmp.
Такі каталоги повинні бути однаковими між ноутами та ПК і самим NAS, і коли я почав думати як жеж це все синхронізувати – то вперся в проблему того, що дані на будь-якому хості можуть і додатись і видалитись – і треба це все діло відстежувати і копіювати всі зміни.
Rsync чи Rclone тут не дуже підходять, бо у них принцип роботи “master-slave” – є один source of truth, і його зміст контролюється з Rsync/Rclone.
А в данному випадку, коли хостів декілька і кожен може робити власні зміни, які треба “відзеркалити” на інші – треба і інший інструмент, який зможе сам моніторити і копіювати всі зміни.
До того ж є і мобільний телефон з фотками, які хочеться бекапити напряму до NAS, а не в Goolge чи Proton Drive.
Власне, тут на сцену і виходить Syncthing:
- підключається до кількох хостів
- для кожного хоста налаштовується які саме локальні каталоги синхронізувати з іншими хостами та які каталоги з інших хостів синхронізувати локально
- передає дані з шифруванням трафіку
До того ж має зручний Web UI, конфіг зберігає в файлі, який легко бекапити та має клієнтів під Android та iOS, і має чудову документацію.
Трохи забігаючи наперед (бо схема с наступного поста FreeBSD: Hone NAS, part 12: планування бекапів) – роль Syncthing в моєму сетапі виглядає так:
Отже, сьогодні установимо Syncthing на NAS з FreeBSD та на ноутбук з Arch Linux, і подивимось як це все працює.
Установка Syncthing на FreeBSD
Syncthing є в репозиторії, встановлюємо його:
root@setevoy-nas:~ # pkg install syncthing
Додаємо до /etc/rc.conf:
root@setevoy-nas:~ # sysrc syncthing_enable="YES" syncthing_enable: -> YES root@setevoy-nas:~ # sysrc syncthing_user="setevoy" syncthing_user: -> setevoy
Файл налаштувань – /usr/local/etc/syncthing/config.xml.
Більшість налаштувань виконуються через Web (хоча є і CLI), але по дефолту Syncthing запускається на localhost.
А так як це FreeBSD без X-серверу – то і браузеру там нема.
Тому редагуємо файл і задаємо IP зовнішнього інтерфейсу, в мене це 192.168.0.2 (хоча адресацію буду перероблювати, коли доберусь до MikroTik та його DHCP):
...
<gui enabled="true" tls="false" sendBasicAuthPrompt="false">
<address>192.168.0.2:8384</address>
<metricsWithoutAuth>false</metricsWithoutAuth>
<apikey>L2P***eAk</apikey>
<theme>default</theme>
</gui>
...
Запускаємо сервіс:
root@setevoy-nas:~ # service syncthing start Starting syncthing.
Перевіряємо порт:
root@setevoy-nas:~ # sockstat -4 -l | grep 8384 setevoy syncthing 34083 18 tcp4 192.168.0.2:8384 *:*
Відкриваємо дашборду:
Створення ZFS dataset
Поки знайомлюсь з системою – зробив окремий датасет:
root@setevoy-nas:~ # zfs create nas/syncthing-test root@setevoy-nas:~ # zfs list nas/syncthing-test NAME USED AVAIL REFER MOUNTPOINT nas/syncthing-test 96K 2.24T 96K /nas/syncthing-test
Задаємо власника – бо Syncthing запускається від юзера setevoy (який заданий через syncthing_user="setevoy" в /etc/rc.conf):
root@setevoy-nas:~ # chown setevoy:setevoy /nas/syncthing-test root@setevoy-nas:~ # ls -ld /nas/syncthing-test drwxr-xr-x 2 setevoy setevoy 2 Feb 13 19:05 /nas/syncthing-test
Додавання каталогу
Тепер додамо локальний каталог, який можна буде зробити доступним для синхронізації на інших хостах:
Вказуємо ім’я та локальний шлях.
Folder ID залишаємо – це просто унікальний ідентифікатор для використання між хостами:
Тут жеж є налаштування Versioning – зберігання копій, далі подивимось детальніше:
І цікаві опції в Advanced – але це вже іншим разом:
Після додавання нового каталогу він буде збережений в .../syncthing/config.xml:
root@setevoy-nas:~ # cat /usr/local/etc/syncthing/config.xml | grep jmw5s-hotah
<folder id="jmw5s-hotah" label="syncthing-test" path="/nas/syncthing-test" type="sendreceive" rescanIntervalS="3600" fsWatcherEnabled="true" fsWatcherDelayS="10" fsWatcherTimeoutS="0" ignorePerms="false" autoNormalize="true">
Тепер додаємо першого “клієнта” – хоча Syncthing все ж peer-to-peer архітектура, але конкретно в моєму випадку є окремий сервер чи хаб, а інші хости – це клієнти.
Установка Syncthing на Arch Linux
Теж є в репозиторії, встановлюємо:
[setevoy@setevoy-work ~] $ sudo pacman -S syncthing
Можна поки запустити руками – подивитись на його output:
[setevoy@setevoy-work ~] $ syncthing 2026-02-13 19:14:21 INF syncthing v2.0.14 "Hafnium Hornet" (go1.25.6 X:nodwarf5 linux-amd64) syncthing@archlinux 2026-02-03 09:05:00 UTC [noupgrade] (log.pkg=main) 2026-02-13 19:14:21 INF Generating key and certificate (cn=syncthing log.pkg=syncthing) 2026-02-13 19:14:21 INF Default config saved; edit to taste (with Syncthing stopped) or use the GUI (path=/home/setevoy/.local/state/syncthing/config.xml log.pkg=syncthing) 2026-02-13 19:14:21 INF Archiving a copy of old config file format (path=/home/setevoy/.local/state/syncthing/config.xml.v0 log.pkg=syncthing) 2026-02-13 19:14:21 INF Calculated our device ID (device=2W2JHRW-T***-2TRDAAF log.pkg=syncthing) 2026-02-13 19:14:21 INF Overall rate limit in use (send="is unlimited" recv="is unlimited" log.pkg=connections) 2026-02-13 19:14:21 INF Using discovery mechanism (identity="global discovery server https://discovery-lookup.syncthing.net/v2/?noannounce" log.pkg=discover) 2026-02-13 19:14:21 INF Using discovery mechanism (identity="global discovery server https://discovery-announce-v4.syncthing.net/v2/?nolookup" log.pkg=discover) 2026-02-13 19:14:21 INF Using discovery mechanism (identity="global discovery server https://discovery-announce-v6.syncthing.net/v2/?nolookup" log.pkg=discover) 2026-02-13 19:14:21 INF Using discovery mechanism (identity="IPv4 local broadcast discovery on port 21027" log.pkg=discover) 2026-02-13 19:14:21 INF Using discovery mechanism (identity="IPv6 local multicast discovery on address [ff12::8384]:21027" log.pkg=discover) 2026-02-13 19:14:21 INF Relay listener starting (id=dynamic+https://relays.syncthing.net/endpoint log.pkg=connections) 2026-02-13 19:14:21 INF QUIC listener starting (address="[::]:22000" log.pkg=connections) 2026-02-13 19:14:21 INF Creating new HTTPS certificate (log.pkg=api) 2026-02-13 19:14:21 INF TCP listener starting (address="[::]:22000" log.pkg=connections) 2026-02-13 19:14:21 INF GUI and API listening (address=127.0.0.1:8384 log.pkg=api) 2026-02-13 19:14:21 INF Access the GUI via the following URL: http://127.0.0.1:8384/ (log.pkg=api) 2026-02-13 19:14:21 INF Loaded configuration (name=setevoy-work log.pkg=syncthing) 2026-02-13 19:14:21 INF Measured hashing performance (perf="1978.89 MB/s" log.pkg=syncthing)
Додавання Remote Devices
Тепер треба Syncthing на Linux додати в пул до Syncthing на FreeBSD.
На Linux йдемо в Actions > Show ID:
(QR дуже ручний для підключення мобільних клієнтів – теж вже робив, працює чудово)
Далі на FreeBSD клікаємо Add Remote Device:
Він відразу в мережі побачив клієнта на Linux-хості (див. Syncthing Discovery Server та Security Principles):
Клікаємо Save, але Linux-клієнт поки що в статусі Disconnected:
Повертаємось до Syncthing на Linux – туди приходить запит на підключення:
І тепер маємо два девайси, об’єднані в мережу.
На FreeBSD:
І на ноутбуці з Linux:
Налаштування Folder Sharing
Тепер подивимось, як працює синхронізація.
На FreeBSD у створеному раніше Folder клікаємо Edit:
Переходимо на вкладку Sharing, вибираємо девайси, і якими хочемо зашарити папку:
Аналогічно до процесу додавання Devices – спочатку нам на Linux-клієнт прийде запит на підтвердження:
Клікаємо Add, задаємо локальний шлях на ноутбуці з Linux:
Перевіряємо, як це все діло працює.
Створимо файл на FreeBSD:
root@setevoy-nas:~ # echo "hello from nas" > /nas/syncthing-test/test1.txt
Дивимось Syncthing output на ноуті – пише що і коли змінилось:
... 2026-02-13 19:23:54 INF Synced file (folder.label=syncthing-test folder.id=jmw5s-hotah folder.type=sendreceive file.name=test1.txt file.modified="2026-02-13 19:23:43.432316 +0200 EET" file.permissions=0644 file.size=15 file.blocksize=131072 blocks.local=0 blocks.download=1 log.pkg=model) ...
І файл тепер є на Linux-клієнті:
[setevoy@setevoy-work ~] $ ll nas/syncthing-test/ total 4 -rw-r--r-- 1 setevoy setevoy 15 Feb 13 19:23 test1.txt
Перевіримо зворотню синхронізацію – додамо файл на Linux:
[setevoy@setevoy-work ~] $ echo "hello from laptop" > /home/setevoy/nas/syncthing-test/test2.txt
І через декілька секунд – він є і на FreeBSD:
root@setevoy-nas:~ # cat /nas/syncthing-test/test2.txt hello from laptop
Тестуємо видалення:
[setevoy@setevoy-work ~] $ rm /home/setevoy/nas/syncthing-test/test2.txt
І на FreeBSD він теж зникає:
root@setevoy-nas:~ # ll /nas/syncthing-test/ total 3 drwxr-xr-x 2 setevoy setevoy 3B Feb 13 19:09 .stfolder -rw-r--r-- 1 root setevoy 15B Feb 13 19:23 test1.txt -rw-r--r-- 1 setevoy setevoy 18B Feb 13 19:25 test2.txt root@setevoy-nas:~ # ll /nas/syncthing-test/ total 2 drwxr-xr-x 2 setevoy setevoy 3B Feb 13 19:09 .stfolder -rw-r--r-- 1 root setevoy 15B Feb 13 19:23 test1.txt
Налаштування Versioning для бекапів
Тепер про те, як можна бекапити дані – захист від випадкового видалення.
Документація – File Versioning.
Переходимо в Folder > Edit, вкладка File Versioning:
Тут опції:
- Trash Can: при видаленні файл переноситься в
.stversions - Simple: зберігає N останніх версій
- Staggered: зберігає версії з часом (1h, 1d, 1w і т.д.)
- External: викликати зовнішній скрипт
Спробуємо з Trash Versioning:
На Linux-клієнті створимо новий файл:
[setevoy@setevoy-work ~] $ echo "hello from laptop" > /home/setevoy/nas/syncthing-test/test-trash.txt
Чекаємо на його появу на FreeBSD-хості:
root@setevoy-nas:/home/setevoy # ll /nas/syncthing-test/ total 3 drwxr-xr-x 2 setevoy setevoy 3B Feb 13 19:09 .stfolder -rw-r--r-- 1 setevoy setevoy 18B Feb 13 19:33 test-trash.txt -rw-r--r-- 1 root setevoy 15B Feb 13 19:23 test1.txt
Видаляємо на ноутбуці:
[setevoy@setevoy-work ~] $ rm /home/setevoy/nas/syncthing-test/test-trash.txt
І через кілька секунд він зникає на FreeBSD:
root@setevoy-nas:/home/setevoy # ll /nas/syncthing-test/ total 3 drwxr-xr-x 2 setevoy setevoy 3B Feb 13 19:09 .stfolder -rw-r--r-- 1 setevoy setevoy 18B Feb 13 19:33 test-trash.txt -rw-r--r-- 1 root setevoy 15B Feb 13 19:23 test1.txt root@setevoy-nas:/home/setevoy # ll /nas/syncthing-test/ total 3 drwxr-xr-x 2 setevoy setevoy 3B Feb 13 19:09 .stfolder drwxr-xr-x 2 setevoy setevoy 3B Feb 13 19:34 .stversions -rw-r--r-- 1 root setevoy 15B Feb 13 19:23 test1.txt
Але збережений в .stversions/:
root@setevoy-nas:/home/setevoy # ll /nas/syncthing-test/.stversions/ total 1 -rw-r--r-- 1 setevoy setevoy 18B Feb 13 19:34 test-trash.txt
Крім того, у Web тепер є кнопочка Versions:
Де показані видалені файли, і які звідси можна відновити:
Для NAS, скоріш за все, зроблю Trash на 30 днів, а довготривалі бекапи будуть через ZFS snaphosts + копіювання на Google/Roton Drive та AWS S3.
Наступні кроки
Ну і тепер можна на Linux-клієнт додати Syncthing в автостарт:
[setevoy@setevoy-work ~] $ systemctl --user enable syncthing.service
Created symlink '/home/setevoy/.config/systemd/user/default.target.wants/syncthing.service' → '/usr/lib/systemd/user/syncthing.service'.
[setevoy@setevoy-work ~] $ systemctl --user start syncthing.service
[setevoy@setevoy-work ~] $ systemctl --user status syncthing.service
● syncthing.service - Syncthing - Open Source Continuous File Synchronization
Loaded: loaded (/usr/lib/systemd/user/syncthing.service; enabled; preset: enabled)
Active: active (running) since Fri 2026-02-13 19:41:17 EET; 3s ago
...
Можна додати запуск сервісу без user login – корисно для ребутів, див. loginctl:
[setevoy@setevoy-work ~] $ loginctl enable-linger setevoy
І додати базову перевірку в Online Kuma (про неї теж скоріш за все буду писати ще окремо, в мене Kuma крутиться на окремому хості для “міні-моніторинга” на Raspberry PI):
Є у Syncthing і Prometheus метрики, див. Prometheus-Style Metrics – можна буде додати до VictoriaMetrics і створити Grafana dashboard та алерти.
І варто налаштувати бекапи для файлів Syncthing:
[setevoy@setevoy-work ~] $ ll ~/.local/state/syncthing total 40 -rw-r--r-- 1 setevoy setevoy 623 Feb 13 19:14 cert.pem -rw------- 1 setevoy setevoy 11236 Feb 13 20:15 config.xml ... -rw------- 1 setevoy setevoy 119 Feb 13 19:14 key.pem ...
Далі почитати і поробити Configuration Tuning, налаштувати Firewall Setup, і уважно перечитати Security Principles.
Наостанок – як Syncthing виглядає на телефоні з Syncthing-Fork:
І клієнт телефона в дашборді на FreeBSD:
Готово.
![]()

























