
Одностраничная веб-панель для меш-сетей Meshtastic с живым картографированием сети, анализом пакетов, чатом, телеметрией датчиков и визуализацией топологии. Работает как сервис на Python с историей на базе SQLite.
Meshyface — это чат-ориентированная панель управления Meshtastic, которая работает как один Python-сервис и предоставляет одностраничный веб-интерфейс по HTTP.
Текущий интерфейс предоставляет:
Рабочее пространство консоли — это управляющая поверхность в стиле терминала для пакетного трафика, поиска по истории и утилит сети.
! сужает по ID узла.live транслирует пакетный трафик до нажатия Ctrl+C или q. Используйте live grep <текст>, live rg <текст>, live filter=<текст> или просто live <текст>, чтобы транслировать только соответствующие группы пакетов. Фильтры уровня и детализации всё ещё применяются, например live rg TEXT_MESSAGE_APP -vv --layer=2.grep <текст> и rg <текст> ищут в сохранённой истории пакетов/чата с окнами контекста, лимитами, фильтрами источника пакетов/чата и фильтрами области сводки/пакета./search <текст> фильтрует видимый вывод консоли из приглашения, не запуская поиск по сохранённой истории.
Вид карты с местоположениями узлов, связями, общими путями, кластерами и тепловой картой сигнала.

Вид истории для количества узлов, статуса онлайн, новых узлов и отчётов о местоположении.

Вид топологии, показывающий наблюдаемые связи от выбранного корневого узла.

Вид трассировки для источника, назначения, ближайших связей и деталей пакетов по прыжкам.

Диаграмма телеметрии, сравнивающая историю датчиков для нескольких узлов.

Верхние карточки: активность радио, количество узлов, пакеты, связи, батарея и использование каналов.
Темы могут преобразить всю панель управления с помощью пользовательских цветов, градиентов, прозрачности, размытия, шрифтов, частиц или фона с живой картой. Эти примеры палитр — пользовательские темы; выберите любой превью, чтобы открыть полноразмерный скриншот.
Узлы Meshyface могут обмениваться компактными пакетами внешнего вида, содержащими рецепт темы узла и необязательный призрак или водяной знак. Настройте и просмотрите свой узел в Настройки > Внешний вид > Внешний вид узла, включите Делиться внешним видом узла, затем используйте Транслировать внешний вид для публикации.
flowchart LR
Browser["Browser<br/>single-page UI"]
CDN["Vendored browser assets<br/>Leaflet + leaflet.heat + particles.js"]
Tiles["Basemap provider<br/>OpenStreetMap tile service"]
Server["ThreadingHTTPServer<br/>HTML shell + JSON API"]
Assets["Python template assembly<br/>meshdash/html* + meshdash/assets/*"]
State["State loaders<br/>live snapshot + history readers"]
Services["Write services<br/>chat, settings, tools, games, optional files"]
Tracker["DashboardTracker<br/>live receive path + in-memory buffers"]
History["HistoryStore / SQLite (WAL)<br/>chat, packets, rollups, settings"]
Radio["Meshtastic interface<br/>serial or TCP"]
Mesh["Meshtastic radio / mesh"]
Atlas["Bundled offline atlas<br/>reference basemap fallback"]
Browser -->|GET /| Server
Browser -->|GET /api/*| Server
Browser -->|POST write APIs| Server
Browser --> CDN
Browser --> Tiles
Browser -->|fallback basemap data| Atlas
Server --> Assets
Server --> State
Server --> Services
State <--> Tracker
State <--> History
Services <--> History
Services <--> Radio
Radio <--> Mesh
Radio -->|receive callbacks| TrackerНачните с предварительных требований и зависимостей, затем выберите один путь установки:
/opt/meshyface для постоянного хоста с обновлением через GitHub./data для постоянного состояния.--history-db — это имя файла SQLite на диске. Панель больше не добавляет суффикс подключённого радио, поэтому любое радио, подключённое к панели, вносит вклад в одну и ту же сохранённую историю пакетов, чата, узлов и сводок.
--no-history отключает постоянное хранилище и оставляет только буферы в памяти в реальном времени.mesh_dashboard_theme_settings.json по умолчанию, или в файл, указанный через --theme-settings-file.Эксплуатационные команды для проверки или восстановления локальных данных панели описаны в docs/maintenance.md.
Подпредставление Связи — это вид топологии, а не воспроизведение маршрутов пакетов.
История использует сохранённую историю связей в SQLite.В реальном времени использует только наблюдения связей текущего сеанса.Текущий корень — это узел, вокруг которого центрирован граф. Выбор другого узла меняет корень и пересчитывает пронумерованные кольца расстояний от этого узла.
--mesh-host <ip-адрес-или-dns>: хост TCP-радио--mesh-tcp-port <порт>: порт TCP-радио, по умолчанию 4403--mesh-port <путь>: путь к последовательному устройству--default-gateway-host <хост>: резервный TCP-хост, если --mesh-host не указан и последовательный порт всё ещё на пути по умолчанию--default-gateway-port <порт>: резервный TCP-порт для --default-gateway-host--no-default-gateway: принудительно использовать последовательный порт, если --mesh-host явно не указанСвязанные переменные окружения:
MESH_GATEWAY_HOSTMESH_GATEWAY_PORTMESH_DASH_MESH_PORT для пути последовательного порта по умолчанию--http-host <хост>: хост привязки, по умолчанию 0.0.0.0--http-port <порт>: порт привязки, по умолчанию 8877--refresh-ms <мс>: интервал опроса браузера, по умолчанию 3000--packet-limit <n>: размер буфера недавних живых пакетов, по умолчанию 250--reset-ticker-scale-on-restart / --no-reset-ticker-scale-on-restart--show-secrets: отображать приватные ключи/пароли/PSK в панелях сырого JSON--debug-mode / --no-debug-mode: открывать отладочные поверхности панели, такие как расширенная диагностика сетиСвязанные переменные окружения:
MESH_DASH_PRIVATE_MODEMESH_DASH_API_TOKENMESH_DASH_GAMES_ENABLEMESH_DASH_VERSIONMESH_DASH_GIT_COMMITMESH_DASH_PR_NUMBERИдентификация времени выполнения берётся из 12-символьного коммита git, за которым следует необязательный номер запроса на слияние, например abc123456789 · PR #43. Панель Программное обеспечение отображает эту единственную ревизию вместо версии пакета. Темы коммитов слияния/squash GitHub определяются автоматически; для непротестированных превью-развёртываний можно явно установить MESH_DASH_PR_NUMBER.
/api/revision — каноническая конечная точка идентификации. Её поля revision и build_ref сообщают версию времени выполнения, в то время как commit и pr_number остаются доступными как структурированные поля. /api/version остаётся устаревшей конечной точкой, и её поле version сохраняет метаданные релиза/пакета. MESH_DASH_VERSION также зарезервировано для явной упаковки релиза и не отображается в панели.
--file-transfer-enable: включить приложение Файлы; требует --accept-file-transfer-traffic-disclaimer--file-transfer-auto-accept: принимать прямые входящие передачи без подтверждения в браузере--file-transfer-max-bytes <байты>: лимит на файл, по умолчанию 65536, ограничен 1024-524288Передачи используют бета-протокол MF_FILE_V2 на частном порту 258 и несовместимы с предыдущим транспортом текстовых сообщений. Когда у цели есть пригодное обнаруженное количество прыжков, Meshyface использует это количество плюс один, ограниченное настроенным лимитом прыжков радио. Данные о прыжках старше одного часа возвращаются к настроенному лимиту. Приложение Файлы отображает выбранный лимит и его источник.
Связанные переменные окружения:
MESH_DASH_FILE_TRANSFER_ENABLEMESH_DASH_FILE_TRANSFER_AUTO_ACCEPTMESH_DASH_FILE_TRANSFER_MAX_BYTESMESH_DASH_ACCEPT_FILE_TRANSFER_TRAFFIC_DISCLAIMER--history-db <путь>: базовый путь к БД SQLite--history-max-rows <n>: по умолчанию 200000--history-retention-days <дни>: по умолчанию 30, используйте 0 для отключения удаления по возрасту--history-event-max-rows <n>: лимит событий пакетов только на добавление, по умолчанию 200000--history-event-retention-days <дни>: по умолчанию 30--history-rollup-retention-days <дни>: по умолчанию 365--no-history: режим только в памятиСвязанные переменные окружения:
MESH_DASH_HISTORY_DB--theme-presets <json>: необязательный файл пользовательских предустановок темы--theme-preset <имя>: имя выбранной предустановки--theme-settings-file <json>: файл сохраняемого выбора темы времени выполненияВстроенные предустановки:
default (безопасный синий Meshyface, частицы отключены)custom (демонстрационная тема с включёнными частицами и фоновыми эффектами)Свежие установки по умолчанию используют default, если сохранённый файл настроек темы или MESH_DASH_THEME_PRESET не выбирают другую предустановку.
Связанные переменные окружения:
MESH_DASH_THEME_PRESETSMESH_DASH_THEME_PRESETMESH_DASH_THEME_SETTINGS_FILE--private-mode и/или токен API для более строгого контроля путей записи.MESH_DASH_API_TOKEN вместо --api-token на общих или многопользовательских хостах. Токен командной строки может быть виден в списках процессов и сохранён в истории оболочки.Join Meshyface использует намеренно публичный общий PSK Meshyface для совместимости между пользователями этого программного обеспечения. Не используйте этот публичный канал для частного трафика.--show-secrets раскрывает конфиденциальные значения в панелях сырого JSON; не включайте его без необходимости на общих дисплеях.--no-allow-tokenless-raw-packet-download.Запустите обычный набор тестов:
python -m pytest
Запустите Ruff так же, как CI:
scripts/run_ruff_local.sh
Запустите отчёт о покрытии приложения для ознакомления:
python -m pytest \
--cov=meshdash \
--cov=mesh_dashboard \
--cov=mesh_connection \
--cov-report=term
Запустите локальный шлюз покрытия с более строгим минимумом 85%:
scripts/run_coverage_local.sh
Запустите локальный тест отзывчивости GUI перед PR:
scripts/run_gui_responsiveness_local.sh
Покрытие намеренно исключает портированный пакет движка Zork из оценки, но автономный Zork и тесты маршрутизации всё равно запускаются. GitHub Actions публикует тот же отчёт о покрытии в виде комментария и артефакта PR. CI падает ниже 80%. Локальный шлюз остаётся на 5 процентных пунктов выше CI.
![]() |
--private-mode / --no-private-mode: удалять срезы публичного чата и блокировать выбранные публичные конечные точки--api-token <токен>: требовать аутентификацию на конечных точках записи через Authorization: Bearer <токен> или X-API-Token; предпочитайте MESH_DASH_API_TOKEN на общих хостах, так как токены командной строки могут появляться в списках процессов и истории оболочки--allow-tokenless-raw-packet-download / --no-allow-tokenless-raw-packet-download: разрешать загрузку БД сырых пакетов без токена для клиентов loopback/частной LAN; включено по умолчанию--games-enable / --no-games-enable: включать игровые конечные точки автономного Zork--seed-from-node-db: инициализировать трекер в реальном времени из NodeDB подключённого радио--backfill-environment-rollups: перестроить сводки окружения один раз и выйти; см. docs/maintenance.md--backfill-environment-rollups-reset: очистить существующие сводки перед перестроением--node-history-hours <часы>: окно выбранного узла по умолчанию, по умолчанию 72--node-history-max-points <n>: максимальное количество точек, возвращаемых /api/history/node, по умолчанию 1440