前言
在构建家庭数据中心的过程中,,一个稳定、独立的MQTT是核心基础设施。
今天记录一下在Proxmox VE上通过 LXC 容器快速部署全过程,以及解决“配置生效却无法连接”和“权限导致服务崩溃”的实战经验。
一、 为什么选择独立部署
虽然HomeAssistant自带MQTT插件,但我坚持在PVE中使用独立的LXC容器部署:
稳定性解耦: 即使HA重启或崩溃,MQTT依然在线,传感器的数据不会中断。
多终端接入: 方便以后可能存在的新部署的服务通过接入或HA不再使用,无需依赖HA。
二、 部署流程
1. 创建 LXC 容器
使用 Proxmox VE Helper Scripts 一键部署:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/mqtt.sh)"2. 初始化账号密码
进入容器后,执行以下命令生成加密密码文件:
# 创建 admin 账号
mosquitto_passwd -c /etc/mosquitto/passwd admin3. 权限设置
当我修改完配置尝试重启服务时,遇到了 Job for mosquitto.service failed。通过 systemctl status 发现服务死循环重启。

原因: 由于我使用 root 账号创建了密码文件 /etc/mosquitto/passwd,导致以 mosquitto 用户运行的服务进程没有权限读取该文件
解决办法:
chown mosquitto:mosquitto /etc/mosquitto/passwd执行后再次 systemctl restart mosquitto,绿灯亮起。
四、 验证对接 HomeAssistant
在 HA 的“设备与服务”中添加 MQTT 集成:
Broker:
192.168.0.109Port:
1883Username/Password: 填入刚才创建的
admin账号密码。
成功! 家里的消息邮局正式营业。
下一步计划:
1、接入一个小米温湿度计,看看能不能通过MQTT读到数据,让消息先运转起来。
2、搭建一个 InfluxDB 数据库用来存MQTT收到的数据,为统计图表做准备。
作为测试工程师,在硬件还没到货时,利用 MQTTX 模拟一个设备,验证 HomeAssistant 的自动发现机制。
Topic: homeassistant/sensor/mock_temp/config
{
"name": "模拟自动发现设备",
"device_class": "temperature",
"state_topic": "home/sensor/fake_temp/state",
"unit_of_measurement": "°C",
"unique_id": "fake_sensor_001"
}
发送之后,就可以在HA刚才配置的MQTT中看到这个模拟的设备,就是图中显示的1个实体

在刚才发送的消息中有一行
"state_topic": "home/sensor/fake_temp/state"
这行的意思是告诉 HA:“如果你想看我的实时温度,请订阅 home/sensor/fake_temp/state 这个频道。”
然后在home/sensor/fake_temp/state 这个频道发送了数字:26.5,刚才的频道就会拿到这个数据

接收到了在第二个频道发送的26.5

那么如何删除这个模拟的设备呢?
MQTT 自动发现协议规定:如果你向 Topic 发送一个 空白 的消息,就代表这个频道已经永久下线了。
发送空白消息之后可以看到,之前显示的1个实体,现在不见了

总结:
在 MQTT 发现协议中,一个设备通常有两个最重要的频道:
配置频道 (Config Topic): 就像是入职面试。
homeassistant/sensor/xxx/config作用:告诉 HA 我叫什么,我的数据在哪。只需要发一次,通常带 Retain(保留消息)。
状态频道 (State Topic): 就像是日常汇报。
在配置里填写的那个
state_topic的值。作用:上报真正的业务数据(温度、湿度等)。需要频繁发送。
一旦配置完成,在状态频道里,不需要再发那一大串 JSON。只需要发原始数据即可,比如 26.5 或者 off。
HA 会根据之前的定义,自动给这个数字加上 °C 单位。