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,把控制台跑起来。