0


在Linux下使用Docker部署chirpstack

一、前言

    本篇文章我是在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_PASSWORDroot

(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
标签: docker 容器

本文转载自: https://blog.csdn.net/m0_65292176/article/details/140269190
版权归原作者 努力学代码的小信 所有, 如有侵权,请联系我们删除。

“在Linux下使用Docker部署chirpstack”的评论:

还没有评论