3. 搭建基础网络服务器:使用 ChirpStack 在 Docker 中部署
好了,到了真正动手的时候了。前面我们聊了 LoRaWAN 的协议栈和安全模型,现在得把地基打牢。网络服务器是整个测试环境的“大脑”,我选 ChirpStack 是因为它开源、文档全,而且社区活跃。你在网上搜 LoRaWAN 服务器,十有八九会碰到它。
我个人习惯把所有服务都容器化。为什么?因为 Docker 能让你避免“在我电脑上是好的”这种尴尬。你想想看,万一你换台机器,或者重装系统,难道还要重新编译一遍?Docker 一把梭,省心多了。
3.1 整体架构:三个组件各司其职
在敲命令之前,你得先搞清楚 ChirpStack 这套东西是怎么分工的。它拆成了三个独立的服务,每个都有自己的活要干。
核心组件一览:
- ChirpStack Network Server (NS):处理 LoRaWAN 的 MAC 层逻辑,比如入网激活、确认帧、自适应数据速率(ADR)。它不关心你的业务数据是什么,只负责把数据包从网关安全地送到应用层。
- ChirpStack Application Server (AS):负责业务逻辑。它从 NS 拿到解密后的数据,然后通过 HTTP、MQTT 等接口推送给你的上层应用。说白了,它是“翻译官”。
- ChirpStack Gateway Bridge (GB):连接物理网关和网络服务器的桥梁。它把网关发来的 Semtech UDP 协议包转成 ChirpStack 内部用的 MQTT 协议。
这三个家伙的关系,我画了张图,你看一眼就明白了。
嗯,这里要注意:Gateway Bridge 和 Network Server 之间是通过 MQTT 通信的。所以你还得装一个 MQTT Broker,我一般用 Mosquitto,轻量又稳定。
3.2 准备工作:Docker 与 docker-compose
假设你已经装好了 Docker。没装的话,去官网下个 Docker Desktop 就行,Linux 用户直接 apt install docker.io。我个人建议再装个 docker-compose,因为我们要同时启动好几个容器,用 compose 文件管理起来方便得多。
小提示: 如果你在 Linux 上跑,记得把当前用户加到 docker 组里,不然每次都要 sudo,很烦。
sudo usermod -aG docker $USER
newgrp docker
3.3 编写 docker-compose.yml
这是核心步骤。我会把 Mosquitto、Gateway Bridge、Network Server、Application Server 以及它们依赖的 PostgreSQL 和 Redis 都写在一个 compose 文件里。你直接复制下面这段,保存为 docker-compose.yml。
version: "3.7"
services:
mosquitto:
image: eclipse-mosquitto:2
ports:
- "1883:1883"
- "9001:9001"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
postgresql:
image: postgres:14-alpine
environment:
POSTGRES_USER: chirpstack
POSTGRES_PASSWORD: chirpstack
POSTGRES_DB: chirpstack
volumes:
- ./postgresql/data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
- ./redis/data:/data
chirpstack-gateway-bridge:
image: chirpstack/chirpstack-gateway-bridge:4
ports:
- "1700:1700/udp"
depends_on:
- mosquitto
volumes:
- ./gateway-bridge:/etc/chirpstack-gateway-bridge
chirpstack-network-server:
image: chirpstack/chirpstack-network-server:4
depends_on:
- mosquitto
- postgresql
- redis
volumes:
- ./network-server:/etc/chirpstack-network-server
chirpstack-application-server:
image: chirpstack/chirpstack-application-server:4
ports:
- "8080:8080"
depends_on:
- mosquitto
- postgresql
- redis
volumes:
- ./application-server:/etc/chirpstack-application-server
注意: 上面的配置里,我把配置文件目录都映射到了宿主机。你需要提前创建这些目录,否则容器启动时会报错。
mkdir -p mosquitto/config mosquitto/data postgresql/data redis/data gateway-bridge network-server application-server
3.4 配置 Mosquitto
Mosquitto 默认配置不允许匿名连接。我们做测试环境,先放宽一点。在 mosquitto/config 目录下创建 mosquitto.conf:
listener 1883
allow_anonymous true
listener 9001
protocol websockets
allow_anonymous true
我曾经在项目里因为忘了开 WebSocket 端口,导致前端页面连不上 MQTT,排查了半天。你如果只是网关和服务器通信,1883 就够了。但如果你后面想用浏览器调试,9001 这个 WebSocket 端口就得开着。
3.5 启动服务
所有文件就位后,在 docker-compose.yml 所在目录执行:
docker-compose up -d
第一次启动会拉取镜像,大概需要几分钟。你可以用 docker-compose logs -f 查看实时日志。看到类似下面的输出,就说明跑起来了:
chirpstack-network-server | level=info msg="starting ChirpStack Network Server" version=4.0.0
chirpstack-application-server | level=info msg="starting ChirpStack Application Server" version=4.0.0
3.6 验证部署
打开浏览器,访问 http://localhost:8080。你会看到 ChirpStack Application Server 的 Web 界面。默认用户名和密码是 admin / admin。
登录进去后,先别急着配设备。先检查一下 Network Server 的状态。在左侧菜单找到 “Network Server”,如果显示 “Connected”,那就稳了。
快速验证清单:
| 组件 | 验证方式 | 预期结果 |
|---|---|---|
| Mosquitto | docker-compose ps |
状态为 Up |
| Gateway Bridge | 查看日志 | 无错误,等待网关连接 |
| Network Server | Web UI → Network Server | 显示 Connected |
| Application Server | 浏览器访问 8080 端口 | 登录页面正常显示 |
嗯,到这里,你的基础网络服务器就搭好了。说白了,你现在有了一个能跑 LoRaWAN 协议栈的“大脑”,虽然它还没连上任何网关和设备,但骨架已经立起来了。后面我们会往里面灌数据,做安全测试,那才是真正好玩的地方。