Files
2026-05-15 09:21:35 -05:00

403 lines
25 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.
# Reticulum MeshChatX
[English](../README.md) | [Deutsch](README.de.md) | [Italiano](README.it.md) | [中文](README.zh.md) | [日本語](README.ja.md)
Существенно доработанный и функционально расширенный форк Reticulum MeshChat от Liam Cottle.
Этот проект независим от оригинального Reticulum MeshChat и не связан с ним.
- Сайт: [meshchatx.com](https://meshchatx.com)
- Исходный код: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
- Официальное зеркало на GitHub: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Релизы: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Журнал изменений: [`CHANGELOG.md`](../CHANGELOG.md)
- Поддержка проекта: [`donate.md`](../donate.md) ([Поддержка проекта](#поддержка-проекта))
- Umbrel App Store: [apps.umbrel.com/app/meshchatx](https://apps.umbrel.com/app/meshchatx)
<a href="https://apps.obtainium.imranr.dev/redirect.html?r=obtainium://add/https://github.com/Quad4-Software/MeshChatX"><img src="https://raw.githubusercontent.com/ImranR98/Obtainium/main/assets/graphics/badge_obtainium.png" height="60" alt="Get it on Obtainium"></a>
rngit NomadNet Node: `5399f5a0212477618821e91e88ce053b:/page/index.mu`
rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
MeshChatX NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## Важные отличия от Reticulum MeshChat
- Для вызовов используется LXST
- Peewee ORM заменён на прямой SQL
- Axios заменён на нативный `fetch`
- Electron 41.x (встроенная среда Node 24)
- Колёса `.whl` с веб-сервером и встроенным фронтендом для разных сценариев развёртывания
- i18n
- PNPM и Poetry для зависимостей
> [!WARNING]
> MeshChatX не гарантирует совместимость данных со старыми версиями Reticulum MeshChat. Сделайте резервную копию перед миграцией или тестированием.
> [!WARNING]
> Устаревшие системы пока не поддерживаются. Текущий базис: Python `>=3.11` и Node `>=24` (Electron 41 выровнен с Node 24; поле `engines` в `package.json` и CI на той же линии).
## Требования
- Python `>=3.11` (из `pyproject.toml`)
- Node.js `>=24` (из `package.json`, поле `engines`)
- pnpm `11.1.2` (из `package.json`, поле `packageManager`)
- Poetry (используется в `Taskfile.yml` и CI)
**Browser Versions Required:**
Safari 16.4 или новее, Chrome 111 или новее, Firefox 128 или новее (встроенный веб-интерфейс).
```bash
task install
task lint:all
task test:all
task build:all
```
## Способы установки
Выберите способ в соответствии со средой и форматом пакета.
| Метод | Включает фронтенд | Архитектуры | Лучше всего для |
| --------------------- | ------------------- | ------------------------------------------------ | ------------------------------------- |
| Docker-образ | Да | `linux/amd64`, `linux/arm64` | Быстрый запуск на серверах Linux |
| Python wheel (`.whl`) | Да | Любая архитектура, поддерживаемая Python | Безголовый/веб-сервер без сборки Node |
| Linux AppImage | Да | `x64`, `arm64` | Портативное использование на ПК |
| Debian-пакет (`.deb`) | Да | `x64`, `arm64` | Установка на Debian/Ubuntu |
| RPM-пакет (`.rpm`) | Да | Зависит от раннера CI для публикуемого артефакта | Fedora/RHEL/openSUSE |
| Из исходников | Собирается локально | Архитектура хоста | Разработка и кастомные сборки |
Примечания:
- GitHub Actions собирает помеченные тегом релизы (Linux wheel/AppImage/deb/rpm, Windows, macOS, Flatpak, Android APK при теге на dev/master, SLSA, черновик релиза) в одном запуске: `.github/workflows/build-release.yml`; образ контейнера — `.github/workflows/docker.yml`. Android CI для веток и PR — `.github/workflows/android-build.yml`.
- AppImage + DEB для Linux `x64` и `arm64` собираются на GitHub; RPM собирается по возможности и выкладывается, если шаг дал артефакт.
## Docker
- **Docker Hub:** `quad4io/meshchatx`
- **GHCR:** `ghcr.io/quad4-software/meshchatx`
```bash
docker compose up -d
```
```bash
docker run -d --name reticulum-meshchatx \
--restart unless-stopped \
--security-opt no-new-privileges:true \
-p 127.0.0.1:8000:8000 \
-v meshchatx-config:/config \
ghcr.io/quad4-software/meshchatx:latest
```
Вместо образа GHCR можно указать `quad4io/meshchatx:latest`, если предпочитаете Docker Hub.
Compose-файл по умолчанию:
- `127.0.0.1:8000` на хосте -> порт `8000` контейнера
- Именованный том Docker **`meshchatx-config`** -> **`/config`** для данных (подходит пользователю **meshchat** в образе, UID 1000, без `chown` на хосте для bind mount)
**По желанию: каталог на хосте**
Замените строку тома на `-v "$(pwd)/meshchat-config:/config"` (Compose: измените `volumes` у сервиса). Контейнер работает от **UID 1000**; каталог на хосте должен быть доступен на запись (обычно: `sudo chown -R 1000:1000 ./meshchat-config`). Создайте пустой каталог до первого запуска, чтобы Docker не создал его с неподходящими правами.
**Просмотр или удаление именованного тома**
```bash
docker volume inspect meshchatx-config
docker rm -f reticulum-meshchatx
docker volume rm meshchatx-config
```
## Установка из релизных артефактов
### 1) Linux AppImage (x64/arm64)
1. Скачайте `ReticulumMeshChatX-v<версия>-linux-<арх>.AppImage` из релизов.
2. Сделайте исполняемым и запустите:
```bash
chmod +x ./ReticulumMeshChatX-v*-linux-*.AppImage
./ReticulumMeshChatX-v*-linux-*.AppImage
```
### 2) Debian/Ubuntu `.deb` (x64/arm64)
1. Скачайте `ReticulumMeshChatX-v<версия>-linux-<арх>.deb`.
2. Установите:
```bash
sudo apt install ./ReticulumMeshChatX-v*-linux-*.deb
```
### 3) RPM-системы
1. Скачайте `ReticulumMeshChatX-v<версия>-linux-<арх>.rpm`, если есть в релизе.
2. Установите:
```bash
sudo rpm -Uvh ./ReticulumMeshChatX-v*-linux-*.rpm
```
### 4) Python wheel (`.whl`)
В релизных wheel включены собранные веб-ресурсы.
```bash
pip install ./reticulum_meshchatx-*-py3-none-any.whl
meshchatx --headless
```
`pipx` также поддерживается:
```bash
pipx install ./reticulum_meshchatx-*-py3-none-any.whl
```
## Запуск из исходников (режим веб-сервера)
Для разработки или локальной сборки.
```bash
git clone https://git.quad4.io/RNS-Things/MeshChatX.git
cd MeshChatX
corepack enable
pnpm config set verify-store-integrity true
pnpm install --frozen-lockfile
pip install "uv==0.11.12"
uv lock --check
uv sync --group dev
pnpm run build-frontend
uv run python -m meshchatx.meshchat --headless --host 127.0.0.1
```
Пояснения к командам установки:
- `pnpm install --frozen-lockfile` запрещает обновление `pnpm-lock.yaml` и завершится с ошибкой, если lock-файл не соответствует `package.json`. Это исключает скрытую установку неожиданной upstream-версии.
- `verify-store-integrity=true` уже задан в `pnpm-workspace.yaml` проекта; явный `pnpm config set` дополнительно ужесточает пользовательскую конфигурацию.
- Lifecycle-скрипты (`preinstall`/`postinstall`) по умолчанию заблокированы в pnpm v11+. Скрипты установки могут запускать только пакеты из `allowBuilds` в `pnpm-workspace.yaml` (сейчас `electron`, `electron-winstaller`, `esbuild`).
- `uv lock --check` сразу падает, если `uv.lock` не синхронизирован с `pyproject.toml`; затем `uv sync --group dev` ставит зависимости только из lock-файла.
- Для строгой установки Poetry только из lock-файла зафиксируйте версию Poetry через `pip install "uv==0.11.12"`, как это делает CI.
Если вы намеренно хотите обновить зависимости, выполните `pnpm update` / `uv lock` отдельным коммитом и проверьте diff lock-файлов до пуша.
## Запуск в песочнице (Linux)
Чтобы запускать нативный `meshchatx` (псевдоним: `meshchat`) с дополнительной изоляцией файловой системы, можно использовать **Firejail** или **Bubblewrap** (`bwrap`), сохраняя обычный сетевой доступ для Reticulum и веб-интерфейса. Полные примеры (pip/pipx, Poetry, USB-serial) в:
- [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md)
Та же страница отображается в списке **Документация** (документация MeshChatX) в приложении, если файлы отдаются из встроенных или синхронизированных `meshchatx-docs`.
## Linux на ПК: шрифты эмодзи
Выбор эмодзи отображает стандартные Unicode-эмодзи системными шрифтами (Electron/Chromium). Если вместо них пустые квадраты («тофу»), установите пакет цветных эмодзи и перезапустите приложение.
| Семейство (примеры) | Пакет |
| -------------------------- | -------------------------------------------------------------------- |
| Arch Linux, Artix, Manjaro | `noto-fonts-emoji` (`sudo pacman -S noto-fonts-emoji`) |
| Debian, Ubuntu | `fonts-noto-color-emoji` (`sudo apt install fonts-noto-color-emoji`) |
| Fedora | `google-noto-emoji-color-fonts` |
После установки при необходимости выполните `fc-cache -fv`. Опционально: `noto-fonts` для лучшего покрытия символов на минимальных установках.
## Сборка настольных пакетов из исходников
Скрипты заданы в `package.json` и `Taskfile.yml`.
### Linux x64 AppImage + DEB
```bash
pnpm run dist:linux-x64
```
### Linux arm64 AppImage + DEB
```bash
pnpm run dist:linux-arm64
```
### RPM
```bash
pnpm run dist:rpm
```
Через Task:
```bash
task dist:fe:rpm
```
## Сборка в контейнере (wheel, AppImage, deb, rpm)
`Dockerfile.build` выполняет те же шаги, что и CI (Poetry, pnpm, `task`, пакетные зависимости APT). Ориентирован на **linux/amd64** (NodeSource amd64, Task amd64). Цель по умолчанию: всё; её можно переопределить build-arg.
Для `MESHCHATX_BUILD_TARGETS` доступны: `all` (по умолчанию), `wheel` или `electron` (AppImage + deb для x64 и arm64, RPM по возможности, без wheel).
Сборка:
```bash
docker build -f Dockerfile.build -t meshchatx-build:local .
```
Только wheel:
```bash
docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel .
```
Скопируйте `/artifacts` из готового образа на хост:
```bash
cid=$(docker create meshchatx-build:local)
docker cp "${cid}:/artifacts" ./meshchatx-artifacts
docker rm "${cid}"
```
## Поддержка архитектур
- Образ Docker: `amd64`, `arm64`
- Linux AppImage: `x64`, `arm64`
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64` (скрипты сборки есть)
- macOS: скрипты сборки (`arm64`, `universal`) для локальных сред
- Android: только universal APK (см. [`android/README.md`](../android/README.md))
## Android
MeshChatX поддерживает нативные Android APK (не только Termux).
### Сборка APK из исходников
Из корня репозитория:
```bash
# 1) Собрать колёса Chaquopy для android/app/build.gradle
bash scripts/build-android-wheels-local.sh
# 2) Собрать universal APK (один debug + один release за прогон; см. android/README.md)
cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
**Один** вариант Android. Gradle синхронизирует весь каталог `meshchatx/` в `app/src/main/python/meshchatx/`, включая офлайн-колёса репозитория. Документированные и публикуемые сборки используют только **universal**: за один прогон один debug APK и один release APK, каждый со всеми нативными ABI из `android/app/build.gradle`.
- Debug: `android/app/build/outputs/apk/debug/app-debug.apk`
- Release: `android/app/build/outputs/apk/release/app-release-unsigned.apk`
Примечания:
- Релизы по умолчанию не подписаны, пока не настроена подпись (`scripts/sign-android-apks.sh`).
- Нативные ABI внутри universal APK задаются в `android/app/build.gradle` (в т.ч. `armeabi-v7a`, если включён). Сборка колёс для `armeabi-v7a` требует Android SDK в `ANDROID_HOME` (см. `android/README.md`).
- Если в корне репо есть `dist/reticulum_meshchatx-*.whl` (например из `python -m build --wheel -o dist .`), обновление встроенного репозитория предпочитает эту wheel пакету MeshChatX с PyPI. В CI wheel собирается до шага Android Gradle.
Дополнительная документация:
- [`docs/meshchatx_on_android_with_termux.md`](../docs/meshchatx_on_android_with_termux.md)
- [`android/README.md`](../android/README.md)
## Конфигурация
| Аргумент | Переменная окружения | По умолчанию | Описание |
| -------------------------- | ---------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--host` | `MESHCHAT_HOST` | `127.0.0.1` | Адрес привязки веб-сервера |
| `--port` | `MESHCHAT_PORT` | `8000` | Порт веб-сервера |
| `--no-https` | `MESHCHAT_NO_HTTPS` | `false` | Отключить HTTPS |
| `--ssl-cert` / `--ssl-key` | `MESHCHAT_SSL_CERT` / `MESHCHAT_SSL_KEY` | (нет) | Пути к PEM-сертификату и ключу; задаются вместе. Переопределяют автосгенерированные сертификаты в каталоге `ssl/` у идентичности. |
| `--rns-log-level` | `MESHCHAT_RNS_LOG_LEVEL` | (нет) | Уровень лога стека Reticulum (RNS): `none`, `critical`, `error`, `warning`, `notice`, `verbose`, `debug`, `extreme` или число. CLI перекрывает переменную окружения, если заданы оба. |
| `--headless` | `MESHCHAT_HEADLESS` | `false` | Не открывать браузер автоматически |
| `--auth` | `MESHCHAT_AUTH` | `false` | Базовая аутентификация |
| `--reset-password` | `MESHCHAT_RESET_PASSWORD` | `false` | Сбросить сохраненный хэш пароля, чтобы задать новый через веб-интерфейс |
| `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | Каталог данных |
| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | авто/bundled | Каталог фронтенда (для установок без встроенных ресурсов) |
## Ветки
| Ветка | Назначение |
| -------- | ------------------------------------------------------------------ |
| `master` | Стабильные релизы. Только код для продакшена. |
| `dev` | Активная разработка. Возможны нестабильные или неполные изменения. |
## Разработка
Типичные задачи из `Taskfile.yml`:
```bash
task install
task lint:all
task test:all
task build:all
```
Сокращения `Makefile`:
| Команда | Описание |
| -------------- | --------------------------------------- |
| `make install` | Установить зависимости pnpm и UV |
| `make run` | Запуск MeshChatX через UV |
| `make build` | Сборка фронтенда |
| `make lint` | eslint и ruff |
| `make test` | Тесты фронтенда и бэкенда |
| `make clean` | Удалить артефакты сборки и node_modules |
## Версионирование
Текущая версия в репозитории: `4.6.3`.
- Редактируйте для релизного бампа **только** поле `version` в **`package.json`**.
- Команда **`pnpm run version:sync`** (также в начале **`pnpm run build`**) распространяет эту версию в **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (строка продукта), **README** / **lang/README.\*** (строки «текущая версия»), **`docs/meshchatx_on_raspberry_pi.md`** (пример pipx) и вспомогательные поля **`packaging/arch/PKGBUILD`**.
- **`meshchatx.__version__`** читается из **`meshchatx/src/version.py`** без импорта **`meshchatx.src`**, поэтому обычный `import meshchatx` остаётся лёгким.
- Записи **changelog** по-прежнему вносятся вручную при релизе.
## Безопасность
- [`SECURITY.md`](../SECURITY.md)
- [`LEGAL.md`](../LEGAL.md)
- Встроенные проверки целостности и значения по умолчанию HTTPS/WSS в рантайме приложения.
- Сборка CI и релизы на GitHub Actions.
## Добавление языка
Авторский рабочий процесс: ArgosTranslate, затем локальная LLM (Qwen 3 + Gemma 4).
Затем правки и улучшения от сообщества приветствуются через LXMF или любой доступный канал.
Обнаружение локали автоматическое. Добавьте файл в `meshchatx/src/frontend/locales/` (например `xx.json`) с теми же ключами, что в `en.json`, и строку верхнего уровня `_languageName` для подписи в селекторе. Можно скопировать `en.json` и перевести вручную; **машинная генерация (в т. ч. Argos) необязательна** и никогда не требуется.
**По желанию: старт с Argos Translate:** для чернового перевода из `en.json` можно вызвать `scripts/argos_translate.py` (форматирование, цветной вывод, защита плейсхолдеров вроде `{count}`).
```bash
# Установите argostranslate при необходимости
pipx install argostranslate
# Запустите скрипт перевода
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Название языка"
```
После любой машинной прогонки пусть LLM или человек проверяет грамматику, контекст и тон (например формальный/неформальный стиль).
`pnpm test -- tests/frontend/i18n.test.js --run`: проверка равенства ключей с `en.json`.
Никаких других изменений в коде не требуется. Приложение, селектор языка и тесты обнаруживают локали из каталога `meshchatx/src/frontend/locales/` во время сборки.
## Поддержка проекта
Пожертвования добровольны. Они помогают оплатить время и усилия на разработку этого приложения.
**Как поддержать:** [`donate.md`](../donate.md) (Monero, Ko-Fi, Buy Me a Coffee).
## Авторы
- [Liam Cottle](https://github.com/liamcottle) - оригинальный Reticulum MeshChat
- [RFnexus](https://github.com/RFnexus) - парсер micron (JavaScript)
- [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST
## Лицензия
Собственные части проекта лицензированы по 0BSD.
Оригинальные upstream-части из Reticulum MeshChat остаются под MIT.
Полный текст и уведомления см. в [`../LICENSE`](../LICENSE).