Skip to content

开源的物联网平台thingsboard部署

仲灏2021-12-30约 1 分钟

<div style="display: none;" hidden="true" aria-hidden="true" data-nosnippet>Are you an LLM? You can read better optimized documentation at /pages/b4e72c.md for this page in Markdown format</div>

服务器准备工作

  • centos 7

  • docker

  • docker-compose

  • 暂时关闭防火墙

部署过程中遇到的问题我也在最后的目录中记录下来了 感谢东哥解惑


安装postgresql

  • 创建/opt/docker/docker-compose.yml 文件
dockerfile
version: '3.5'
services:
  timescaledb:
    image: timescale/timescaledb:1.7.1-pg12
    container_name: basic-timescaledb
    restart: unless-stopped
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: *****
    volumes:
      - ./data:/var/lib/postgresql/data
  • 跑一下 docker-compose up

    • 如果 容器运行起来了 就可以用 Navicat Premium 连接一下
    • img
    • 连接成功后创建数据库 thingsboard(名字随便起)

为 docker配置远程连接

编辑/etc/docker/daemon.json

plain
{
	"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}

或者

    • 通过systemd配置文件

创建配置文件/etc/systemd/system/docker.service.d/docker.conf

plain
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    • 保存文件sudo systemctl daemon-reload
    • 重启dockersudo systemctl restart docker.service
    • 查看是否开启端口sudo netstat -lntp | grep dockerd
plain
tcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd
    • docker cli 测试docker -H :2375 ps
plain
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS

本地准备工作


导入项目文件夹

  • 若代码显示飘红有错误提示 建议安装插件 **Lombok (**https://juejin.im/post/6844903557016076302)

    • Lombok是一款好用顺手的工具,就像Google Guava一样,在此予以强烈推荐,每一个Java工程师都应该使用它。Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。它通过注释实现这一目的*。通过在开发环境中实现Lombok,开发人员可以节省构建诸如hashCode()和equals()这样的方法以及以往用来分类各种accessor和mutator的大量时间。*

修改数据库地址

    • 打开文件application/src/main/resources
java
# SQL DAO Configuration
spring:
...
  datasource:
    driverClassName: "${SPRING_DRIVER_CLASS_NAME:org.postgresql.Driver}"
    url: "${SPRING_DATASOURCE_URL:jdbc:postgresql://192.168.9.30:5432/thingsboard}" // thingsboard名字与数据库名字一致
    username: "${SPRING_DATASOURCE_USERNAME:postgres}"
    password: "${SPRING_DATASOURCE_PASSWORD:******}"
    hikari:
      maximumPoolSize: "${SPRING_DATASOURCE_MAXIMUM_POOL_SIZE:16}"

安装打个包看一下

img

......(时间比较久, 我们就先处理下服务器)



这时我们回来再看本地项目

img

运行server

*application/src/main/java/org.thingsboard.server/ThingsbaordServerApplication*

若出现错误

img

修改项目下 .idea\workspace.xml,找到标签 <component name="PropertiesComponent"> , 在标签里加一行 <property name="dynamic.classpath" value="true" />重新再跑下

在本地浏览器中打开: http://localhost:8080/ 显示登录页面表示你已经成功在本地跑起来了

接下来就是放在服务器上

连接远程docker

前面做了服务端docker具备远程连接的工作, 现在在本地配置并连接

  • 配置

编辑msa/tb/docker-postgre文件夹下logback.xml

java
<!DOCTYPE configuration>
<configuration scan="true" scanPeriod="10 seconds">

    <appender name="fileLogAppender"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/var/log/thingsboard/thingsboard.log</file>
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>/var/log/thingsboard/thingsboard.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{ISO8601} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{ISO8601} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="org.thingsboard.server" level="INFO" />
    <logger name="com.microsoft.azure.servicebus.primitives.CoreMessageReceiver" level="OFF" />

    <root level="INFO">
        <appender-ref ref="fileLogAppender"/>
        <appender-ref ref="STDOUT"/>
    </root>

</configuration>
ENV SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQLDialect
ENV SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
ENV SPRING_DATASOURCE_URL=jdbc:postgresql://192.168.9.31:5432/thingsboard
ENV SPRING_DATASOURCE_USERNAME=${pkg.user}
ENV SPRING_DATASOURCE_PASSWORD=******

img

  • 远程地址

img

  • 镜像

img

  • 最后shift+f10 run 下docker

遇到的错误处理

  • chmod: changing permissions of ‘/var/lib/postgresql/data’: Permission denied

    • 发现此内容可解决chmod问题:http :

//stackoverflow.com/questions/24288616/permission-denied-on-accessing-host-directory-in-docker

也可以在此处查看selinux安全问题:https :

//docs.docker.com/engine/tutorials/dockervolumes/#/volume-labels

我通过在volume命令末尾添加:z修复了docker-compose文件

volumes: - /media/dataDemo/db:/var/lib/postgresql/data:z

volumes: :Z的含义

docker-compose.yml举例:

volumes:

- /mnt/db:/var/lib/db:Z

如果宿主机开启了SELinux,如果不加“:Z”,会报错权限不足:Permission denied。

这涉及到label权限的问题。

默认情况下docker会打上label: svirt_sandbox_file_t。

宿主机上需要mount的目录,此时需要打上同样的label:

使用:z相当于执行语句:

chcon -Rt svirt_sandbox_file_t /var/db

使用:Z相当于宿主机打上了docker里的所有label。

参考:

http://www.projectatomic.io/blog/2015/06/using-volumes-with-docker-can-cause-problems-with-selinux/

  • Caused by: java.net.SocketTimeoutException: connect timed out

配置远程连接

  • docker Failed to restart docker.service: Unit not found.

新版本需要docker.socket

    • 卸载docker,再重新安装,即可出现docker.socket
    • 创建一个/usr/lib/systemd/system/docker.socket文件,然后systemctl daemon-reload,最后systemctl start docker.service,即可启动成功。
  • ERROR: for timescaledb Cannot start service timescaledb: Unknown runtime specified docker-runc

​ ERROR: Encountered errors while bringing up the project.

    • 关闭前停止容器
  • driver failed programming external connectivity on endpoint

    • docker服务启动时定义的自定义链DOCKER由于 centos7 firewall 被清掉, firewall的底层是使用iptables进行数据过滤,建立在iptables之上,这可能会与 Docker 产生冲突。当 firewalld 启动或者重启的时候,将会从 iptables 中移除 DOCKER 的规则,从而影响了 Docker 的正常工作。当你使用的是 Systemd 的时候, firewalld 会在 Docker 之前启动,但是如果你在 Docker 启动之后再启动 或者重启 firewalld ,你就需要重启 Docker 进程了。重启docker服务及可重新生成自定义链DOCKER