
Дата обновления: 17.10.2026
Автор: Флинт
💡 MeshCenter больше не привязан к Raspberry Pi: с версии 1.11.0 его можно запустить в контейнере Docker на домашнем NAS или сервере, а радио Meshtastic подключить по Wi-Fi.
💬 Когда я начинал MeshCenter, всё было просто: Raspberry Pi, радио по USB, веб-интерфейс в браузере. Но у меня дома круглосуточно работает Synology, и мысль «зачем ещё одна плата, если есть NAS» не давала покоя. А радио хотелось поставить туда, где лучше приём, а не туда, где стоит компьютер.
Так появился серверный режим: MeshCenter в контейнере Docker на NAS, радио с Wi-Fi стоит на чердаке или у окна, и между ними только домашняя сеть. В этой статье я расскажу, зачем это нужно, что вы получаете и чего лишаетесь, а во второй половине пошагово покажу установку — даже если вы никогда не работали с Docker.
Попробуйте сами: интерактивное онлайн-демо
Как выглядит MeshCenter, можно посмотреть прямо в браузере, ничего не устанавливая: онлайн-демо MeshCenter. Интерфейс в Docker-версии тот же самый.
🎯 Зачем запускать MeshCenter в контейнере
Базовая станция Meshtastic должна работать постоянно: принимать сообщения, пока вы спите, собирать телеметрию, хранить историю переписки. Обычно для этого берут Raspberry Pi. Но не всем хочется заводить и обслуживать ещё одно устройство:
- 🗄️ у многих дома уже есть NAS, который и так работает круглосуточно — с RAID, бэкапами и, часто, с ИБП;
- 🍓 Raspberry Pi нужно обслуживать отдельно: SD-карта, питание, обновления системы;
- 📡 радио удобнее поставить там, где лучше приём — на чердаке, у окна, на мачте, — а не рядом с компьютером.
Решение простое: радио Meshtastic с Wi-Fi подключено к домашней сети, а MeshCenter работает в контейнере на NAS и общается с радио по сети (TCP). Отдельный компьютер рядом с радио не нужен — радио достаточно питания.
[ Радио Meshtastic ] ── Wi-Fi ── [ Роутер ] ── LAN ── [ NAS: контейнер MeshCenter ]
(чердак / мачта) │
браузер на ПК, планшете, телефоне
✅ Кому подходит серверный режим
- 🗄️ владельцам Synology и других NAS на процессорах Intel/AMD;
- 🖥️ тем, у кого есть домашний сервер или мини-ПК с Docker;
- 💾 тем, кому важны централизованные бэкапы и не хочется обслуживать отдельную плату;
- 📡 тем, у кого радио должно стоять отдельно от компьютера.
🍓 Кому лучше остаться на Raspberry Pi
- 📷 если нужны камера, e-Paper дисплей, датчики (BME280, часы DS3231);
- 🔌 если у радио нет Wi-Fi — например, платы на nRF52 (RAK4631, T-Echo);
- 📱 если телефон должен оставаться подключённым к радио, пока работает MeshCenter (подробнее ниже);
- ⚡ если хочется самой простой установки: записал SD-карту и включил.
💡 Есть и третий вариант. На любой компьютер или сервер с Debian/Ubuntu MeshCenter можно поставить без Docker, обычной ручной установкой (install.sh). Радио тогда подключается по USB, и все функции доступны. Docker — не единственный способ обойтись без Raspberry Pi, а вариант именно для NAS и серверов, где не хочется ставить программы прямо в систему.
⚖️ Raspberry Pi или Docker: сравнение
| Raspberry Pi (классика) | Docker (серверный режим) | |
|---|---|---|
| Где работает | отдельная плата Pi | NAS или сервер, который у вас уже есть |
| Подключение радио | USB (рекомендуется), TCP, Bluetooth | только TCP по сети |
| Камера, дисплей, датчики | есть | нет |
| Установка | автоматическая с SD-карты | сборка образа + compose |
| Обновление | кнопкой в интерфейсе | заменой образа |
| Процессор | ARM (Pi Zero 2W, 3, 4, 5) | x86-64 (Intel/AMD) |
| Хранение данных | SD-карта | том NAS (RAID, снапшоты, бэкапы) |
🏗️ Как это устроено внутри
Для тех, кому интересно, что в «коробке». Образ построен на python:3.11-slim (Debian) и весит около 350 МБ (около 80 МБ в сжатом виде).
- 🧠 MeshCenter Core — веб-приложение на Flask под gunicorn, всегда ровно один рабочий процесс;
- 📡 адаптер Meshtastic — отдельный процесс со своим окружением Python и официальной библиотекой
meshtastic. С Core он общается через локальный канал. Так библиотека под GPLv3 отделена от основного кода MeshCenter под MIT — ровно как в обычной установке; - ⚙️
tiniв роли init-процесса — корректно передаёт сигналы и не оставляет «зомби»; - 🔒 обычный пользователь вместо root, сброшены все capabilities, запрещено повышение прав;
- 🩺 эндпоинт
/healthz— по нему Docker понимает, что веб-приложение живо.
💾 Где хранятся данные
Всё важное лежит снаружи контейнера, в двух папках на диске NAS:
| Папка на NAS | В контейнере | Что там |
|---|---|---|
config/ | /config | config.py (создаётся при первом запуске и никогда не перезаписывается), ключи погодных сервисов |
data/ | /data | сообщения, узлы, профили радио, точки на карте, файлы MCAttach, настройки, хэш пароля, журнал событий |
Контейнер можно удалить и пересоздать, обновить или откатить образ — данные остаются на месте.
🧭 Как MeshCenter понимает, что он в контейнере
Специальная переменная окружения включает контейнерный режим. Функции, которым нужно «железо» (USB, камера, дисплей, Wi-Fi), сервер отклоняет, а интерфейс скрывает. Системная страница показывает только честные цифры: нагрузку, память и время работы хоста (контейнер делит их с NAS) и диск тома с данными. Модель платы и температуру процессора контейнер достоверно узнать не может — поэтому они скрыты.
⏰ Время. Контейнер не может сам проверить, что часы синхронизированы. Переменная MESHCENTER_TRUST_HOST_CLOCK=1 разрешает доверять часам хоста: DSM синхронизирует их по NTP. От этого зависят расписания и синхронизация времени радио. Часовой пояс задаётся через TZ.
📡 Подключение по TCP: что важно знать
Сетевое подключение — главное отличие серверного режима, и у него есть свои особенности.
⚠️ Правило «один клиент на радио»
Радио Meshtastic обслуживает только одно TCP-подключение. Когда подключается новый клиент, радио молча отключает предыдущего. Если оба умеют автоматически переподключаться, они будут бесконечно выбивать друг друга — каждый продержится несколько секунд.
И это не теория. При разработке Docker-версии я потратил на эту проблему почти два дня. Связь рвалась каждые несколько минут, и под подозрением побывали прошивка радио, настройки TCP keepalive и мой собственный код. А причина оказалась до обидного простой: второй экземпляр MeshCenter на другом компьютере был настроен на то же радио, и его библиотека тихо переподключалась через секунду после каждого отключения. Как только второй клиент убрали, Docker-версия проработала около 7 часов без единого разрыва.
Отсюда практические правила:
- 🚫 пока MeshCenter подключён, не подключайтесь к этому радио по сети — ни телефоном, ни вторым MeshCenter, ни скриптом;
- 📱 нужен телефон — остановите контейнер, поработайте, затем запустите снова;
- 🔁 если у вас несколько установок MeshCenter, TCP-профиль этого радио должен быть активен только в одной из них.
MeshCenter сам распознаёт такую ситуацию: если сессии рвутся одна за другой, в Node Manager появляется предупреждение «radio may be in use by another client», а попытки подключения становятся реже, чтобы не мешать.
📶 Wi-Fi и Bluetooth. По документации Meshtastic, на платах ESP32 Wi-Fi и Bluetooth одновременно не работают: при включении Wi-Fi Bluetooth отключается. Поэтому подключить телефон «параллельно по Bluetooth», пока MeshCenter работает по сети, не получится.
🔄 Автоматическое восстановление связи
Если радио пропало — отключилось питание, пропал Wi-Fi, перезагрузился роутер или NAS, — MeshCenter не сдаётся и не требует перезапуска:
- ⏳ ждёт около 25 секунд, чтобы радио успело освободить старое подключение;
- 🔁 пробует снова через 30, 60, 90 секунд, а затем каждые 2 минуты — без ограничения по времени;
- 🪪 при каждой попытке проверяет, что ответило то же самое радио — другое устройство на том же IP без вашего подтверждения не будет принято;
- ⏱️ считает связь восстановленной только после того, как сессия продержалась 20 секунд.
В интерфейсе это видно как «Reconnecting… (attempt N, next in X s)», а кнопка Reconnect запускает попытку немедленно. Node Manager показывает число разрывов за последний час — короткие сбои не превращаются в тревожный красный статус.
Проверено на реальном радио: после отключения питания больше чем на 20 минут связь восстановилась сама, без перезапуска контейнера. А чтобы не нагружать радио, при повторном подключении MeshCenter запрашивает только конфигурацию без полного списка узлов — около 1,2 КБ вместо 14 КБ. Слабым платам на ESP32 так заметно легче.
✔️ Подтверждения доставки
В версии 1.11.0 подтверждения доставки личных сообщений («доставлено ✓✓») работают только при подключении по USB. Для TCP поддержка уже реализована и проверена на реальном радио — она войдёт в следующую версию. Сообщение считается доставленным только тогда, когда подтверждение пришло от самого получателя, а не от ретранслятора по пути.
✅ Преимущества
- ✅ Не нужно отдельное устройство — MeshCenter работает на NAS, который и так включён круглосуточно.
- ✅ Надёжное хранение — данные лежат на томе NAS с RAID, снапшотами и Hyper Backup; SD-карта не износится и не испортится при сбое питания.
- ✅ Свобода размещения радио — оно стоит там, где лучше приём; нужны только питание и Wi-Fi.
- ✅ Изоляция и безопасность — контейнер работает не от root, без лишних прав и не трогает систему NAS.
- ✅ Простое обновление и откат — новая версия = новый образ; не понравилась — вернули старый.
- ✅ Производительность — процессор NAS обычно мощнее Raspberry Pi Zero 2W, интерфейс отзывается быстрее.
⚠️ Ограничения
- 📡 Только TCP — радио должно иметь Wi-Fi (или Ethernet) и включённый сетевой доступ. USB и Bluetooth в контейнере отключены.
- 🖥️ Только x86-64 — образ собирается под
linux/amd64. NAS на ARM и Raspberry Pi в Docker пока не поддерживаются. - 🔒 Один клиент на радио — пока MeshCenter подключён, телефон и другие программы к радио по сети подключаться не могут.
- 📷 Нет функций, связанных с «железом» — камера, e-Paper дисплей, датчики I2C и RTC, управление Wi-Fi, перезагрузка устройства.
- 🔄 Нет встроенного обновления — новая версия собирается и загружается как новый образ.
- 📦 Нет готового образа — его нужно собрать самостоятельно (это делается один раз на каждую версию).
- 📭 Сообщения во время разрыва могут потеряться — радио не хранит их для сетевого клиента.
- 🧪 Проверено пока только на Synology DS920+ — на других системах всё должно работать по тому же принципу, но официально они ещё не тестировались.
🔒 Безопасность
- 🔑 При первом запуске MeshCenter требует задать пароль (не короче 12 символов). Сделайте это сразу: пока пароля нет, установку может «занять» любой в вашей сети.
- 🛡️ Все страницы и API защищены сессией, изменяющие запросы — CSRF-токеном, попытки подбора пароля ограничиваются.
- 🌐 MeshCenter работает по обычному HTTP и рассчитан на домашнюю сеть. Не открывайте порт в интернет — для удалённого доступа используйте VPN или обратный прокси с HTTPS.
- 📁 Папка
data/содержит секреты (хэш пароля, ключ сессий, ключи MCAttach) — не делайте её общедоступной.
🛠️ Пошаговая установка на Synology
Теперь практика. Я описываю установку на Synology DS920+ (DSM 7.3) — именно на нём всё проверено. Для других систем отличаются только названия пунктов меню (об этом ниже).
📚 Немного терминов
- 📦 Образ (image) — готовая «коробка» с программой: внутри минимальный Linux, Python, MeshCenter и библиотека meshtastic. Собирается один раз и не меняется.
- ▶️ Контейнер — запущенная копия образа. Его можно остановить, удалить и создать заново, ничего не потеряв.
- 📁 Папки снаружи (тома) —
config/иdata/на диске NAS. Все ваши данные хранятся там. - 📝 compose.yaml — текстовый файл-«рецепт»: какой образ запускать, на каком порту и какие папки подключить.
📋 Что нужно заранее
- 🖥️ NAS с процессором Intel/AMD. Проверить на Synology: Панель управления → Информационный центр → Общие → Процессор.
- 📦 Container Manager: Центр пакетов → Container Manager → Установить.
- 📡 Радио Meshtastic с Wi-Fi. В официальном приложении включите Wi-Fi, подключите радио к домашней сети и убедитесь, что включён сетевой доступ (TCP, порт 4403).
- 📌 Постоянный IP радио. Закрепите адрес в роутере (DHCP-резервирование) — иначе после смены адреса MeshCenter радио не найдёт.
- 💻 Компьютер для сборки образа с Windows, macOS или Linux, на котором можно поставить Docker Desktop и Git.
💻 Шаг 1. Сборка образа на компьютере
Готового образа для скачивания пока нет (почему — в разделе вопросов). Собрать его несложно. Установите Docker Desktop и Git, затем скачайте исходники и переключитесь на релиз — именно на релиз, а не на текущую ветку разработки:
git clone https://github.com/FlintUA/MeshCenter
cd MeshCenter
git checkout v1.11.0
Номер последней версии смотрите на странице Releases. Теперь соберите образ. Linux / macOS:
deploy/docker/build.sh
Windows (PowerShell) — команда целиком, с точкой в конце:
docker build --platform linux/amd64 --build-arg MESHCENTER_VERSION=1.11.0 -t meshcenter:1.11.0 .
Сборка занимает несколько минут. Затем сохраните образ в файл для переноса на NAS:
docker save -o meshcenter-1.11.0.tar meshcenter:1.11.0
💡 Получится файл около 350 МБ. Собрать образ можно и прямо на NAS из исходников, но для этого нужны git и SSH, и на NAS это заметно дольше. Новичку проще собрать на компьютере.
📁 Шаг 2. Папки и права
В File Station создайте папку /volume2/docker/meshcenter/ и внутри неё две папки: config и data. Если общая папка docker у вас на первом томе — пишите volume1 (здесь и далее).
[📷 Место для скриншота: File Station с папками config и data]
Контейнер из соображений безопасности работает не от администратора, а от обычного пользователя, и ему нужно право писать в эти папки. Для этого понадобится SSH:
- включите SSH: Панель управления → Терминал и SNMP → Включить службу SSH;
- подключитесь с компьютера (на Windows — из PowerShell):
ssh ваш_логин@IP-адрес-NAS; - выполните
sudo -i(система спросит пароль DSM).
Дальше вводите команды по одной. Сначала узнайте числовые идентификаторы пользователя:
id ваш_логин
Ответ будет примерно таким: uid=1026(...) gid=100(users). Число после uid — это PUID, после gid — PGID. Передайте папки этому пользователю (подставьте свои числа):
chown -R 1026:100 /volume2/docker/meshcenter/config /volume2/docker/meshcenter/data
💡 Образ по умолчанию рассчитан на 1026:100 — у первого созданного пользователя Synology обычно именно такие значения. Если у вас другие числа, укажите их в compose.yaml (шаг 4).
📦 Шаг 3. Загрузка образа на NAS
Без командной строки: Container Manager → Образ → Импорт → Добавить из файла → выберите meshcenter-1.11.0.tar.
[📷 Место для скриншота: Container Manager → Образ → Импорт]
Или через SSH: скопируйте файл на NAS через File Station и выполните:
docker load -i /volume2/docker/meshcenter/meshcenter-1.11.0.tar
После этого образ meshcenter:1.11.0 появится в списке образов, а файл .tar можно удалить.
📝 Шаг 4. Файл compose.yaml
Создайте в папке /volume2/docker/meshcenter/ текстовый файл compose.yaml с таким содержимым:
name: meshcenter
services:
meshcenter:
container_name: meshcenter
image: meshcenter:1.11.0
user: "1026:100" # PUID:PGID из шага 2
restart: unless-stopped
ports:
- "5080:5000" # порт 5000 на Synology занят самим DSM
environment:
TZ: Europe/Berlin # ваш часовой пояс: Europe/Moscow, Europe/Kyiv...
MESHCENTER_TRUST_HOST_CLOCK: "1"
volumes:
- ./config:/config
- ./data:/data
hostname: meshcenter
cap_drop: [ALL]
security_opt: ["no-new-privileges:true"]
stop_grace_period: 30s
image— имя и версия образа из шага 3;ports: "5080:5000"— MeshCenter будет открываться на порту 5080 NAS;MESHCENTER_TRUST_HOST_CLOCK— доверять часам NAS; без этого не работают расписания и синхронизация времени радио;cap_dropиno-new-privileges— контейнер не получает лишних прав.
🚀 Шаг 5. Запуск
Container Manager → Проект → Создать: название meshcenter, путь /volume2/docker/meshcenter, источник — «использовать существующий compose.yaml», далее — готово.
[📷 Место для скриншота: Container Manager → Проект → Создать]
Через SSH то же самое:
cd /volume2/docker/meshcenter
docker compose up -d
🔑 Шаг 6. Первый вход и настройка
- Откройте в браузере
http://IP-адрес-NAS:5080. Первый запуск может занять до минуты. - Откроется страница первичной настройки — сразу задайте пароль.
- Откройте Node Manager, выберите поиск радио по TCP, введите IP радио и порт
4403, подтвердите. MeshCenter перезапустится сам. - Для передачи файлов (MCAttach) укажите номер вашего закрытого канала: откройте
config/config.pyи задайтеMCA_CONTROL_CHANNEL_INDEX = 1(номер — позиция канала в приложении Meshtastic: 0 — основной, 1 — первый дополнительный и т. д.). Затем перезапустите проект.
[📷 Место для скриншота: Node Manager: подключение радио по TCP]
🔒 Важно: MeshCenter намеренно не использует для служебных данных MCAttach публичный канал — поэтому без этой настройки передача файлов отключена.
🔄 Повседневная работа
- 📱 Освободить радио для телефона — остановите проект в Container Manager, поработайте с телефоном, отключите его и запустите проект снова.
- 🌙 Выключение NAS — останавливать контейнер вручную не нужно: после загрузки он запустится сам. А вот вручную остановленный контейнер после перезагрузки останется выключенным.
- ⬆️ Обновление — соберите на компьютере новый образ (
git checkoutна новую версию, сборка,docker save), импортируйте его, поменяйте версию в строкеimage:и перезапустите проект. Папки с данными не затрагиваются. - ↩️ Откат — верните прежнюю версию в
image:, если старый образ ещё в списке. - 💾 Резервная копия — остановите проект, скопируйте
config/иdata/(например, Hyper Backup), запустите снова. Копировать данные работающего контейнера не стоит: внутри базы SQLite. - 📜 Логи — Container Manager → Контейнер → meshcenter → Журнал или
docker compose logs -f.
🗄️ Другие NAS и обычный Linux-сервер
Порядок везде одинаковый: собрать образ → загрузить → папки config и data с правами → compose.yaml → запуск. Отличаются только названия меню:
- 📦 QNAP — Container Station → Images → Import, затем Applications → Create с тем же
compose.yaml; - 📦 Unraid — плагин Compose Manager или ручное создание контейнера с теми же портом и папками;
- 📦 TrueNAS SCALE — Apps → Custom App;
- 🐧 Debian/Ubuntu-сервер — установите
dockerиdocker compose, создайте папки, выполнитеchown, положитеcompose.yamlи запуститеdocker compose up -d.
Эти системы пока не проверялись. Обязательные условия везде одни: процессор x86-64 и радио с доступом по TCP.
🩺 Частые ошибки
| Что видно | Причина и решение |
|---|---|
| Контейнер сразу останавливается, в журнале «not writable» | Неверные права на config/ или data/ — повторите шаг 2 и проверьте user: |
| Страница не открывается на порту 5000 | На Synology порт 5000 занят DSM — используйте 5080:5000 |
| Радио то подключается, то отключается | К радио подключён второй клиент: телефон, другой MeshCenter, программа на ПК |
| «may be in use by another client» | То же самое — радио занято другим клиентом |
| Долго висит «Reconnecting…» | Радио выключено, не в сети или сменило IP — проверьте резервирование в роутере |
| MCAttach: «control channel index None» | Не задан MCA_CONTROL_CHANNEL_INDEX (шаг 6) |
| Не срабатывают расписания | Проверьте MESHCENTER_TRUST_HOST_CLOCK и время на NAS |
| Неправильное время | Неверный TZ в compose.yaml |
| «not available in a container» | Функции нужно «железо» — в контейнере она недоступна |
❓ Вопросы и ответы
Можно ли запустить Docker-версию на Raspberry Pi?
Пока нет — образ собирается только под x86-64. Для Raspberry Pi есть обычная установка, и она функциональнее: USB, камера, дисплей, датчики.
А на Windows или macOS через Docker Desktop?
При разработке это работало, но официально не поддерживается: Docker Desktop рассчитан на разработку, а не на круглосуточную работу. Для постоянной станции используйте NAS или Linux-сервер.
Можно ли подключить радио по USB к NAS и пробросить его в контейнер?
В текущей версии нет. Если радио подключено по USB к компьютеру с Linux, проще поставить MeshCenter на этот компьютер напрямую, без Docker.
Что будет, если NAS выключается на ночь?
Ничего страшного: контейнер остановится вместе с NAS и запустится после включения. Сообщения, пришедшие, пока NAS был выключен, MeshCenter не увидит.
Можно ли держать два MeshCenter на одно радио?
Одновременно по TCP — нет, они будут выбивать друг друга. Но можно держать Raspberry Pi с одним радио по USB, а NAS — с другим радио по TCP.
Почему нет готового образа на Docker Hub?
Внутри образа есть библиотека meshtastic под лицензией GPLv3. Для распространения готовых образов нужна соответствующая документация по исходным кодам и лицензиям, и она ещё не готова. До тех пор прошу собирать образ самостоятельно для личного использования и не публиковать готовые образы.
Как понять, что контейнер работает нормально?
В Container Manager у контейнера статус healthy — значит, веб-приложение отвечает. Состояние связи с радио показывает уже сам интерфейс: значок в шапке и Node Manager.
💎 Заключение
Docker-версия MeshCenter — это серверный режим для тех, у кого уже есть NAS или домашний сервер, а радио с Wi-Fi можно поставить в удобном месте. Вы получаете надёжное хранение, изоляцию, простое обновление и обходитесь без отдельного устройства. Взамен — нет функций, завязанных на «железо», и нужно соблюдать правило «одно сетевое подключение на радио».
Нужна полноценная станция со всеми функциями — выбирайте Raspberry Pi с радио по USB. Важнее «поставить и забыть» на уже работающем NAS — серверный режим для вас.
🔨 Текущий статус
- ✅ Docker-версия входит в MeshCenter с версии 1.11.0;
- ✅ проверена на Synology DS920+ с T-Beam: многочасовая работа без разрывов, автоматическое восстановление после отключения радио;
- 🔜 подтверждения доставки по TCP — в следующей версии;
- 🔜 обновлённая англоязычная документация по Docker в репозитории;
- 💭 в планах — образ для ARM и готовые образы после закрытия лицензионных вопросов.
Если вы попробуете серверный режим на другом NAS — QNAP, Unraid, TrueNAS — напишите о результатах в Issues на GitHub: это очень поможет проекту. 📡
🔗 Ссылки
- 📦 Исходный код: github.com/FlintUA/MeshCenter
- 🌐 Онлайн-демо: meshcenter.elektroniker.help/preview
- 📖 Первая статья о проекте: MeshCenter: история создания центра управления для Meshtastic
- 📡 Официальный сайт Meshtastic: meshtastic.org
Автор: Флинт — автор MeshCenter и сайта elektroniker.help.