Files

383 lines
18 KiB
Markdown

# Reticulum MeshChatX
[English](../README.md) | [Deutsch](README.de.md) | [Русский](README.ru.md) | [中文](README.zh.md) | [日本語](README.ja.md)
Un fork ampiamente modificato e ricco di funzionalita di Reticulum MeshChat di Liam Cottle.
Questo progetto e indipendente dal progetto originale Reticulum MeshChat e non e affiliato ad esso.
- Sito web: [meshchatx.com](https://meshchatx.com)
- Codice sorgente: [git.quad4.io/RNS-Things/MeshChatX](https://git.quad4.io/RNS-Things/MeshChatX)
- Mirror ufficiale su GitHub: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Release: [github.com/Quad4-Software/MeshChatX](https://github.com/Quad4-Software/MeshChatX)
- Changelog: [`CHANGELOG.md`](../CHANGELOG.md)
rngit: `git clone rns://926baefe13daf5178c174f158dae1b45/quad4/MeshChatX`
NomadNet Node: `c10d80b1a42fa958c37a6cc30dc04f53:/page/index.mu`
## Modifiche importanti rispetto a Reticulum MeshChat
- Usa LXST per le chiamate
- Peewee ORM sostituito con SQL diretto
- Axios sostituito con `fetch` nativo
- Electron 41.x (runtime Node 24 incluso)
- Wheel `.whl` con web server e asset frontend integrati per piu opzioni di deploy
- i18n
- PNPM e Poetry per le dipendenze
> [!WARNING]
> MeshChatX non garantisce la compatibilita dei dati con le versioni precedenti di Reticulum MeshChat. Eseguire un backup prima della migrazione o dei test.
> [!WARNING]
> I sistemi legacy non sono ancora supportati. Base attuale: Python `>=3.11` e Node `>=24` (Electron 41 allineato a Node 24; `engines` in `package.json` e la CI seguono la stessa linea).
## Requisiti
- Python `>=3.11` (da `pyproject.toml`)
- Node.js `>=24` (da `package.json`, campo `engines`)
- pnpm `10.33.0` (da `package.json`, campo `packageManager`)
- Poetry (utilizzato in `Taskfile.yml` e nei workflow CI)
**Browser Versions Required:**
Safari 16.4 o successivo, Chrome 111 o successivo, Firefox 128 o successivo (interfaccia web integrata).
```bash
task install
task lint:all
task test:all
task build:all
```
## Metodi di installazione
Scegli il metodo in base all'ambiente e al formato del pacchetto.
| Metodo | Include frontend | Architetture | Ideale per |
| ------------------------- | -------------------- | ------------------------------------------------ | -------------------------------------------------- |
| Immagine Docker | Si | `linux/amd64`, `linux/arm64` | Avvio rapido su server Linux |
| Python wheel (`.whl`) | Si | Qualsiasi architettura supportata da Python | Installazione headless/web-server senza build Node |
| Linux AppImage | Si | `x64`, `arm64` | Uso desktop portatile |
| Pacchetto Debian (`.deb`) | Si | `x64`, `arm64` | Installazione Debian/Ubuntu |
| Pacchetto RPM (`.rpm`) | Si | Dipende dal runner CI per l'artefatto pubblicato | Fedora/RHEL/openSUSE |
| Da sorgente | Compilato localmente | Architettura host | Sviluppo e build personalizzati |
Note:
- GitHub Actions compila le release con tag (Linux wheel/AppImage/deb/rpm, Windows, macOS, Flatpak, APK Android se il tag è su dev/master, SLSA, bozza di release) in un'unica esecuzione tramite `.github/workflows/build-release.yml`; l'immagine container tramite `.github/workflows/docker.yml`. CI Android per branch e PR: `.github/workflows/android-build.yml`.
- Per Linux, `x64` e `arm64` AppImage + DEB sono compilate su GitHub; il RPM e tentato e viene caricato quando l'artefatto e prodotto.
## 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 "$(pwd)/meshchat-config:/config" \
ghcr.io/quad4-software/meshchatx:latest
```
Al posto dell'immagine GHCR puoi usare `quad4io/meshchatx:latest` se preferisci Docker Hub.
Il file compose predefinito mappa:
- `127.0.0.1:8000` sull'host -> porta `8000` del container
- `./meshchat-config` -> `/config` per la persistenza
In caso di errori di permessi:
```bash
sudo chown -R 1000:1000 ./meshchat-config
```
## Installazione da artefatti di release
### 1) Linux AppImage (x64/arm64)
1. Scaricare `ReticulumMeshChatX-v<versione>-linux-<arch>.AppImage` dalle release.
2. Rendere eseguibile e avviare:
```bash
chmod +x ./ReticulumMeshChatX-v*-linux-*.AppImage
./ReticulumMeshChatX-v*-linux-*.AppImage
```
### 2) Debian/Ubuntu `.deb` (x64/arm64)
1. Scaricare `ReticulumMeshChatX-v<versione>-linux-<arch>.deb`.
2. Installare:
```bash
sudo apt install ./ReticulumMeshChatX-v*-linux-*.deb
```
### 3) Sistemi RPM
1. Scaricare `ReticulumMeshChatX-v<versione>-linux-<arch>.rpm` se presente nella release.
2. Installare:
```bash
sudo rpm -Uvh ./ReticulumMeshChatX-v*-linux-*.rpm
```
### 4) Python wheel (`.whl`)
I wheel delle release includono gli asset web compilati.
```bash
pip install ./reticulum_meshchatx-*-py3-none-any.whl
meshchatx --headless
```
`pipx` e supportato:
```bash
pipx install ./reticulum_meshchatx-*-py3-none-any.whl
```
## Esecuzione da sorgente (modalita web server)
Per sviluppo o build locali personalizzate.
```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 "poetry==2.3.4"
poetry check --lock
poetry install
pnpm run build-frontend
poetry run python -m meshchatx.meshchat --headless --host 127.0.0.1
```
Note sui comandi di installazione:
- `pnpm install --frozen-lockfile` rifiuta di aggiornare `pnpm-lock.yaml` e fallisce se il lockfile non corrisponde a `package.json`. Cosi' si evita che una versione upstream inattesa venga installata silenziosamente.
- `verify-store-integrity=true` e' impostato anche nel `.npmrc` del progetto; la riga esplicita `pnpm config set` rafforza inoltre la configurazione utente.
- Gli script di lifecycle (`preinstall`/`postinstall`) sono bloccati di default in pnpm v10+. Solo i pacchetti elencati in `pnpm.onlyBuiltDependencies` di `package.json` possono eseguire script di installazione (attualmente `electron`, `electron-winstaller`, `esbuild`).
- `poetry check --lock` fallisce subito se `poetry.lock` non e' allineato con `pyproject.toml`; `poetry install` risolve poi solo dal lockfile.
- Per un'installazione Poetry strettamente basata sul lockfile (senza refresh implicito), fissa Poetry con `pip install "poetry==2.3.4"`, in linea con la CI.
Se vuoi aggiornare intenzionalmente le dipendenze, esegui `pnpm update` / `poetry update` in un commit dedicato e rivedi il diff del lockfile prima del push.
## Esecuzione in sandbox (Linux)
Per eseguire il binario nativo `meshchatx` (alias: `meshchat`) con isolamento aggiuntivo del filesystem, puoi usare **Firejail** o **Bubblewrap** (`bwrap`) mantenendo l'accesso di rete normale per Reticulum e l'interfaccia web. Esempi completi (pip/pipx, Poetry, note sulla seriale USB) sono in:
- [`docs/meshchatx_linux_sandbox.md`](../docs/meshchatx_linux_sandbox.md)
La stessa pagina compare nell'elenco **Documentazione** (documentazione MeshChatX) in-app quando viene servita dai file `meshchatx-docs` in bundle o sincronizzati.
## Desktop Linux: font emoji
Il selettore emoji mostra gli emoji Unicode standard usando i font di sistema (Electron/Chromium). Se compaiono quadrati vuoti ("tofu"), installate un pacchetto emoji a colori e riavviate l'app.
| Famiglia (esempi) | Pacchetto |
| -------------------------- | -------------------------------------------------------------------- |
| 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` |
Dopo l'installazione, eseguite `fc-cache -fv` se i glifi non compaiono fino al prossimo accesso. Opzionale: `noto-fonts` per una copertura simboli più ampia su installazioni minime.
## Compilazione pacchetti desktop da sorgente
Gli script sono definiti in `package.json` e `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
```
Oppure tramite Task:
```bash
task dist:fe:rpm
```
## Build container (wheel, AppImage, deb, rpm)
`Dockerfile.build` esegue le stesse fasi usate in CI (Poetry, pnpm, `task`, dipendenze APT). Orientato a **linux/amd64** (tarball NodeSource amd64, Task amd64). Il target predefinito e completo; si puo sovrascrivere con un build-arg.
Valori per `MESHCHATX_BUILD_TARGETS`: `all` (default), `wheel` o `electron` (AppImage + deb per x64 e arm64, RPM se possibile, senza wheel).
Build:
```bash
docker build -f Dockerfile.build -t meshchatx-build:local .
```
Solo wheel:
```bash
docker build -f Dockerfile.build --build-arg MESHCHATX_BUILD_TARGETS=wheel -t meshchatx-build:wheel .
```
Copiare `/artifacts` dall'immagine finita all'host:
```bash
cid=$(docker create meshchatx-build:local)
docker cp "${cid}:/artifacts" ./meshchatx-artifacts
docker rm "${cid}"
```
## Supporto architetture
- Immagine Docker: `amd64`, `arm64`
- Linux AppImage: `x64`, `arm64`
- Linux DEB: `x64`, `arm64`
- Windows: `x64`, `arm64` (script di build disponibili)
- macOS: script di build disponibili (`arm64`, `universal`) per ambienti di build locali
- Android: solo APK universale (vedi [`android/README.md`](../android/README.md))
## Android
MeshChatX supporta build APK Android native (non solo Termux).
### Build APK da sorgente
Dalla root del repository:
```bash
# 1) Build delle wheel Chaquopy usate da android/app/build.gradle
bash scripts/build-android-wheels-local.sh
# 2) Build APK universal (un debug + una release per esecuzione; vedi android/README.md)
cd android
./gradlew --no-daemon :app:assembleDebug :app:assembleRelease
```
**Una** sola variante Android. Gradle sincronizza l'intera directory `meshchatx/` in `app/src/main/python/meshchatx/`, incluse le wheel offline del repository. Build documentate e pubblicate usano solo packaging **universal**: un APK debug e uno release per esecuzione, ciascuno con tutti gli ABI nativi configurati in `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`
Note:
- Gli output di release non sono firmati finche non configuri la firma (`scripts/sign-android-apks.sh`).
- Gli ABI nativi nel APK universale seguono `android/app/build.gradle` (incluso `armeabi-v7a` se abilitato). Le wheel per `armeabi-v7a` richiedono Android SDK su `ANDROID_HOME` (vedi `android/README.md`).
- Se esiste in root `dist/reticulum_meshchatx-*.whl` (es. da `python -m build --wheel -o dist .`), l'aggiornamento del repository in bundle preferisce quella wheel rispetto a PyPI. In CI la wheel viene costruita prima del passo Gradle Android.
Documentazione aggiuntiva:
- [`docs/meshchatx_on_android_with_termux.md`](../docs/meshchatx_on_android_with_termux.md)
- [`android/README.md`](../android/README.md)
## Configurazione
| Argomento | Variabile d'ambiente | Predefinito | Descrizione |
| -------------------------- | ---------------------------------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--host` | `MESHCHAT_HOST` | `127.0.0.1` | Indirizzo di bind del web server |
| `--port` | `MESHCHAT_PORT` | `8000` | Porta del web server |
| `--no-https` | `MESHCHAT_NO_HTTPS` | `false` | Disattiva HTTPS |
| `--ssl-cert` / `--ssl-key` | `MESHCHAT_SSL_CERT` / `MESHCHAT_SSL_KEY` | (nessuno) | Percorsi PEM certificato e chiave; impostare entrambi. Sostituisce i certificati auto-generati sotto l'identita nella directory `ssl/`. |
| `--rns-log-level` | `MESHCHAT_RNS_LOG_LEVEL` | (nessuno) | Livello di log Reticulum (RNS): `none`, `critical`, `error`, `warning`, `notice`, `verbose`, `debug`, `extreme` o numerico. La CLI ha priorita sulla variabile d'ambiente se entrambe sono impostate. |
| `--headless` | `MESHCHAT_HEADLESS` | `false` | Non aprire il browser automaticamente |
| `--auth` | `MESHCHAT_AUTH` | `false` | Attiva autenticazione base |
| `--storage-dir` | `MESHCHAT_STORAGE_DIR` | `./storage` | Directory dei dati |
| `--public-dir` | `MESHCHAT_PUBLIC_DIR` | auto/bundled | Directory dei file frontend (necessaria per installazioni da sorgente senza asset in bundle) |
## Branch
| Branch | Scopo |
| -------- | --------------------------------------------------------------------- |
| `master` | Release stabili. Solo codice pronto per la produzione. |
| `dev` | Sviluppo attivo. Potrebbe contenere modifiche instabili o incomplete. |
## Sviluppo
Attivita comuni da `Taskfile.yml`:
```bash
task install
task lint:all
task test:all
task build:all
```
Scorciatoie `Makefile`:
| Comando | Descrizione |
| -------------- | ----------------------------------------- |
| `make install` | Installa dipendenze pnpm e poetry |
| `make run` | Esegue MeshChatX tramite poetry |
| `make build` | Compila il frontend |
| `make lint` | Esegue eslint e ruff |
| `make test` | Test frontend e backend |
| `make clean` | Rimuove artefatti di build e node_modules |
## Versionamento
Versione attuale nel repository: `4.6.0`.
- L'unico valore che modifichi per un bump di release e **`version` in `package.json`**.
- Esegui **`pnpm run version:sync`** (all'inizio anche di **`pnpm run build`**) per propagare in **`pyproject.toml`**, **`meshchatx/src/version.py`**, **`THIRD_PARTY_NOTICES.txt`** (riga prodotto), **README** / **lang/README.\*** (righe "versione attuale"), **esempio pipx in `docs/meshchatx_on_raspberry_pi.md`**, e aiuti in **`packaging/arch/PKGBUILD`**.
- **`meshchatx.__version__`** si legge da **`meshchatx/src/version.py`** senza importare **`meshchatx.src`**, cosi un semplice `import meshchatx` resta leggero.
- Le voci del **changelog** restano manuali quando tagghi una release.
## Sicurezza
- [`SECURITY.md`](../SECURITY.md)
- [`LEGAL.md`](../LEGAL.md)
- Controlli di integrita integrati e valori predefiniti HTTPS/WSS nel runtime dell'app.
- Build CI e release su GitHub Actions.
## Aggiungere una lingua
Flusso dell'autore: ArgosTranslate, poi LLM locale (Qwen 3 + Gemma 4).
Poi si accettano volentieri fix dalla community (LXMF o come mi contattate).
Il rilevamento locale e automatico. Aggiungi un file in `meshchatx/src/frontend/locales/` (es. `xx.json`) con le stesse chiavi di `en.json` e un `_languageName` in cima per l'etichetta nel selettore. Puoi copiare `en.json` e tradurre tutto a mano; **la generazione assistita da machine e opzionale** e non e mai obbligatoria.
**Opzionale: avvio con Argos Translate** -- per una bozza partendo da `en.json` puoi usare `scripts/argos_translate.py` (formattazione, output a colori, variabili di interpolazione come `{count}`).
```bash
# Installa argostranslate se non l'hai gia
pipx install argostranslate
# Esegui lo script di traduzione
python scripts/argos_translate.py --from en --to xx --input meshchatx/src/frontend/locales/en.json --output meshchatx/src/frontend/locales/xx.json --name "Nome della tua lingua"
```
Dopo qualsiasi passaggio automatico, un LLM o un revisore umano controlli grammatica, contesto e tono (es. formale vs informale).
Esegui `pnpm test -- tests/frontend/i18n.test.js --run` per verificare la parita delle chiavi con `en.json`.
Non sono necessarie altre modifiche al codice. L'app, il selettore della lingua e i test scoprono le lingue dalla cartella `meshchatx/src/frontend/locales/` durante la compilazione.
## Crediti
- [Liam Cottle](https://github.com/liamcottle) - Reticulum MeshChat originale
- [RFnexus](https://github.com/RFnexus) - parser micron (JavaScript)
- [markqvist](https://github.com/markqvist) - Reticulum, LXMF, LXST
## Licenza
Le parti di proprieta del progetto sono rilasciate sotto 0BSD.
Le parti originali upstream da Reticulum MeshChat restano sotto MIT.
Per testo completo e note, vedi [`../LICENSE`](../LICENSE).