MeshCenter в Docker: базовая станция Meshtastic на домашнем NAS без Raspberry Pi

Дата обновления: 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 (серверный режим)
Где работаетотдельная плата PiNAS или сервер, который у вас уже есть
Подключение радио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//configconfig.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:

  1. включите SSH: Панель управления → Терминал и SNMP → Включить службу SSH;
  2. подключитесь с компьютера (на Windows — из PowerShell): ssh ваш_логин@IP-адрес-NAS;
  3. выполните 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. Первый вход и настройка

  1. Откройте в браузере http://IP-адрес-NAS:5080. Первый запуск может занять до минуты.
  2. Откроется страница первичной настройки — сразу задайте пароль.
  3. Откройте Node Manager, выберите поиск радио по TCP, введите IP радио и порт 4403, подтвердите. MeshCenter перезапустится сам.
  4. Для передачи файлов (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: это очень поможет проекту. 📡

🔗 Ссылки

Автор: Флинт — автор MeshCenter и сайта elektroniker.help.

Просмотры: 0

Benachrichtigung über neue Artikel. Уведомления о новых статьях.

Erhalten Sie eine E-Mail, wenn ein neuer Artikel erscheint.
Получайте письмо, когда выходит новая статья.

Wir werden nicht spammen! Мы не спамим!
Datenschutzerklärung / Политика конфиденциальности

Оставьте комментарий