Crimson.Lab

Лаборатория Кримсона

29 October 2026

Resilio Sync на OpenWrt: Flint 2 постепенно становится NAS

В прошлый раз Flint 2 получил AmneziaWG и Podkop. Казалось бы, роутер настроен, интернет работает, можно пользоваться. Но у него оставался свободный USB. А свободный USB - это гипотетический NAS

Приобрёл бокс для двух дисков, поставил туда два WD Gold с Авито и включил RAID1. Подключил к Flint. Бокс отдал системе один диск, на нём сделали GPT, ext4 и постоянное монтирование по UUID. Получилось около 3,6 ТиБ доступного места.

Почему после Syncthing появился Resilio

Сначала подняли Samba: дома открываешь сетевую папку, снаружи - подключаешься к Amnezia и открываешь её через внутренний адрес роутера. Работает, но для пары файлов постоянно вспоминать про VPN хотелось всё меньше.

Следующим был Syncthing. Для задачи «пусть эта папка всегда будет на обоих устройствах» он подходит отлично. Я подключил компьютер, запустил пробную синхронизацию и понял, что иногда хочу гораздо меньше: увидеть содержимое большого архива и забрать два файла. Без предварительного переезда всего архива на пк.

У Resilio Sync для этого есть Selective Sync: на принимающем компьютере остаются небольшие файлы-заглушки, а содержимое скачивается по запросу. В версии 3 эта возможность доступна вместе с остальными функциями для личного использования. На роутере при этом хранится полная копия.

Это всё ещё приложение для синхронизации: клиент нужен с обеих сторон. Веб-панель Resilio управляет папками и устройствами, а скачивание отдельных файлов по запросу настраивается в клиенте на компьютере. И если хочется только читать архив, подключаться лучше по ссылке или ключу Read Only.

Раз нет подходящего пакета - сделаем пакет

Так появился отдельный проект openwrt-resilio-sync.

Хотелось, чтобы всё выглядело привычно для OpenWrt: установил пакет, открыл LuCI → Services → Resilio Sync, выбрал диск и включил сервис. Сам Resilio открывается отдельной веб-панелью, где уже добавляются папки и другие устройства.

За запуск и интерфейс отвечают два пакета:

Нюанс нашёлся сразу. У Flint 2 процессор ARM64, официальный Resilio для ARM64 существует, но OpenWrt использует musl, а готовый Resilio рассчитан на glibc. Совпадение архитектуры процессора ещё не означает, что скачанный файл запустится.

Решение - отдельный комплект библиотек рядом с Resilio и запуск через его собственный загрузчик. Системные библиотеки OpenWrt остаются на месте. Docker для этого не понадобился.

Первый вариант брал готовые библиотеки из Debian. Для собственного роутера это заработало, но для официального OpenWrt feed оказалось препятствием. В следующей итерации появились ещё два пакета: glibc-compat и libxcrypt-glibc-compat. Они собираются из исходников GNU glibc и libxcrypt компилятором OpenWrt. Установщик больше не скачивает .deb, а Flint уже работает с этими пакетами. Попытка обойтись лёгким слоем gcompat дошла до красивого вывода версии и аварийного завершения при настоящем запуске.

В пакет входит наша интеграция, а закрытый исполняемый файл Resilio установщик скачивает непосредственно с сервера разработчика. Версии зафиксированы, загрузки проверяются по SHA-256. На Flint 2 с OpenWrt 25.12.5 и apk установлены оба пакета, Resilio 3.1.2.1076 запускается отдельным сервисом. Проверены HTTPS, вход по паролю, перезапуск и отказ проверки диска при неверном UUID.

Как установить

Пакеты собираются через SDK соответствующей версии OpenWrt. Команды сборки и зависимости находятся в инструкции репозитория. Это пока сторонний feed: искать его в штатном списке пакетов OpenWrt рано. Для других прошивок совместимость ещё нужно проверять.

После сборки копируем все четыре .apk на роутер в /tmp и подключаемся по SSH, как в предыдущей статье. Устанавливаем:

apk add --allow-untrusted /tmp/glibc-compat-*.apk /tmp/libxcrypt-glibc-compat-*.apk /tmp/resilio-sync-*.apk /tmp/luci-app-resilio-sync-*.apk
resilio-sync-runtime install

Флаг --allow-untrusted здесь относится к собственноручно собранным пакетам, чей ключ подписи роутер не знает. Проверка HTTPS при скачивании Resilio и контрольные суммы при этом работают.

Диск должен быть заранее смонтирован. У меня это /mnt/storage. Смотрим его UUID командой block info и подставляем свой UUID вместо YOUR-EXT4-UUID:

uci set resilio-sync.main.storage_mount='/mnt/storage'
uci set resilio-sync.main.storage_uuid='YOUR-EXT4-UUID'
uci set resilio-sync.main.state_dir='/mnt/storage/.resilio-sync'
uci set resilio-sync.main.directory_root='/mnt/storage/data/Resilio'
uci set resilio-sync.main.device_name='Flint 2'
uci commit resilio-sync
resilio-sync-setup

Последняя команда создаёт необходимые каталоги, спрашивает пароль веб-панели и выпускает локальный сертификат HTTPS. Состояние приложения и файлы лежат в отдельных папках на HDD. Перед запуском сервис проверяет, что смонтирован нужный диск, а не просто существует каталог с похожим названием.

Дальше указываем LAN-адрес своего роутера. У штатной локальной сети GL.iNet это обычно 192.168.8.1:

uci set resilio-sync.main.webui_address='192.168.8.1'
uci set resilio-sync.main.enabled='1'
uci commit resilio-sync
/etc/init.d/resilio-sync enable
/etc/init.d/resilio-sync restart

Панель откроется на https://192.168.8.1:8888/. Логин - admin, пароль - заданный при настройке. Сертификат локальный, поэтому браузер не будет доверять ему автоматически. Его отпечаток можно сверить командой из инструкции репозитория.

Если компьютер находится со стороны WAN Flint, а не в его локальной сети, доступ нужно разрешить отдельным правилом только для своего компьютера. Сам пакет правила firewall не добавляет.

Лицензия, папки и выборочное скачивание

Даже для бесплатного личного использования Resilio Sync 3 требует активацию. Нужно получить лицензию и добавить файл .btskey в веб-панели. Это описано в инструкции Resilio.

Отдельно нужно принять условия использования при первом входе. Здесь обнаружился небольшой бюрократический талант программы: лицензия уже загружена, сервис работает, пароль правильный, но операции всё равно блокируются до этой галочки. Установщик за пользователя условия не принимает.

После активации добавляем на роутере папку внутри /mnt/storage/data/Resilio, подключаем её в Resilio на компьютере и включаем там Selective Sync. Роутер хранит файлы, ноутбук получает то, что попросили скачать.

В настройках самого роутера проверяем Default folder location - здесь должен быть путь на HDD. А Default connect folder mode для роутера выбираем Synced, чтобы он держал полные копии.

На первом запуске нашлась ещё одна мелочь: Resilio попытался использовать //Resilio Sync и сообщил, что на диске нет места. На диске было почти четыре терабайта свободного места, но спорить с программой бесполезно - проще дать ей правильный путь. Исправление домашнего каталога сервиса вошло в пакет, а в панели выбрали /mnt/storage/data/Resilio. После этого Resilio увидел около 3,9 ТБ свободного места и успокоился.

Для эксперимента Resilio получил отдельный каталог. Существующую папку Syncthing ему не отдавали: два синхронизатора, одновременно принимающих решения об одних и тех же файлах - уже слишком насыщенная семейная жизнь для домашнего архива.

Обычную передачу проверили на отдельном клиенте: текстовый файл, файл с русским и японским именем и 1 МиБ случайных данных дошли с Flint, SHA-256 совпали. Тестовые папки затем убрали. Выборочная загрузка по запросу и длительная работа большого архива пока остаются отдельными проверками. После этого Syncthing удалили с роутера, сохранив прежние файлы и версии на HDD.

А VPN теперь вообще нужен?

Для передачи файлов Resilio может соединяться с другим устройством напрямую, а если это не получается - использовать relay. Через relay передаются зашифрованные данные, но скорость может оказаться ниже. Доступность relay и прямое соединение надо проверять в своей сети.

Веб-панель управления - отдельная история. Её оставляем в локальной сети или открываем через свой VPN. Выставлять административный порт в интернет ради синхронизации не требуется.

И ещё: RAID1 помогает пережить отказ одного диска, но удаление файла вполне успешно синхронизируется. Для важных данных нужна отдельная резервная копия. Два диска с Авито не становятся бэкапом от того, что я очень убедительно назвал их хранилищем.

Хочется как в каталоге OpenWrt

Идеальный результат - пакет уровня Syncthing в каталоге OpenWrt: находишь, устанавливаешь, пользуешься. Пока до этого есть расстояние. Наш feed ещё не принят в официальный репозиторий.

Для контрибьюции форкнул openwrt/packages и сначала задумался: почему master, если на роутере OpenWrt 25? Оказалось, всё правильно. По CONTRIBUTING.md новые пакеты идут в master, а в стабильную ветку openwrt-25.12 принимают исправления ошибок и безопасности. Собственный пакет при этом можно собирать SDK 25.12 под установленную прошивку. Перепрошивать роутер на экспериментальную ветку ради этого не требуется.

Первое содержательное препятствие - библиотеки Debian - уже убрали: вместо них собрали собственные пакеты из исходников. Проверили Unicode, DNS, работу потоков и вход в Resilio через LAN и Amnezia. Прежние папки и идентификатор устройства сохранились. Полный тест передачи, описанный выше, проходил ещё со старым окружением; для новой сборки его нужно повторить отдельно.

Пакеты также собрались свежим snapshot SDK с GCC 14.4. Теперь нужны ревью самих библиотек и ясность с распространением закрытого Resilio. Исходники glibc не превращают Resilio в свободное ПО. Его бинарник в наши APK не включён; допустимость такого установщика тоже предстоит обсудить с сопровождающими. Локальный вариант для контрибьюции подготовлен, публичный PR пока не отправлен.

И да, OpenWrt требует раскрывать использование ИИ и запрещает автономные вклады агентов. Нейронка может помочь подготовить код, но отправить его сопровождающим с выражением «оно само написалось, разбирайтесь» правила не позволяют. До официального каталога ещё предстоит работа человека.

tags: glinet - flint2 - openwrt - resilio - nas - sync