3、私有化部署环境准备:Linux服务器选型(Ubuntu 22.04)、Docker与Docker Compose安装、防火墙与端口规划

好,咱们正式开始动手了。

这一章,说白了就是搭台子。你要把 ThingsBoard 跑起来,总得有个地方放它吧?我见过不少新手,一上来就急着敲 docker run,结果服务器配置不对、端口被占、防火墙没开,折腾半天连控制台都登不进去。嗯,咱们别走弯路,一步到位。

3.1 服务器选型:为什么我推荐 Ubuntu 22.04 LTS

先聊聊服务器操作系统。我个人习惯,只要是做 IoT 相关的私有化部署,首选就是 Ubuntu 22.04 LTS。为什么?

  • 稳定:LTS 版本有 5 年官方支持,你不用隔两年就折腾一次大版本升级。
  • 生态好:Docker、Python、Node.js 这些 IoT 常用工具,apt 直接装,省心。
  • 社区活跃:遇到问题,Stack Overflow 上一搜一大把答案。

我在项目中遇到过用 CentOS 7 部署 ThingsBoard 的案例,结果因为内核版本太老,Docker 的 overlay2 存储驱动死活跑不起来。后来全换成 Ubuntu 22.04,半小时搞定。你想想看,何必跟自己过不去?

硬件最低要求(实测经验)

组件 最低配置 推荐配置
CPU 2 核 4 核
内存 4 GB 8 GB
磁盘 20 GB SSD 50 GB SSD
网络 公网 IP 或内网可达 固定公网 IP

注意:如果你用 4GB 内存的服务器跑 ThingsBoard + PostgreSQL + Redis,内存会非常吃紧。我曾经在 4GB 的机器上试过,系统 OOM Killer 直接把 Java 进程干掉了。建议至少 8GB,别省这点钱。

3.2 Docker 安装:一行命令搞定?没那么简单

很多人觉得装 Docker 就是 apt install docker.io。嗯,能装,但版本往往比较老。我建议用官方仓库装最新版。

先更新系统,装点依赖:

sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release

添加 Docker 官方 GPG 密钥和仓库:

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

然后安装 Docker Engine:

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

装完验证一下:

sudo docker run hello-world

看到 "Hello from Docker!" 就对了。

小技巧:把当前用户加到 docker 组,以后就不用每次敲 sudo 了。

sudo usermod -aG docker $USER
newgrp docker

然后直接 docker run hello-world 试试。

3.3 Docker Compose 安装:新版还是旧版?

这里有个坑。Docker Compose 现在有两个版本:

  • v1:独立的 docker-compose 命令(Python 写的,已停止维护)
  • v2:集成在 Docker CLI 里的 docker compose 命令(注意没有横杠)

我个人推荐用 v2。刚才装 docker-compose-plugin 的时候已经装好了。验证一下:

docker compose version

如果显示 Docker Compose version v2.x.x,就对了。

避坑指南:我曾经在旧项目里用 docker-compose up(带横杠),结果新服务器上没装 v1,命令找不到。后来统一改用 docker compose up(无横杠),再也没出过问题。你最好也养成这个习惯。

3.4 防火墙与端口规划:别让 ThingsBoard 裸奔

服务器搭好了,Docker 也装上了。但如果你直接把 ThingsBoard 暴露到公网,嗯,等着被扫吧。我见过太多人把 8080、1883 端口直接开给全世界,结果被挖矿程序盯上。

咱们先规划一下 ThingsBoard 需要哪些端口:

端口 协议 用途 建议
8080 HTTP Web UI 和 REST API 仅内网或通过反向代理暴露
1883 MQTT 设备接入(非加密) 建议配合 TLS 使用 8883
8883 MQTT over TLS 设备接入(加密) 生产环境必开
5683 CoAP 设备接入(非加密) 按需开启
5432 PostgreSQL 数据库 仅内网,禁止暴露

用 UFW 来管理防火墙,简单又安全:

# 安装 UFW(Ubuntu 默认自带)
sudo apt install ufw

# 设置默认策略:拒绝所有入站,允许所有出站
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 开放 SSH(千万别忘了,不然你连不上服务器)
sudo ufw allow ssh

# 开放 ThingsBoard Web 端口(仅内网)
sudo ufw allow from 192.168.1.0/24 to any port 8080

# 开放 MQTT 端口(按需)
sudo ufw allow 1883
sudo ufw allow 8883

# 启用防火墙
sudo ufw enable

# 查看状态
sudo ufw status verbose

生产环境建议

  • 永远不要直接把 8080 暴露到公网。用 Nginx 反向代理 + HTTPS。
  • MQTT 端口 1883 只在内网用,公网设备接入请走 8883(TLS)。
  • 数据库端口 5432 只允许 Docker 容器内部访问,别开给宿主机。

3.5 验证环境:跑个 Hello ThingsBoard

环境搭好了,咱们快速验证一下。先拉个 ThingsBoard 镜像试试网络通不通:

docker pull thingsboard/tb-postgres:latest

如果下载成功,说明 Docker 和网络都没问题。防火墙也拦不住 Docker 的流量(因为 Docker 会操作 iptables)。

小提示:如果你在云服务器上(比如阿里云、腾讯云),除了服务器内部的 UFW,还得去云控制台的安全组里放行端口。两个地方都要配,缺一个都不行。我踩过这个坑,折腾了半小时才发现是安全组没开。

好,环境准备就到这儿。下一章咱们正式开始用 Docker Compose 部署 ThingsBoard,把控制台跑起来。