Files
shade 26b724c0f0 feat: manual Gitea build workflow, release publishing, README and docs update
- добавлен ручной workflow Gitea Actions (.gitea/workflows/build-mqtt-firmwares.yml):
  сборка MQTT-прошивок на сервере и публикация релиза
- добавлен posadmesh-tools/publish-gitea-release.sh для выгрузки собранных файлов
  в релиз Gitea (идемпотентно, фильтр по треку)
- README: происхождение проекта переписано (форк EastMesh, доработка энтузиастов
  из Сергиева Посада, ориентация на meshcoretel.ru), добавлены раздел
  «Отличия от upstream MeshCore» и журнал «Изменения в проекте»
- убраны упоминания Австралии, ссылки на eastmesh.au и региональные материалы;
  руководство по прошивке переведено на файлы релизов и esptool.py
- posadmesh-build.sh: вывод PlatformIO очищается от \r — на Windows групповые
  команды сборки не находили ни одной цели; companion-команды удалены,
  добавлены build-mqtt-firmwares и list-mqtt
- release-notes.yml: треки repeater-mqtt*, запись 2026.10.0 дополнена удалением
  companion и исправлением сборки, companion-wifi помечен как снятый с выпуска
- AGENTS.md: правило дописывать изменения в README
- .gitignore: .pio-home
2026-10-11 17:20:05 +03:00

411 lines
16 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.
# Веб-API репитера
Эта страница описывает локальный HTTPS API, который предоставляют сборки PosadMesh `*_repeater_mqtt` с поддержкой веб-панели.
Он предназначен для:
- небольшой автоматизации в вашей локальной сети
- дашбордов или скриптов, которым нужен текущий статус репитера
- удалённого доступа к CLI через тот же аутентифицированный путь, который использует веб-панель
Это не облачный API и не отдельный серверный сервис. Его напрямую обслуживает прошивка репитера.
## С чего начать
Для обычного использования PosadMesh эта страница не нужна. Обратитесь к [Веб-панели репитера](./web-panel.md), если вы просто хотите настроить или проверить репитер в браузере.
Используйте эту страницу, когда нужно, чтобы локальный скрипт, дашборд или домашний инструмент общался с репитером напрямую.
Простейший полезный сценарий работы с API:
1. войдите с паролем администратора репитера
2. сохраните полученный токен
3. отправьте команду CLI через `/api/command`
```bash
TOKEN=$(curl -sk -X POST https://<repeater-ip>/login --data '<admin-password>')
curl -sk https://<repeater-ip>/api/command \
-H "X-Auth-Token: $TOKEN" \
--data 'get mqtt.status'
```
## Область применения и доступность
API доступен только когда:
- вы запускаете поддерживаемую сборку прошивки `*_repeater_mqtt`
- веб-панель репитера включена и работает
- репитер доступен из локальной сети
- вы прошли аутентификацию с паролем администратора репитера
API предназначен для администрирования в доверенной локальной сети. Не открывайте его напрямую в публичный интернет.
## Базовый URL
Используйте локальный HTTPS-адрес репитера:
```text
https://<repeater-ip>/
```
Пример:
```text
https://192.168.1.123/
```
## Аутентификация
API использует тот же пароль администратора, что и CLI репитера и веб-панель.
1. отправьте `POST` с паролем на `/login`
2. сохраните полученный токен сессии
3. передавайте этот токен в заголовке `X-Auth-Token` в последующих запросах
Пример:
```bash
TOKEN=$(curl -sk -X POST https://<repeater-ip>/login --data '<admin-password>')
```
Использование токена:
```bash
curl -sk https://<repeater-ip>/api/stats -H "X-Auth-Token: $TOKEN"
```
Примечания:
- репитер использует самоподписанный сертификат, поэтому большинству инструментов потребуется `-k` или аналог
- если сессия истекает или заблокирована, запросы возвращают `401 Unauthorized`
- повторный вход выдаёт новый токен
## Рекомендации по производительности
API работает на самом репитере, поэтому частота опроса имеет значение.
Если репитер дополнительно держит два MQTT-соединения, избегайте частого опроса API. Текущая схема использования в PosadMesh:
- опрос статистики раз в `60` секунд
- запросы по требованию для всего остального
Это рекомендуемая базовая схема, если вы хотите избежать перегрузки платы. Держите частоту запросов низкой, избегайте всплесков опроса и предпочитайте ручное обновление или чтение по событию для более тяжёлых операций.
Рекомендуемая практика:
- опрашивайте `/api/stats` не чаще одного раза в минуту
- не опрашивайте несколько эндпоинтов параллельно
- используйте вызовы по требованию для чтения конфигурации и действий CLI
- завершайте сессию, когда закончили, и прекращайте опрос, когда данные активно не используются
## Эндпоинты
### `POST /login`
Аутентификация с паролем администратора репитера.
Тело запроса:
```text
<admin-password>
```
Ответ:
- токен сессии в виде обычного текста при успехе
- `401` при неверном пароле
Пример:
```bash
curl -sk -X POST https://<repeater-ip>/login --data '<admin-password>'
```
### `GET /api/session`
Проверка, действителен ли сохранённый токен сессии.
Заголовки:
```text
X-Auth-Token: <token>
```
Ответ:
- JSON `{"authenticated":true}` при успехе
- `401 Unauthorized`, если токен отсутствует или устарел после блокировки, перезапуска или перепрошивки
### `POST /api/command`
Удалённый запуск команды CLI репитера.
Заголовки:
```text
X-Auth-Token: <token>
```
Тело запроса:
```text
get wifi.status
```
Ответ:
- вывод CLI в виде обычного текста
- `OK`, если команда выполняется успешно и не возвращает текст
Пример:
```bash
curl -sk https://<repeater-ip>/api/command \
-H "X-Auth-Token: $TOKEN" \
--data 'get wifi.status'
```
### `POST /api/firmware-update`
Загрузите `.bin` прошивки приложения через HTTPS-веб-панель и перезагрузитесь после успешного обновления.
Заголовки:
```text
X-Auth-Token: <token>
X-Firmware-MD5: <32-character md5>
Content-Type: application/octet-stream
```
Тело запроса:
```text
raw firmware .bin bytes
```
Ответ:
- `OK` после того, как прошивка записана и перезагрузка запланирована
- `401 Unauthorized`, если токен отсутствует или устарел
- `400` или `500`, если загрузка или проверка прошивки не удалась
### `GET /api/stats`
Получить текущий сводный payload, который использует отдельная страница `/stats`.
Заголовки:
```text
X-Auth-Token: <token>
```
Пример:
```bash
curl -sk https://<repeater-ip>/api/stats \
-H "X-Auth-Token: $TOKEN"
```
Примечания:
- именно это сводное представление веб-панель из репозитория запрашивает первым, прежде чем загружать серии трендов
- если `web.stats` отключён, эндпоинт возвращает `503 Service Unavailable`
- поддерживаемые платы могут также включать необязательный объект `sensors` в сводный payload для текущей телеметрии GPS и окружающей среды
- объект `core` включает необработанный `battery_mv`, сообщаемый платой `battery_pct`, когда он доступен, готовый для UI `battery_display_pct` и специфичные для платы подсказки диапазона `battery_min_mv` / `battery_max_mv`, которые использует `/stats`, когда плата не предоставляет собственный процент заряда батареи
### `GET /api/stats?series=<name>`
Получить одну серию тренда.
Поддерживаемые серии:
- `battery`
- `memory`
- `signal`
- `noise_floor`
- `packets`
- `voltage`
- `sensor_temp`
- `humidity`
- `pressure`
- `pressure_altitude`
- `mcu_temp`
- `gps_altitude`
- `gps_satellites`
Пример:
```bash
curl -sk "https://<repeater-ip>/api/stats?series=memory" \
-H "X-Auth-Token: $TOKEN"
```
Примечания:
- используйте `?series=battery`, а не просто `?series`
- встроенная веб-панель загружает эти серии последовательно, а не все сразу, чтобы снизить нагрузку на память платы
- серии окружающей среды включаются только когда плата сообщает эти показания; если в серии ещё нет сохранённых точек, она возвращает пустой массив `points` и `current:null`
### `GET /api/stats?view=legacy`
Получить более старый payload статистики в стиле bundle.
Пример:
```bash
curl -sk "https://<repeater-ip>/api/stats?view=legacy" \
-H "X-Auth-Token: $TOKEN"
```
Он существует для совместимости и диагностики. Для новых интеграций предпочитайте сводный эндпоинт плюс отдельные запросы `series`.
## Типовые сценарии использования
### 1. Удалённый доступ к CLI
`/api/command` — самый гибкий эндпоинт. Он позволяет выполнять те же команды CLI, которые принимает репитер.
Примеры:
- `get wifi.status`
- `get mqtt.status`
- `get web.status`
- `get web.stats.status`
- `get repeat`
- `get radio`
Это полезно для:
- удалённой диагностики с ноутбука или телефона
- простых скриптов, которые собирают рабочее состояние
- админ-инструментов, которые хотят переиспользовать существующее поведение CLI вместо добавления новых эндпоинтов прошивки
Пример:
```bash
curl -sk https://<repeater-ip>/api/command \
-H "X-Auth-Token: $TOKEN" \
--data 'get mqtt.status'
```
### 2. Сборка лёгкого дашборда состояния
Используйте `/api/stats` для сводной информации и по одному вызову `series` за раз для линий трендов.
Рекомендуемый сценарий:
1. получите `/api/stats`
2. отобразите текущее состояние сервисов и сводные поля
3. запрашивайте одну серию тренда только когда это нужно
4. обновляйте с интервалом `60` секунд или реже, если репитер загружен
Это тот же базовый сценарий, который использует встроенная страница `/stats`.
### 3. Использование API для быстрых проверок работоспособности
Поскольку `/api/command` возвращает вывод CLI напрямую, он хорошо подходит для небольших эксплуатационных проверок в скриптах или домашнем мониторинге.
Примеры:
- убедиться, что у репитера по-прежнему есть Wi-Fi
- проверить состояние подключения к MQTT-брокеру
- убедиться, что веб-панель включена, прежде чем пытаться читать статистику
- убедиться в текущих настройках радио перед применением изменений
Пример:
```bash
curl -sk https://<repeater-ip>/api/command \
-H "X-Auth-Token: $TOKEN" \
--data 'get web.status'
```
### 4. Удалённые административные действия
Веб-панель также использует `/api/command` для действий оператора, а не только для запросов на чтение.
Примеры:
- `advert`
- `reboot`
- `start ota`
- `time <epoch>`
- `time.force <epoch>`
Это мощные команды. Относитесь к ним так же, как к прямому доступу к CLI через последовательный порт.
Пример:
```bash
curl -sk https://<repeater-ip>/api/command \
-H "X-Auth-Token: $TOKEN" \
--data 'advert'
```
### 5. Помощники удалённой настройки
Веб-панель сохраняет настройки, генерируя команды CLI и отправляя их через `/api/command`.
Это значит, что ваши собственные инструменты могут делать то же самое для специфичных для PosadMesh настроек, таких как:
- поля идентичности репитера
- информация о владельце
- переключатели MQTT-брокера
- метаданные владельца MQTT PosadMesh
- настройки радио, поддерживаемые CLI репитера
Это практичный способ автоматизировать настройку, сохраняя существующую семантику CLI.
## Пример скрипта
Этот пример на shell выполняет вход, получает сводную статистику, получает одну серию тренда и запускает команду CLI:
```bash
#!/usr/bin/env bash
set -euo pipefail
BASE_URL="https://192.168.1.123"
PASSWORD="your-admin-password"
TOKEN=$(curl -sk -X POST "$BASE_URL/login" --data "$PASSWORD")
echo "Summary:"
curl -sk "$BASE_URL/api/stats" \
-H "X-Auth-Token: $TOKEN"
echo
echo "Memory trend:"
curl -sk "$BASE_URL/api/stats?series=memory" \
-H "X-Auth-Token: $TOKEN"
echo
echo "MQTT status:"
curl -sk "$BASE_URL/api/command" \
-H "X-Auth-Token: $TOKEN" \
--data 'get mqtt.status'
```
## Случаи ошибок
Частые ответы:
- `401 Unauthorized`: токен отсутствует или истёк
- `503 Service Unavailable`: статистика отключена
- `404 No stats data`: запрошенный payload статистики не удалось собрать
- `400 Bad request`: некорректное тело запроса входа или команды
Если запросы статистики не выполняются:
1. убедитесь, что веб-панель включена
2. убедитесь, что `web.stats` включён
3. убедитесь, что токен сессии всё ещё действителен
4. снизьте частоту опроса, если плата испытывает нехватку памяти
## Практические рекомендации
- предпочитайте `/api/command`, когда нужен точный паритет с CLI
- предпочитайте `/api/stats` для дашбордов и представлений трендов
- держите опрос умеренным, особенно на репитерах с двумя активными MQTT-соединениями
- если вы закончили диагностику, рассмотрите отключение веб-панели командой `set web off`, чтобы максимизировать запас heap на ограниченных платах