一、前言
本篇文章我是在Linux下使用 Docker 进行部署chirpstack,chirpstack采用的是v4 版本,v4 版本 与 v3版本 相比,gRPC API 等做了一些改变,需要考虑兼容性。但是我们仅仅使用Docker部署chirpstack 其实就目录和web 界面发生了一些改变,配置逻辑是一样的,并没有太大改变。如果大家用的是 v3版本,哪里不懂也可以直接问我。
二、chirpstack
1、chirpstack是什么
ChirpStack 是一个开源的 LoRaWAN 网络服务器,可用于 设置私有或公共 LoRaWAN 网络。ChirpStack 提供了一个 Web 界面 **用于管理网关、设备和应用程序。**ChirpStack 提供了一个基于 gRPC 的 API,可以 用于集成或扩展 ChirpStack。
2、chirpstack组件
(1)ChirpStack Network Server: 简称NS,作用是确保 LoRaWAN 网络的正常运行和管理设备通信。其负责 LoRaWAN 网络的核心逻辑。它处理设备的加入过程、下行链路调度、设备活动状态跟踪等。它还负责处理从 LoRa 网关接收到的上行数据,并将下行数据发送到网关。
(2)ChirpStack Application Server: 简称AS,作用是管理和处理应用层数据,提供用户界面和 API 接口。其负责处理和管理 LoRaWAN 应用层数据。它允许用户定义应用程序、设备配置和数据解码器。它还提供 API 和 Web 界面,用于管理设备、监控网络流量、处理数据解码和发送应用层数据到外部应用程序。
(3)ChirpStack Gateway Bridge:它充当网关和网络服务器之间的中间件。该组件可以将LoRa网关传输来的LoRa数据包转发器协议转换成ChirpStack网络服务器通用的数据格式(JSON和Protobuf)。
(4)PostgreSQL:这是一个开源的关系型数据库管理系统,用于持续化存储 ChirpStack 的配置数据、设备信息、网关信息、应用程序数据等。
(5)Redis:这是一个开源的内存中数据结构存储系统,通常用作数据库、缓存和消息代理。ChirpStack 使用 Redis 来缓存和处理一些实时数据,提高系统性能和响应速度。
(6)Mosquitto:Mosquitto是一个MQTT协议的代理服务器,用于处理设备和ChirpStack组件之间的通信。它允许LoRaWAN网关和ChirpStack服务之间的消息传递。
注意一下Postgre SQL和 Redis 的区别,Postgre SQL基于磁盘存储数据,支持持久化存储,数据在磁盘上存储即使系统重启数据也不会丢失,性能相对较慢。Redis基于内存存储数据,支持高效的读写操作,性能极高。
3、为什么选择Docker部署
(1)简化部署过程:上文已讲过ChirpStack 是由多个服务组件组成的,Docker Compose 允许我们通过一个配置文件(
docker-compose.yml
)定义和运行多个容器,只需要一条命令(
docker-compose up
)即可启动所有服务。
(2)环境隔离:chirpstack的各个服务可以在独立的容器中运行,避免了依赖冲突和环境污染。
**(3)可移植性: **使用 Docker,我们可以确保在开发环境、测试环境和生产环境中运行相同的代码和配置。这有助于避免在不同环境中出现的“环境问题”。
(4)集中配置:所有的服务配置集中在一个
docker-compose.yml
文件中,便于管理和版本控制。我们可以轻松地修改和更新配置。
三、Linux下部署过程
1、从 github 上拉取源代码
v4版本:(接下来以v4版本进行讲解)
git clone https://github.com/chirpstack/chirpstack-docker.git
v3版本:
git clone https://github.com/chirpstack/chirpstack-docker/tree/v3
**2、修改
docker-compose.yml
配置文件**
该文件是一个**使用 Docker Compose 配置的多容器应用程序,用于部署 ChirpStack 物联网平台。**涵盖了 ChirpStack 系统所需的所有主要组件,确保它们在 Docker 容器中协同工作。(注意,该配置文件通常只需要修改你想要的频段和端口,其他不用改变)
(1)chirpstack
这是 ChirpStack 应用服务器(一般不用进行修改)。
chirpstack:
image: chirpstack/chirpstack:4
command: -c /etc/chirpstack
restart: unless-stopped
volumes:
- ./configuration/chirpstack:/etc/chirpstack
- ./lorawan-devices:/opt/lorawan-devices
depends_on:
- postgres
- mosquitto
- redis
environment:
- MQTT_BROKER_HOST=mosquitto
- REDIS_HOST=redis
- POSTGRESQL_HOST=postgres
ports:
- 8080:8080
- image: 使用
chirpstack/chirpstack:4
镜像。 - command: 指定配置文件路径为
/etc/chirpstack
。 - restart: 设置为
unless-stopped
,即除非手动停止,否则容器会自动重启。 - volumes: 挂载本地目录
./configuration/chirpstack
到容器内的/etc/chirpstack
,以及./lorawan-devices
到容器内的/opt/lorawan-devices
。 - depends_on: 依赖
postgres
,mosquitto
,redis
三个服务。 - environment: 设置环境变量,包括
MQTT_BROKER_HOST
,REDIS_HOST
,POSTGRESQL_HOST
。 - ports: 暴露端口
8080
,将容器内的8080
端口映射到主机的8080
端口。
(2)chirpstack-gateway-bridge
这是 ChirpStack 网关桥接器服务(我这里采用的cn470_10频段)。
chirpstack-gateway-bridge:
image: chirpstack/chirpstack-gateway-bridge:4
restart: unless-stopped
ports:
- 1700:1700/udp
volumes:
- ./configuration/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridge
environment:
- INTEGRATION__MQTT__EVENT_TOPIC_TEMPLATE=cn470_10/gateway/{{ .GatewayID }}/event/{{ .EventType }}
- INTEGRATION__MQTT__STATE_TOPIC_TEMPLATE=cn470_10/gateway/{{ .GatewayID }}/state/{{ .StateType }}
- INTEGRATION__MQTT__COMMAND_TOPIC_TEMPLATE=cn470_10/gateway/{{ .GatewayID }}/command/#
depends_on:
- mosquitto
- estart: 设置为
unless-stopped
。 - ports: 暴露 UDP 端口
1700
。 - volumes: 挂载本地目录
./configuration/chirpstack-gateway-bridge
到容器内的/etc/chirpstack-gateway-bridge
。 - environment: 设置环境变量,指定 MQTT 主题模板。
- depends_on: 依赖
mosquitto
服务。
(3)chirpstack-gateway-bridge-basicstation
这是 ChirpStack 网关桥接器的基本站服务(注意修改command部分)。
chirpstack-gateway-bridge-basicstation:
image: chirpstack/chirpstack-gateway-bridge:4
restart: unless-stopped
command: -c /etc/chirpstack-gateway-bridge/chirpstack-gateway-bridge-basicstation-cn470_10.toml
ports:
- 3001:3001
volumes:
- ./configuration/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridge
depends_on:
- mosquitto
- image: 使用
chirpstack/chirpstack-gateway-bridge:4
镜像。 - restart: 设置为
unless-stopped
。 - command: 使用配置文件
chirpstack-gateway-bridge-basicstation-cn470_10.toml
。 - ports: 暴露端口
3001
。 - volumes: 挂载本地目录
./configuration/chirpstack-gateway-bridge
到容器内的/etc/chirpstack-gateway-bridge
。 - depends_on: 依赖
mosquitto
服务。
(4)chirpstack-rest-api
这是 ChirpStack 的 REST API 服务。
chirpstack-rest-api:
image: chirpstack/chirpstack-rest-api:4
restart: unless-stopped
command: --server chirpstack:8080 --bind 0.0.0.0:8090 --insecure
ports:
- 8090:8090
depends_on:
- chirpstack
- image: 使用
chirpstack/chirpstack-rest-api:4
镜像。 - restart: 设置为
unless-stopped
。 - command: 指定 ChirpStack 服务器为
chirpstack:8080
,绑定地址为0.0.0.0:8090
,并启用不安全模式。 - ports: 暴露端口
8090
。 - depends_on: 依赖
chirpstack
服务。
(5)postgres
这是 PostgreSQL 数据库服务。
postgres:
image: postgres:14-alpine
restart: unless-stopped
volumes:
- ./configuration/postgresql/initdb:/docker-entrypoint-initdb.d
- postgresqldata:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=root
- image: 使用
postgres:14-alpine
镜像。 - restart: 设置为
unless-stopped
。 - volumes: 挂载本地目录
./configuration/postgresql/initdb
到容器内的/docker-entrypoint-initdb.d
,以及挂载 Docker 卷postgresqldata
到容器内的/var/lib/postgresql/data
。 - environment: 设置环境变量
POSTGRES_PASSWORD
为root
。
(6)redis
这是 Redis 内存数据库服务。
redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --save 300 1 --save 60 100 --appendonly no
volumes:
- redisdata:/data
- image: 使用
redis:7-alpine
镜像。 - restart: 设置为
unless-stopped
。 - command: 运行
redis-server
,并指定保存策略。 - volumes: 挂载 Docker 卷
redisdata
到容器内的/data
。
(7)mosquitto
这是 MQTT 消息代理服务。
mosquitto:
image: eclipse-mosquitto:2
restart: unless-stopped
ports:
- 1883:1883
volumes:
- ./configuration/mosquitto/config/:/mosquitto/config/
(8)Volumes
定义数据卷。
volumes:
postgresqldata:
redisdata:
- postgresqldata: 用于存储 PostgreSQL 数据。
- redisdata: 用于存储 Redis 数据。
3、docke-compose启动
sudo docker-compose up -d
四、web界面部署过程
1、访问 chirpstack(IP):8080,默认账号密码是admin
2、创建网关
接下来就正常给网关起名字,但是网关ID要记住,网关配置中需要修改相对应的ID。
3、添加设备文件
根据自己的要求进行填写。
4、配置AS
添加玩应用后,依次在应用中添加设备和多播设置等。
最后,运行网关,看网关是否能够连接到云服务器,并成功转发消息。
五、版本更新后,数据库无法使用
最近,我想将我的chirpstack 版本进行升级,将原来的Docker容器和镜像都删除,并拉取新版本的chirpstack代码,通过docker-compose进行部署。但是,遇到了之前没有遇到过的问题,**postgresql 和 redis 数据库无法正常使用了!**日志错误如下:![](https://i-blog.csdnimg.cn/direct/e8f937178bab4f7e83894b60673aa4fd.png)
在这里我谈一下自己的理解,如有不对,希望大家能够指出。我的理解是上一个版本的postgresql将数据卷挂载了。这个数据卷挂载之后就可以允许不同的容器之间共享数据,并且独立于容器的生命周期。就算我把Docker容器和镜像都删除了,这个数据卷依然还在挂载。所以我下载新版本的postgresql镜像,因为设置里的挂载路径相同,所以我新下的postgresql就无法挂载了,然后chirpstack新版本下的这几个容器之间也就无法进行数据共享和存储了。
解决办法:
//列出数据卷
docker volume ls
//删除之前挂载的数据卷
docker volume rm chirpstack-docker_postgresqldata
docker volume rm chirpstack-docker_redisdata
//重新启动
sudo docker-compose up -d
版权归原作者 努力学代码的小信 所有, 如有侵权,请联系我们删除。