Files
shade 04bb5714c8 feat: Save & exit in radio editors, wiki docs with screen images
- экраны Frequency и Bandwidth: единица измерения в конце строки значения
  (868.731 MHz, 062.50 kHz), внизу отдельный пункт Save & exit
- после правки цифр пользователь переходит на Save & exit и удерживает кнопку:
  значения применяются, экран возвращается в предыдущее меню
- документация: страница posadmesh-docs/device-setup.md дополнена схемой управления
  и изображениями всех экранов (12 картинок в posadmesh-docs/_assets/wizard/)
- вики Gitea: страницы Home и Device-Setup с теми же иллюстрациями
- README: ссылка на вики, схема управления и запись в журнале изменений
2026-10-11 18:44:30 +03:00

416 lines
30 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MeshCore-Posadmesh
PosadMesh — форк проекта EastMesh, который, в свою очередь, основан на официальной прошивке MeshCore:
- <https://github.com/meshcore-dev/MeshCore>
Прошивку дорабатывают энтузиасты из Сергиева Посада; проект ориентирован на работу с сайтом <https://meshcoretel.ru>.
Благодарность Scott Powell / Ripple Radios и участникам MeshCore за оригинальную прошивку и основу проекта.
Этот репозиторий предоставляет адаптированные сборки MeshCore: прошивку MQTT-репитера, которая публикует телеметрию в mesh-сеть MeshCoreTel.
**Сборки MQTT-репитера передают телеметрию на <https://meshcoretel.ru>** — укажите координаты узла и радиопараметры своего региона, чтобы узел появился на карте и в связях. Для Москвы (MOW) это 868,731 МГц, полоса 62,5 кГц, SF7, CR7, хэш пути 2 байта.
## Что добавляет этот репозиторий
- таргеты прошивки `*_repeater_mqtt` с:
- встроенным WiFi
- MQTT-аплинком к курируемому брокеру MeshCoreTel и дополнительно опциональным собственным брокером (TCP или WSS)
- опциональной локальной панелью конфигурации HTTPS на поддерживаемых таргетах ESP32
- таргеты прошивки `*_repeater_mqtt_espnow`, добавляющие локальный мост ESP-NOW mesh
- таргеты прошивки `*_repeater_bridge_espnow` для обычного ESP-NOW-моста репитера в стиле upstream, без MQTT-аплинка и веб-панели PosadMesh
- специфичные для PosadMesh процесс релизов и версионирование поверх релизов upstream MeshCore
- документация и руководство по релизам для пользователей PosadMesh вместо полного набора документации upstream MeshCore
## Отличия от upstream MeshCore
Ядро проекта — mesh-стек, радио, протокол и работа с платами — остаётся upstream-кодом MeshCore. PosadMesh добавляет поверх него транспорт, телеметрию и веб-интерфейс:
| Область | upstream MeshCore | PosadMesh |
| --- | --- | --- |
| Транспорт | нет MQTT; репитер работает только по радио и через последовательный порт | MQTT-аплинк: курируемый брокер `meshcoretel` и опциональный собственный брокер (TCP или WSS по пути `/mqtt`); публикация статуса, пакетов и raw-данных |
| MQTT-мост | нет | передача raw-пакетов mesh между репитерами через ваш собственный peer-брокер (трек `repeater-mqtt-bridge`) |
| Wi-Fi | нет | Wi-Fi на репитерах: подключение, энергосбережение, watchdog шлюза, автоматическое переподключение, команды `wifi.*` |
| Веб-интерфейс | нет | локальная HTTPS-панель: вход по паролю администратора, выполнение CLI-команд, настройки репитера/радио/MQTT, регионы, чёрные списки, обновление прошивки (OTA), управление сертификатом панели |
| Телеметрия | нет | история метрик в PSRAM и архив на SD: батарея, загрузка ядра, память, пакеты, ошибки, уровень сигнала и шума, датчики, GPS; страница `/stats` с графиками и списком соседей/событий |
| CLI | базовый набор MeshCore | дополнительно `mqtt.*`, `wifi.*`, `web.*`, `blacklist path\|chan`, `region`, `stats-*`, `time` и `time.force`, режим Ghost Node, лимит пересылки flood, отчёт о батарее платы, управление вентилятором T-Beam 1W |
| Сборки | companion (USB/BLE), repeater, room server, sensor | только MQTT-таргеты: `*_repeater_mqtt`, `*_repeater_mqtt_espnow`, `*_repeater_mqtt_bridge` |
| Платы | базовый список MeshCore | добавлены свои варианты (Meshadventurer, самодельные ESP32-S3 + E22, Xiao S3 + LoRa2021F33, RAK3112, Station G2/G3, ThinkNode и другие) |
| Релизы | upstream-процесс | свои треки и теги `repeater-mqtt*`, локальная сборка через [`posadmesh-build.sh`](./posadmesh-build.sh), публикация релизов в Gitea |
Что **не** меняется: поведение mesh-сети, радиоконфигурации, протокол и совместимость с MeshCore; upstream-код сохраняется в репозитории и синхронизируется из `meshcore-dev/MeshCore` (см. [AGENTS.md](./AGENTS.md)).
## Релизы
Готовые прошивки публикуются в разделе Releases на git.meshinfo.ru:
- <https://git.meshinfo.ru/shade/MeshCore-Posadmesh/releases>
Руководство по прошивке, в том числе когда использовать `.bin`, а когда `-merged.bin`, см. в:
- [posadmesh-docs/releases.md](./posadmesh-docs/releases.md)
Веб-прошивальщик MeshCoreTel (в том числе прошивки наблюдателя и настройка радиопараметров):
- <https://meshcoretel.ru/ru/flasher>
## Установка uv
Этот репозиторий использует `uv` для Python-инструментов и запускает PlatformIO через `uv run`.
Официальная документация по установке:
- <https://docs.astral.sh/uv/getting-started/installation/>
Распространённые способы установки:
macOS и Linux:
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```
Homebrew:
```bash
brew install uv
```
Windows PowerShell:
```powershell
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
```
## Типовое использование репозитория
Установка инструментов:
```bash
uv sync
```
Список доступных таргетов сборки:
```bash
bash posadmesh-build.sh list
```
Сборка одного таргета:
```bash
uv run pio run -e heltec_v4_repeater_mqtt
uv run pio run -e T_Beam_S3_Supreme_SX1262_repeater_mqtt
```
Сборка с релизными метаданными версии:
```bash
export FIRMWARE_VERSION=v1.15.0
export POSADMESH_VERSION=v2026.5.1
bash posadmesh-build.sh build-firmware heltec_v4_repeater_mqtt
```
Прошивка таргета:
```bash
uv run pio run -e heltec_v4_repeater_mqtt -t upload --upload-port /dev/tty.usbmodemXXXX
```
Открыть последовательный монитор:
```bash
uv run pio device monitor --port /dev/tty.usbmodemXXXX --baud 115200
```
Локальная сборка документации:
```bash
uv run --group docs zensical serve
uv run --group docs zensical build
```
## Ключевые файлы
- [`posadmesh-build.sh`](./posadmesh-build.sh)
- обёртка локальной/релизной сборки PosadMesh
- внедряет `FIRMWARE_VERSION`, `CLIENT_VERSION` и релизные метаданные PosadMesh
- [`build.sh`](./build.sh)
- обёртка сборки upstream MeshCore, сохранённая для уменьшения будущих конфликтов слияния
- [`pyproject.toml`](./pyproject.toml)
- Python-инструменты и зависимости для документации
- [`platformio.ini`](./platformio.ini)
- корневой конфиг PlatformIO и вспомогательные скрипты ESP32
- [`variants/posadmesh_mqtt/platformio.ini`](./variants/posadmesh_mqtt/platformio.ini)
- общие определения окружений MQTT-репитера PosadMesh
- [`examples/simple_repeater/MyMesh.cpp`](./examples/simple_repeater/MyMesh.cpp)
- подключение CLI репитера, набор MQTT-команд и интеграция с белым списком веб-панели
- [`src/helpers/bridges/MQTTBridge.cpp`](./src/helpers/bridges/MQTTBridge.cpp)
- двунаправленный MQTT-мост mesh (peer-брокер TCP, топик `meshcore/bridge/packets`)
- [`src/helpers/mqtt/MQTTUplink.cpp`](./src/helpers/mqtt/MQTTUplink.cpp)
- реализация MQTT-аплинка, веб-панель HTTPS, поддержка собственного брокера (TCP/WSS) и управление WiFi репитера
- [`RELEASE.md`](./RELEASE.md)
- форматы тегов и порядок выпуска релизов
- [`posadmesh-docs/`](./posadmesh-docs)
- документация, ориентированная на PosadMesh, для чтения в веб-интерфейсе git.meshinfo.ru
- [`docs/`](./docs)
- документация upstream MeshCore, сохранённая для уменьшения будущих конфликтов слияния
## Ключевые возможности PosadMesh
### Дополнения MQTT для репитера
- поддержка курируемого брокера:
- `meshcoretel`
- опциональный собственный брокер (TCP или MQTT поверх WSS по пути `/mqtt`) с именем пользователя и паролем
- элементы управления в CLI для:
- учётных данных WiFi
- энергосбережения WiFi
- отчётов о заряде батареи платы на поддерживаемых таргетах
- включения MQTT-эндпоинта
- публикации MQTT-пакетов и raw-данных
- публичного ключа и email владельца
- включения локальной веб-панели
### MQTT-мост mesh (MQTT-репитер)
Трек релиза `repeater-mqtt-bridge` (`*_repeater_mqtt_bridge`) выполняет мостовую передачу **raw-пакетов mesh** между репитерами через **peer-брокер MQTT, который запускаете вы сами** (например, Mosquitto на ПК в локальной сети). Это **не** то же самое, что MQTT-аплинк к курируемому брокеру MeshCoreTel:
| | MQTT-аплинк (MQTT-репитер) | MQTT-мост mesh |
| --- | --- | --- |
| Назначение | Публикация JSON-телеметрии в курируемые брокеры | Передача зашифрованных пакетов mesh между радиоустройствами |
| Брокеры | `meshcoretel`, собственный брокер | Ваш peer-брокер (`host:port`, TCP) |
| Топик | `meshcore/<iata>/...` (по IATA) | `meshcore/bridge/packets` (фиксированный) |
| По умолчанию в bridge-сборках | Выключено по умолчанию (включается в веб-панели / CLI) | Включено, когда включён `bridge.enabled` |
**Первый поддерживаемый таргет:** `Xiao_S3_WIO_repeater_mqtt_bridge`
**Связанный трек:** `repeater-mqtt-espnow` (`*_repeater_mqtt_espnow`) использует ESP-NOW вместо MQTT для локальной мостовой передачи.
Пример сборки:
```bash
uv run pio run -e Xiao_S3_WIO_repeater_mqtt_bridge
```
Прошивка (обновление):
```bash
uv run pio run -e Xiao_S3_WIO_repeater_mqtt_bridge -t upload --upload-port COM10
```
После **полного стирания флеш-памяти** прошивайте объединённый образ по адресу `0x0`, а не только `firmware.bin`:
```bash
uv run pio run -e Xiao_S3_WIO_repeater_mqtt_bridge -t mergebin
uv run pio pkg exec -p tool-esptoolpy -- esptool.py --chip esp32s3 --port COM10 write_flash 0x0 .pio/build/Xiao_S3_WIO_repeater_mqtt_bridge/firmware-merged.bin
```
#### Peer-брокер Mosquitto (локальная сеть)
Каждый узел моста подключается к **одному и тому же** peer-брокеру с **одними и теми же** учётными данными и `bridge.secret`.
1. Установите [Mosquitto](https://mosquitto.org/download/) на машине, доступной с обоих репитеров (например, `192.168.1.145`).
2. Отредактируйте `mosquitto.conf` (при установке службой Windows: `C:\Program Files\Mosquitto\mosquitto.conf`) и добавьте:
```conf
listener 1883 0.0.0.0
allow_anonymous false
password_file C:\Program Files\Mosquitto\passwd
```
Только для лабораторных/тестовых целей `allow_anonymous true` работает и без файла паролей.
3. Создайте пользователя (CMD от имени администратора):
```cmd
cd "C:\Program Files\Mosquitto"
mosquitto_passwd -c passwd bridgeuser
```
4. Перезапустите **службу** (не запускайте второй `mosquitto -v`, пока служба занимает порт 1883):
```powershell
Restart-Service mosquitto
```
5. Убедитесь, что прослушивание идёт в локальной сети, и откройте брандмауэр:
```cmd
netstat -ano | findstr ":1883"
```
Ожидается `0.0.0.0:1883`, а не только `127.0.0.1:1883`.
6. Проверьте с другой машины:
```cmd
mosquitto_pub -h 192.168.1.145 -p 1883 -u bridgeuser -P your-password -t test -m hello
mosquitto_sub -h 192.168.1.145 -p 1883 -u bridgeuser -P your-password -t meshcore/bridge/packets -v
```
Двоичный мусор в `meshcore/bridge/packets` — это нормально: payload — это XOR-зашифрованные кадры mesh, а не текст.
#### Настройка репитера
Настройте **оба** узла моста одинаково для доступа к брокеру; используйте один и тот же `bridge.secret` на каждом узле группы моста.
CLI через последовательный порт или веб-панель:
```text
set wifi.ssid YourNetwork
set wifi.pwd YourWiFiPassword
set bridge.peer.host 192.168.1.145
set bridge.peer.port 1883
set bridge.peer.username bridgeuser
set bridge.peer.password your-password
set bridge.secret your-shared-bridge-secret
```
Веб-панель: **Настройки MQTT** → **Peer MQTT моста mesh** (`host:port`, имя пользователя, пароль). Этот раздел появляется, когда `get bridge.type` возвращает `mqtt`.
Полезные проверки:
```text
get bridge.type
get bridge.peer.host
get bridge.enabled
```
Пароль администратора по умолчанию в dev-сборках обычно `password`, если вы его не изменили.
Пакеты используют магическое значение `0xC03E`, контрольную сумму Fletcher, XOR-шифрование с `bridge.secret`, затем публикацию/подписку в `meshcore/bridge/packets`. Обнаружение дубликатов ограничивает циклы, когда оба узла видят один и тот же трафик.
Подробнее:
- [Пользовательский CLI — настройки MQTT-моста](./posadmesh-docs/custom-cli.md)
- [Веб-панель — настройки MQTT и поля peer моста](./posadmesh-docs/web-panel.md)
- [Релизы — сравнение треков](./posadmesh-docs/releases.md)
### Локальная веб-панель
На поддерживаемых таргетах ESP32 `*_repeater_mqtt` репитер может предоставлять локальную панель конфигурации HTTPS по WiFi.
Возможности:
- доступ с проверкой пароля по существующему паролю администратора репитера
- выполнение CLI только из белого списка
- сгруппированные быстрые действия
- светлая и тёмная темы
- опциональное отключение через `set web off`
Рекомендуется использовать для первичной настройки и периодической диагностики. При развёртывании MQTT-репитеров отключайте панель по завершении, если нужен максимальный запас heap для MQTT.
### Настройка с дисплея и кнопки
На платах с дисплеем и кнопкой мастер настройки доступен прямо на устройстве — без компьютера и телефона: двойное нажатие кнопки из экрана состояния открывает меню. Настраиваются координаты, частота, полоса, CR и SF по отдельности, мощность передатчика, пересылка пакетов, размер хэша пути, интервалы advert и flood advert, лимит flood. Внизу меню — `Save & exit`. Значения применяются через тот же обработчик, что и последовательный CLI, поэтому проверка и сохранение одинаковы для обоих путей, а ответ устройства показывается на экране.
Координаты вводятся в формате `xx.xxxx yy.yyyy`, частота — как `868.731 MHz` (целые МГц шагом 1, кГц по разрядам), полоса — как `062.50 kHz`, поразрядно: длинное нажатие входит в правку цифры или позиции, короткое — `+1`, двойное — `−1`, длинное — применить, короткое после применения — перейти к следующей цифре; внизу экранов частоты и полосы — пункт `Save & exit`, после сохранения возврат в меню.
Подробное описание кнопок, меню и ограничений — в [Настройке с дисплея и кнопки](./posadmesh-docs/device-setup.md), там же иллюстрации всех экранов. Та же страница с картинками опубликована в вики проекта: <https://git.meshinfo.ru/shade/MeshCore-Posadmesh/wiki/Device-Setup>.
![Схема управления мастером](./posadmesh-docs/_assets/wizard/12-controls.png)
## Сборка и релизы
Репозиторий живёт на <https://git.meshinfo.ru/shade/MeshCore-Posadmesh>.
Собственные workflow GitHub Actions (сборка релизов, проверки сборки и публикация доков) удалены при переезде. Сейчас прошивки собираются локально через [`posadmesh-build.sh`](./posadmesh-build.sh) или на сервере ручным workflow [`.gitea/workflows/build-mqtt-firmwares.yml`](./.gitea/workflows/build-mqtt-firmwares.yml) (Actions → Build MQTT firmwares → Run workflow); теги и релизы создаются в веб-интерфейсе git.meshinfo.ru, а собранные файлы выгружаются в релиз скриптом [`posadmesh-tools/publish-gitea-release.sh`](./posadmesh-tools/publish-gitea-release.sh). Подробности — в [RELEASE.md](./RELEASE.md).
Workflow upstream MeshCore (`.github/workflows/build-*.yml`, `firmware-builder.yml`, `pr-build-check.yml`, `run-unit-tests.yml`, `stale-bot.yml`) сохранены под исходными именами файлов для уменьшения конфликтов слияния. Они не являются частью процесса релизов PosadMesh и не используются.
Текущие треки релизов:
- `repeater-bridge-espnow`
- `repeater-mqtt`
- `repeater-mqtt-espnow`
- `repeater-mqtt-bridge`
## Теги релизов
Текущие теги релизов:
```bash
git tag repeater-bridge-espnow-v1.15.0
git tag repeater-mqtt-v2026.5.1
git tag repeater-mqtt-espnow-v2026.5.1
git tag repeater-mqtt-bridge-v2026.7.0
```
`repeater-bridge-espnow` использует в теге версию upstream MeshCore.
MQTT-репитер использует:
- `FIRMWARE_VERSION` — версия upstream MeshCore, задаётся при локальной сборке
- `POSADMESH_VERSION` — версия релиза PosadMesh из тега
Полный процесс релиза см. в [RELEASE.md](./RELEASE.md).
## Изменения в проекте
Правило ведения: после любых правок проекта сюда дописывается короткая запись о том, что изменилось.
### 2026.10.0 (текущая разработка)
**Ребрендинг в PosadMesh**
- папки и скрипты: `eastmesh-docs` → `posadmesh-docs`, `eastmesh-tools` → `posadmesh-tools`, `eastmesh-build.sh` → `posadmesh-build.sh`;
- цели сборки: `*_repeater_observer*` → `*_repeater_mqtt*`;
- треки и теги релизов: `repeater-mqtt`, `repeater-mqtt-espnow`, `repeater-mqtt-bridge` (ранее `observer-eastmesh*`);
- переменная версии релиза `EASTMESH_VERSION` → `POSADMESH_VERSION`, суффикс версии сборки `-posadmesh-`;
- `posadmesh-docs/*`, `README.md`, `RELEASE.md` и `AGENTS.md` переведены на русский язык; команды, их вывод, код, пути и идентификаторы оставлены без перевода.
**Удалено**
- брокеры `waev`, `meshmapper`, `letsmesh-eu` и `letsmesh-us` — из прошивки, веб-панели и документации; остались `mqtt.meshcoretel` и `mqtt.custom`. Сохранённые выборы удалённых брокеров сбрасываются один раз при обновлении;
- линия companion-прошивок: трек `companion-wifi`, команды сборки companion и разделы документации. Проект собирает только MQTT-прошивки.
**Переименование observer → mqtt**
- цели: `*_repeater_mqtt`, `*_repeater_mqtt_espnow`, `*_repeater_mqtt_bridge`;
- команды сборки: `build-repeater-mqtt-firmwares`, `build-repeater-mqtt-espnow-firmwares`, `build-repeater-mqtt-bridge-firmwares`; добавлены `build-mqtt-firmwares` (все MQTT-треки) и `list-mqtt`;
- из документации, `release-notes.yml` и шаблонов issue убраны старые имена (историю релизов с реальными git-тегами не переписывали).
**Локальный мастер настройки**
- добавлен мастер настройки репитера ([`examples/simple_repeater/UITask.*`](./examples/simple_repeater/UITask.cpp)): работает на любой цели, у которой есть дисплей и кнопка, и полностью исключается препроцессором там, где их нет;
- вход в мастер — двойное нажатие кнопки из экрана состояния (на узле без имени мастер открывается сам после заставки); выход — пункт `Save & exit`;
- ввод координат в формате `xx.xxxx yy.yyyy`: длинное нажатие — правка текущей цифры, короткое — `+1`, двойное — `−1`, длинное — применить, короткое после применения — следующая цифра; после всех 12 цифр — экран сохранения;
- радиопараметры настраиваются по отдельности: `Frequency` (значение `868.731 MHz`: целые МГц шагом ±1, кГц по разрядам), `Bandwidth` (`062.50 kHz`, поразрядно), `CR` и `SF` (шагом); внизу экранов частоты и полосы — пункт `Save & exit`, после сохранения возврат в меню; любой из четырёх пунктов отправляет `set radio <частота>,<полоса>,<sf>,<cr>`, поэтому остальные значения сохраняются;
- остальные пункты: мощность TX, пересылка пакетов, размер хэша пути, интервалы advert и flood advert, лимит flood; внизу меню — `Save & exit`;
- значения применяются через тот же `CommonCLI`, что и последовательный порт, а ответ устройства (`OK` или текст ошибки) выводится на экран;
- документация с иллюстрациями: страница [Настройка с дисплея и кнопки](./posadmesh-docs/device-setup.md) дополнена схемой управления и изображениями всех экранов (состояние, меню, частота и правка разряда, полоса, CR, SF, координаты, подтверждение, ответ устройства); та же документация опубликована в вики проекта — <https://git.meshinfo.ru/shade/MeshCore-Posadmesh/wiki/Device-Setup>;
- сборка проверена на `heltec_v4_repeater_mqtt`, `Meshadventurer_sx1262_repeater_mqtt`, `Generic_E22_sx1262_repeater_mqtt` (без дисплея) и `RAK_3112_repeater_mqtt`.
**Исправлено**
- `set mqtt.meshcoretel on|off` не срабатывал: обработчик сравнивался со строкой `set mqtt.mqtt.meshcoretel `. Алиас `set mqtt.meshcoretel.ru on|off` читает значение по правильному смещению;
- `setEndpointEnabled` маскировал сохранённую маску брокеров значением `0x07` и терял бит собственного брокера при переключении любого другого;
- на странице логина веб-панели незакрытый тег `</div` съедал абзац-подсказку про пароль администратора;
- разбор дерева регионов срезал завершающую букву `F` в имени региона, из-за чего `region allowf`, `region denyf` и `region remove` не работали для таких имён;
- групповые команды сборки не собирали ничего: использовались устаревшие суффиксы `_repeater_observer*`, а на Windows имена окружений приходили с символом `\r`. Теперь используются реальные суффиксы, а вывод PlatformIO очищается от `\r`.
**Инфраструктура и релизы**
- репозиторий переехал на <https://git.meshinfo.ru/shade/MeshCore-Posadmesh>; собственные workflow GitHub Actions удалены, upstream-оверлеи сохранены под исходными именами;
- добавлен ручной workflow Gitea Actions [`.gitea/workflows/build-mqtt-firmwares.yml`](./.gitea/workflows/build-mqtt-firmwares.yml) — сборка MQTT-прошивок на сервере и публикация релиза;
- добавлен скрипт [`posadmesh-tools/publish-gitea-release.sh`](./posadmesh-tools/publish-gitea-release.sh) для выгрузки собранных файлов в релиз Gitea;
- в README добавлен раздел «Отличия от upstream MeshCore»;
- собран полный набор MQTT-прошивок (109 целей) с версией `v1.17.1-posadmesh-v2026.10.0` для публикации в релизах `repeater-mqtt`, `repeater-mqtt-espnow` и `repeater-mqtt-bridge`;
- проект и документация переориентированы на meshcoretel.ru: в README переписано происхождение проекта и заведён этот журнал изменений; из документации убраны прежние региональные материалы, ссылки на сторонние сервисы, примеры радиопресетов и коды регионов других стран; руководство по прошивке переведено на файлы из раздела релизов и `esptool.py`, вместо раздела региональных материалов добавлен раздел материалов MeshCoreTel.
## Документация
Отдельный сайт документации больше не публикуется: страницы лежат в каталоге [`posadmesh-docs/`](./posadmesh-docs) и читаются прямо в веб-интерфейсе git.meshinfo.ru:
- <https://git.meshinfo.ru/shade/MeshCore-Posadmesh/src/branch/main/posadmesh-docs>
Текущие страницы документации:
- [Главная](./posadmesh-docs/index.md)
- [Скачивание и прошивка релизов](./posadmesh-docs/releases.md)
- [Локальная сборка с uv](./posadmesh-docs/local-builds.md)
- [Пользовательские команды CLI](./posadmesh-docs/custom-cli.md)
- [Веб-панель](./posadmesh-docs/web-panel.md)