CentOS9的postgreSQL 默认可能不随系统启动而启动,导致后续的依赖服务,如Thingsboard未能成功启动。
本文的环境:CentOS9 、 宝塔面板、宝塔面板安装的PostgreSQL18.0、Thingsboard。
一、配置PostgreSQL随系统启动
1、确认PostgreSQL数据库版本
ps -ef | grep postgres
看到类似
/www/server/pgsql/bin/postgres -D /www/server/pgsql/data
2、创建 systemd 服务
vi /etc/systemd/system/postgresql.service
添加内容:
[Unit]
Description=PostgreSQL database server
After=network.target
[Service]
Type=forking
User=postgres
ExecStart=/www/server/pgsql/bin/pg_ctl start -D /www/server/pgsql/data -l /www/server/pgsql/logs/pgsql.log
ExecStop=/www/server/pgsql/bin/pg_ctl stop -D /www/server/pgsql/data
ExecReload=/www/server/pgsql/bin/pg_ctl reload -D /www/server/pgsql/data
TimeoutSec=300
[Install]
WantedBy=multi-user.target
3、配置启动
首先,如果已经有一个正在运行的PostgreSQL进程,先中止掉,然后
systemctl daemon-reload
systemctl enable postgresql
systemctl start postgresql
4、验证
systemctl status postgresql
重启系统,验证数据库是否启动
ps -ef | grep postgres
二、配置Thingsboard服务依赖PostgreSQL
1、修改配置文件
通常 ThingsBoard 的服务文件位于 /lib/systemd/system/thingsboard.service。你需要使用 sudo 权限编辑它:
sudo nano /lib/systemd/system/thingsboard.service
2、配置依赖关系
在 [Unit] 部分,你需要添加 After 和 Wants(或 Requires)参数。
[Unit]
Description=thingsboard
# 在 After 中增加 network.target 和 postgresql.service
# 这样确保网络堆栈和数据库都在 TB 启动前就位
After=syslog.target network.target postgresql.service
# 增加 Wants,确保启动 TB 时会尝试启动数据库
Wants=postgresql.service
[Service]
User=thingsboard
# 建议检查:如果你的 JAR 是通过 java 命令运行,通常写法是 ExecStart=/usr/bin/java -jar ...
# 但如果你的 jar 本身是可执行的,维持现状即可
ExecStart=/usr/share/thingsboard/bin/thingsboard.jar
SuccessExitStatus=143
# 保持 Restart=always 是个好主意,因为 TB 启动较重,偶尔会因超时挂掉
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
关键点解析:
postgresql.service ,Thingsboard需要依赖PostgreSQL服务
network.target,ThingsBoard 作为一个物联网平台,极其依赖网络。将其加入 After 列表可以防止在网络接口还未完全初始化时 TB 启动报错(比如绑定端口失败)。
3、生效配置
sudo systemctl daemon-reload
sudo systemctl enable postgresql
sudo systemctl restart thingsboard
4、验证
重启服务器验证。
ThingsBoard 启动过程通常比较慢(Java Spring Boot 加载大量 Bean),如果你发现启动时报“数据库连接拒绝”,即便配置了 After,也可能是因为 Postgres 进程刚起,但还没准备好接收连接。你现有的 RestartSec=30 已经是一个很好的容错机制了。