MeshMonitor

Веб-дашборд для мониторинга Meshtastic-нод. Подключается к ноде по IP, показывает статус, поддерживает виртуальную ноду и автообновление прошивки.

  • Репо: yeraze/meshmonitor
  • Образ: ghcr.io/yeraze/meshmonitor:latest
  • Дефолтный логин: admin / changeme — сменить при первом входе

Docker Compose на одну ноду

Минимальный рабочий конфиг. Подключается к ноде по IP, виртуальная нода включена.

services:
  meshmonitor:
    image: ghcr.io/yeraze/meshmonitor:latest
    container_name: meshmonitor
    ports:
      - "8088:3001"
      - "4408:4408"
    volumes:
      - meshmonitor-data:/data
    environment:
      - MESHTASTIC_NODE_IP=<NODE_IP>
      - ALLOWED_ORIGINS=http://127.0.0.1:8088
      - SESSION_COOKIE_NAME=meshmonitor.sid
      - ENABLE_VIRTUAL_NODE=true
      - VIRTUAL_NODE_PORT=4408
      - VIRTUAL_NODE_ALLOW_ADMIN_COMMANDS=true
      - AUTO_UPGRADE_ENABLED=false
    restart: unless-stopped
    mem_limit: 150M
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
        max-file: "5"
 
volumes:
  meshmonitor-data:
    external: true

Перед запуском: docker volume create meshmonitor-data

Docker Compose на несколько нод

Рабочий конфиг из чата — две ноды с автоапдейтом. Главное правило: 1 нода = 1 апдейтер.

Что нужно заменить под себя:

  • 8f04 / dd04 — короткие ID нод (последние 4 символа MAC)
  • MESHTASTIC_NODE_IP — IP-адреса нод
  • Порты (8088/8089 для веба, 4408/4409 для виртуальной ноды)
  • ALLOWED_ORIGINS — IP-адреса, с которых будет доступ к дашборду
services:
  # === НОДА 1 (8f04) ===
  meshmonitor_8f04:
    image: ghcr.io/yeraze/meshmonitor:latest
    container_name: meshmonitor_8f04
    ports:
      - "8088:3001"
      - "4408:4408"
    volumes:
      - meshmonitor-data-8f04:/data
    environment:
      - MESHTASTIC_NODE_IP=<NODE_1_IP>
      - ALLOWED_ORIGINS=http://127.0.0.1:8088,http://<HOST_IP>:8088
      - SESSION_COOKIE_NAME=meshmonitor-node-8f04.sid
      - ENABLE_VIRTUAL_NODE=true
      - VIRTUAL_NODE_PORT=4408
      - VIRTUAL_NODE_ALLOW_ADMIN_COMMANDS=true
      - AUTO_UPGRADE_ENABLED=true
    restart: unless-stopped
    mem_limit: 150M
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
        max-file: "5"
 
  # Апгрейдер для НОДЫ 1
  upgrader_8f04:
    image: docker:latest
    container_name: upgrader_8f04
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - meshmonitor-data-8f04:/data
      - .:/compose:ro
    environment:
      - CONTAINER_NAME=meshmonitor_8f04
      - IMAGE_NAME=ghcr.io/yeraze/meshmonitor
      - TRIGGER_FILE=/data/.upgrade-trigger
      - STATUS_FILE=/data/.upgrade-status
      - CHECK_INTERVAL=5
      - COMPOSE_PROJECT_DIR=/compose
      - COMPOSE_PROJECT_NAME=meshmonitor_multi
      - DOCKER_API_VERSION=1.41
      - HEALTH_CHECK_ENABLED=false
    command: /data/scripts/upgrade-watchdog.sh
    depends_on:
      - meshmonitor_8f04
 
  # === НОДА 2 (dd04) ===
  meshmonitor_dd04:
    image: ghcr.io/yeraze/meshmonitor:latest
    container_name: meshmonitor_dd04
    ports:
      - "8089:3001"
      - "4409:4409"
    volumes:
      - meshmonitor-data-dd04:/data
    environment:
      - MESHTASTIC_NODE_IP=<NODE_2_IP>
      - ALLOWED_ORIGINS=http://127.0.0.1:8089,http://<HOST_IP>:8089
      - SESSION_COOKIE_NAME=meshmonitor-node-dd04.sid
      - ENABLE_VIRTUAL_NODE=true
      - VIRTUAL_NODE_PORT=4409
      - VIRTUAL_NODE_ALLOW_ADMIN_COMMANDS=true
      - AUTO_UPGRADE_ENABLED=true
    restart: unless-stopped
    mem_limit: 150M
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
        max-file: "5"
 
  # Апгрейдер для НОДЫ 2
  upgrader_dd04:
    image: docker:latest
    container_name: upgrader_dd04
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - meshmonitor-data-dd04:/data
      - .:/compose:ro
    environment:
      - CONTAINER_NAME=meshmonitor_dd04
      - IMAGE_NAME=ghcr.io/yeraze/meshmonitor
      - TRIGGER_FILE=/data/.upgrade-trigger
      - STATUS_FILE=/data/.upgrade-status
      - CHECK_INTERVAL=5
      - COMPOSE_PROJECT_DIR=/compose
      - COMPOSE_PROJECT_NAME=meshmonitor_multi
      - DOCKER_API_VERSION=1.41
      - HEALTH_CHECK_ENABLED=false
    command: /data/scripts/upgrade-watchdog.sh
    depends_on:
      - meshmonitor_dd04
 
volumes:
  meshmonitor-data-8f04:
    external: true
  meshmonitor-data-dd04:
    external: true

Как добавить ещё ноду

Скопировать блок сервиса + апгрейдера, заменить:

  1. Суффикс (8f04 → свой ID) во всех именах, контейнерах и volumes
  2. Порты (веб: 8090:3001, виртуальная нода: 4410:4410)
  3. MESHTASTIC_NODE_IP — IP новой ноды
  4. ALLOWED_ORIGINS — обновить порт
  5. Добавить volume в секцию volumes:

Автообновление

Апдейтер (upgrader_*) — контейнер с Docker CLI, который мониторит триггер-файл. При срабатывании пуллит новый образ и пересоздаёт контейнер ноды. Скрипт upgrade-watchdog.sh создаётся автоматически MeshMonitor при первом запуске.

Volumes должны быть external: true — создать вручную перед первым запуском:

docker volume create meshmonitor-data-8f04
docker volume create meshmonitor-data-dd04

Ограничения

  • TCP-соединение эксклюзивно — Meshtastic допускает только одного TCP-клиента. Если MeshMonitor подключён, meshtastic --host не пройдёт (и наоборот). Перед отправкой команд на ноду — docker stop meshmonitor.
  • NodeDB >100 нод деградирует WiFi на ESP32 → MeshMonitor теряет связь. Решение — периодический ребут ноды (скрипт останавливает MeshMonitor, ребутит ноду, запускает обратно).