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 协议。

这三个家伙的关系,我画了张图,你看一眼就明白了。

ChirpStack 三组件架构图 ChirpStack 核心组件与数据流 LoRa 网关 Semtech UDP Gateway Bridge 协议转换 Network Server MAC 层处理 App Server 业务接口 MQTT Broker 数据流向 网关 → GB → NS → AS NS ↔ MQTT Broker

嗯,这里要注意: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 协议栈的“大脑”,虽然它还没连上任何网关和设备,但骨架已经立起来了。后面我们会往里面灌数据,做安全测试,那才是真正好玩的地方。