Files
meshtastic_mqtt_server/README.md
T
2026-06-06 15:56:37 +08:00

282 lines
7.7 KiB
Markdown
Raw 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.
# Meshtastic MQTT Server
Meshtastic MQTT Server 是一个面向 Meshtastic MQTT 数据的本地服务:内置 MQTT broker,接收并校验 Meshtastic MQTT payload,同时提供 Web 管理与地图前端,用于查看节点、消息、位置、遥测、转发状态和管理配置。
本文档重点说明部署与运行方式,不展开代码实现细节。
## 后端功能
后端提供 MQTT broker、Meshtastic 数据校验、数据入库、Web API 和管理后台能力,主要功能包括:
- 用户管理:支持创建管理员用户、修改管理员密码。
- 屏蔽规则管理:支持设置节点屏蔽、IP 屏蔽和屏蔽词;屏蔽词可设置匹配方式、是否区分大小写、启用状态和原因。
- 消息拦截:命中被屏蔽节点、被屏蔽 IP 或屏蔽词的消息会被拒绝,并写入丢弃记录。
- MQTT 转发管理:支持配置多个 MQTT 转发器,设置源端、目标端、TLS、认证信息、转发 topic、方向、QoS、retain,并可查看转发运行状态或重启转发器。
- 运行时设置:支持动态设置无法解密的加密 MQTT 包是否允许继续转发。
- 地图源管理:支持配置地图瓦片源、默认地图源、启用状态、最大缩放级别、attribution 和是否通过后端代理地图瓦片。
- 地图瓦片代理与缓存:可通过后端代理地图瓦片请求,并使用本地目录缓存。
- 帮助内容管理:支持在管理后台编辑 Markdown 帮助内容,并提供预览与展示。
- 数据库支持:支持 SQLite 和 MySQL。
- Meshtastic payload 校验:在消息转发前校验 Meshtastic MQTT 数据包,无效数据会被拒绝并记录。
- 数据解析与存储:解析并保存节点信息、地图上报、文本消息、位置、遥测、路由、traceroute 等数据。
## 运行环境
### 后端
- Go`1.25.0` 或更高版本
- 默认监听:
- MQTT`0.0.0.0:1883`
- Web`0.0.0.0:8080`
### 前端
- Node.js:满足 Vite 8 要求
- `^20.19.0`,或
- `>=22.12.0`
- npm:随 Node.js 安装即可
建议生产环境使用当前 LTS 版本的 Node.js,并确保版本满足上述要求。
## 快速部署
### Linux 一键部署
在 Linux 下进入项目目录后,直接执行:
```bash
sudo bash install.sh
```
安装脚本会自动拉取最新代码、安装前端依赖、构建前端、编译后端、安装到 `/opt/mesh_mqtt_go`,并创建和启动 `mesh_mqtt_go` systemd 服务。
### 手动构建前端
```bash
cd meshmap_frontend
npm install
npm run build
cd ..
```
构建完成后,前端静态文件会生成到项目根目录的 `dist`,也就是从 `meshmap_frontend` 目录看是 `../dist`
### 手动构建后端
```bash
go build -o meshtastic_mqtt_server .
```
### 手动启动
```bash
./meshtastic_mqtt_server -web-static-dir ./dist
```
首次启动时,程序会自动生成默认配置文件。
默认配置路径:
- Linux`/etc/mesh_mqtt_go/config.yaml`
- Windows`./win/etc/mesh_mqtt_go/config.yaml`
默认数据路径:
- Linux SQLite`/srv/mesh_mqtt_go/mesh_mqtt_go.db`
- Windows SQLite`./win/etc/mesh_mqtt_go/mesh_mqtt_go.db`
默认地图瓦片缓存目录:
- Linux`/srv/mesh_mqtt_go`
- Windows`./win/srv/mesh_mqtt_go`
## 常用启动参数
```bash
./meshtastic_mqtt_server \
-host 0.0.0.0 \
-port 1883 \
-web-host 0.0.0.0 \
-web-port 8080 \
-web-static-dir ./dist
```
常用参数说明:
| 参数 | 说明 | 默认值 |
| --- | --- | --- |
| `-host` | MQTT broker 监听地址 | `0.0.0.0` |
| `-port` | MQTT broker 监听端口 | `1883` |
| `-psk` | Meshtastic channel PSKBase64 格式 | `AQ==` |
| `-tls` | 启用 MQTT TLS | `false` |
| `-tls-cert` | MQTT TLS 证书文件 | 空 |
| `-tls-key` | MQTT TLS 私钥文件 | 空 |
| `-db-driver` | 数据库类型:`sqlite``mysql` | `sqlite` |
| `-sqlite-path` | SQLite 数据库文件路径 | 见默认数据路径 |
| `-mysql-dsn` | MySQL DSN | 空 |
| `-web` | 启用 Web 服务 | `true` |
| `-web-host` | Web 服务监听地址 | `0.0.0.0` |
| `-web-port` | Web 服务监听端口 | `8080` |
| `-web-socket-path` | Web Unix Socket 路径,Windows 不支持 | Linux 默认 `/opt/mesh_mqtt_go/web.sock` |
| `-web-static-dir` | 前端静态文件目录 | `./dist` |
| `-web-map-tile-cache-dir` | 地图瓦片缓存目录 | 见默认地图瓦片缓存目录 |
| `-admin-username` | Web 管理员用户名 | `admin` |
管理员密码与会话密钥建议通过环境变量传入:
```bash
export MESH_ADMIN_PASSWORD='change-me'
export MESH_ADMIN_SESSION_SECRET='replace-with-a-long-random-string'
./meshtastic_mqtt_server
```
## 配置文件示例
程序会自动生成并补全配置文件,也可以手动维护 `config.yaml`
```yaml
mqtt:
host: 0.0.0.0
port: 1883
tls:
enabled: false
cert_file: ""
key_file: ""
meshtastic:
psk: AQ==
database:
driver: sqlite
sqlite:
path: /srv/mesh_mqtt_go/mesh_mqtt_go.db
mysql:
dsn: ""
web:
enabled: true
host: 0.0.0.0
port: 8080
socket_path: ""
static_dir: ./dist
map_tile_cache_dir: /srv/mesh_mqtt_go
admin:
username: admin
password: admin
session_secret: ""
session_secure: false
```
> 生产环境请修改默认管理员密码,并设置足够长、随机的 `session_secret`。如果通过 HTTPS 访问 Web 管理后台,建议将 `session_secure` 设置为 `true`。
## 使用 SQLite 部署
SQLite 是默认数据库,适合单机部署:
```bash
mkdir -p /srv/mesh_mqtt_go
./meshtastic_mqtt_server \
-db-driver sqlite \
-sqlite-path /srv/mesh_mqtt_go/mesh_mqtt_go.db \
-web-map-tile-cache-dir /srv/mesh_mqtt_go
```
## 使用 MySQL 部署
如果需要使用 MySQL,启动时指定数据库驱动和 DSN:
```bash
./meshtastic_mqtt_server \
-db-driver mysql \
-mysql-dsn 'user:password@tcp(127.0.0.1:3306)/meshtastic?charset=utf8mb4&parseTime=True&loc=Local'
```
## 启用 MQTT TLS
准备证书和私钥后启动:
```bash
./meshtastic_mqtt_server \
-tls \
-tls-cert /path/to/server.crt \
-tls-key /path/to/server.key
```
## 访问服务
启动后可访问:
- Web 前端:`http://服务器地址:8080/`
- 健康检查:`http://服务器地址:8080/api/health`
- MQTT broker`服务器地址:1883`
Web 管理后台默认账号:
- 用户名:`admin`
- 密码:`admin`
生产环境请务必修改默认密码。
## systemd 部署示例
以下示例假设:
- 后端可执行文件位于 `/opt/mesh_mqtt_go/meshtastic_mqtt_server`
- 前端静态文件位于 `/opt/mesh_mqtt_go/dist`
- 数据与缓存目录位于 `/srv/mesh_mqtt_go`
- 配置文件位于 `/etc/mesh_mqtt_go/config.yaml`
创建服务文件 `/etc/systemd/system/mesh_mqtt_go.service`
```ini
[Unit]
Description=Meshtastic MQTT Server
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/mesh_mqtt_go
ExecStart=/opt/mesh_mqtt_go/meshtastic_mqtt_server -web-static-dir /opt/mesh_mqtt_go/dist
Environment=MESH_ADMIN_PASSWORD=change-me
Environment=MESH_ADMIN_SESSION_SECRET=replace-with-a-long-random-string
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
```
启用并启动服务:
```bash
sudo systemctl daemon-reload
sudo systemctl enable --now mesh_mqtt_go
sudo systemctl status mesh_mqtt_go
```
查看日志:
```bash
sudo journalctl -u mesh_mqtt_go -f
```
## 生产环境建议
- 修改默认管理员密码。
- 设置随机且足够长的 `MESH_ADMIN_SESSION_SECRET`
- 使用反向代理提供 HTTPS。
- 如果 Web 管理后台通过 HTTPS 访问,启用安全 Cookie。
- 根据实际情况开放防火墙端口:
- MQTT`1883`
- MQTT TLS:自定义端口或仍使用 `1883`
- Web`8080` 或反向代理端口
- 定期备份数据库文件或 MySQL 数据库。
- 为地图瓦片缓存目录预留足够磁盘空间。
## 开源协议
本项目采用 MIT License 开源。详见项目许可证文件。