2、Home Assistant基础回顾:HA核心架构、配置目录、常用组件与Add-on概念
在深入远程访问与内网穿透之前,必须先厘清Home Assistant(以下简称HA)的运行骨架。很多用户在配置远程访问时遇到“无法加载前端”“实体不可用”“Add-on启动失败”等问题,根源往往不是网络本身,而是对HA的目录结构、组件生命周期以及附加件(Add-on)与核心(Core)之间的边界缺乏清晰认知。本章将系统梳理HA的核心架构、配置目录的职责划分、常用组件的运作方式,以及Add-on在Supervisor体系中的定位,为后续配置Nginx Proxy Manager、Cloudflare Tunnel或WireGuard等远程方案打下坚实基础。
上图展示了HA在Supervisor模式下的核心逻辑:Supervisor作为管理守护进程,同时驱动Core与Add-on容器。Core负责设备接入、状态管理、自动化执行;Add-on则是独立的功能容器,如数据库、代理服务器、MQTT Broker等。两者共享同一个配置目录,但职责边界清晰。理解这张图,就能明白为什么修改configuration.yaml后需要重启Core,而安装Add-on则可能需要重启Supervisor或整个宿主机。
2.1 HA核心架构:事件总线、状态机与集成加载机制
HA的核心并非一个单体程序,而是一个基于事件驱动和状态映射的异步框架。其底层由Python asyncio驱动,所有设备、服务、自动化都通过事件总线(Event Bus)进行通信。当某个实体状态变化时,会触发一个事件,该事件被总线广播给所有订阅者。状态机(State Machine)则维护每个实体的当前状态、属性、最后变化时间等元数据。这种设计使得HA能够同时处理数百个设备而不会互相阻塞。
集成(Integration)是HA最重要的扩展单元。一个集成可以是一个设备品牌(如Philips Hue)、一个服务协议(如MQTT)、或一个数据源(如RESTful API)。集成通过manifest.json声明其依赖、版本、域名(domain),并在运行时被Core动态加载。加载过程包括:初始化配置流、设置实体、注册服务、监听事件。如果集成在启动时发生异常,HA不会整体崩溃,而是将该集成标记为“设置失败”,并在日志中记录traceback。
switch: !include switches.yaml 会加载switch域,并合并switches.yaml中的平台配置。理解这个顺序,有助于排查“为什么我的配置没生效”的问题——通常是因为YAML缩进错误或平台名称拼写错误。
2.2 配置目录深度解析:/config下的关键文件与文件夹
HA的配置目录是/config(在Docker或HAOS中通常挂载为/config)。这个目录不仅存放主配置,还包含大量运行时生成的数据。下表列出了最关键的路径及其用途:
| 路径 | 类型 | 用途说明 | 是否建议手动编辑 |
|---|---|---|---|
configuration.yaml | 文件 | 主入口配置,定义所有集成、自动化、自定义项 | 是(需重启Core) |
secrets.yaml | 文件 | 存放密码、,通过!secret引用 | 是(强烈建议) |
custom_components/ | 目录 | 第三方自定义集成,每个子目录为一个集成 | 是(需重启Core) |
addons/ | 目录 | 本地Add-on仓库,存放自定义Add-on的配置与代码 | 是(需刷新Add-on商店) |
.storage/ | 目录 | UI配置、云连接、实体注册表、设备注册表等内部状态 | 否(由HA自动管理) |
automations.yaml | 文件 | 通过UI创建的自动化存储于此 | 建议通过UI编辑 |
scenes.yaml | 文件 | 场景配置 | 建议通过UI编辑 |
ssl/ | 目录 | 存放SSL证书(如fullchain.pem、privkey.pem) | 是(需设置权限) |
backups/ | 目录 | Supervisor自动备份生成的压缩包 | 否(可手动复制) |
home-assistant.log | 文件 | 运行日志,排查问题第一入口 | 否(可查看) |
在配置远程访问时,最常涉及的是configuration.yaml中的http:段。例如,设置ssl_certificate和ssl_key路径时,必须确保文件位于/ssl下且权限正确。另外,trusted_networks选项可以定义无需密码即可访问的IP段,这在配置内网穿透时尤其危险——如果误将公网IP加入信任列表,可能导致未授权访问。
.storage/下的文件。这些文件采用内部格式,一旦格式错误或写入冲突,可能导致HA无法启动。如果确实需要修改实体注册表或设备注册表,请使用“开发者工具”>“状态”或停止HA后备份再操作。
2.3 常用组件分类与实战场景:从集成到服务调用
HA的组件(Component)可以按功能分为四类:接入类(如Zigbee、MQTT、ESPHome)、处理类(如模板、转换、数据库)、输出类(如通知、媒体播放器)、管理类(如HTTP、API、Logger)。在远程访问场景中,最核心的组件是http、auth、websocket_api以及cloud(如果使用Nabu Casa)。
以http组件为例,它负责提供REST API和Web前端。其关键配置项包括:
http:
server_port: 8123
ssl_certificate: /ssl/fullchain.pem
ssl_key: /ssl/privkey.pem
cors_allowed_origins:
- https://example.com
use_x_forwarded_for: true
trusted_proxies:
- 172.30.33.0/24
当你在HA前方部署Nginx Proxy Manager或Traefik时,必须设置use_x_forwarded_for: true并添加trusted_proxies,否则HA无法识别真实客户端IP,导致IP ban功能失效或日志记录错误。此外,cors_allowed_origins用于允许特定域名跨域访问API,这在配置外部仪表盘或手机App时非常关键。
ssl_certificate,但不要直接暴露8123端口到公网。更安全的做法是让反向代理(如NPM)处理TLS终止,然后通过内部网络将流量转发到HA的8123端口。这样HA本身不直接面对公网,减少攻击面。
2.4 Add-on概念:Supervisor、容器与系统级依赖
Add-on是HA Supervisor模式独有的概念,它本质上是预构建的Docker容器,由Supervisor负责拉取、启动、停止和更新。Add-on与Core共享网络和部分目录,但运行在独立的文件系统中。这种隔离设计使得即使Add-on崩溃,也不会影响Core的稳定性。
常见的Add-on包括:
- Nginx Proxy Manager:图形化反向代理管理,支持SSL证书申请与强制HTTPS。
- Mosquitto broker:MQTT消息代理,用于设备通信。
- File editor:浏览器内编辑配置文件,适合快速修改。
- Terminal & SSH:提供SSH访问宿主机或容器,便于排障。
- Duck DNS:动态DNS更新,配合Let's Encrypt插件实现免费HTTPS。
每个Add-on都有一个config.yaml,定义其名称、版本、启动类型(bootstrap/once)、端口映射、卷映射等。当你在UI中安装Add-on时,Supervisor会读取该配置并创建容器。需要注意的是,Add-on的端口映射如果与宿主机冲突,会导致启动失败。例如,Nginx Proxy Manager默认映射80和443端口,如果宿主机已有其他Web服务占用,需要修改映射。
http://HA_IP:8080访问NPM管理界面。排查过程:首先检查Add-on日志,发现端口8080被占用。进一步查看宿主机端口监听情况,发现另一个Add-on(如AdGuard Home)占用了8080。解决步骤:停止冲突Add-on,修改NPM的端口映射为18080,然后重启NPM。结果:管理界面正常访问。复盘经验:在安装任何Add-on前,先通过ss -tlnp检查端口占用,避免冲突。
2.5 常见误区与总结复盘
在HA基础回顾中,有几个高频误区需要特别指出:
- 混淆Core与Add-on的配置位置:Core的配置在
configuration.yaml,而Add-on的配置在其自身的UI或/addons_config/目录下。不要试图在configuration.yaml中配置Add-on参数。 - 忽略
secrets.yaml的权限:如果secrets.yaml权限过宽(如777),HA会拒绝加载并提示“unsafe permissions”。建议设置为chmod 600。 - 直接编辑
.storage导致数据库损坏:这会导致实体丢失或HA无法启动。正确做法是使用UI或停止HA后操作。 - 认为Add-on越多越好:每个Add-on都会占用内存和CPU,且增加攻击面。只安装必要的Add-on,并定期更新。
- 忽视日志中的警告:HA的日志会记录配置弃用警告、集成加载失败等信息。定期查看
home-assistant.log,可以提前发现潜在问题。