用海外云服务器搭建 Home Assistant 智能家居中枢完整教程(2026最新版)

📅 · ChengziCloud - 一站式云端服务

一句话结论

Meta Description: 手把手教你用海外云服务器搭建 Home Assistant 自建智能家居中枢:Docker Compose 部署 HA Container、初始化引导、MQTT/Zigbee 设备接入、Nginx 反向代理 + Let's Encrypt 免费 HTTPS、SQL…

本文要点
  • 前言
  • 方案选型:Home Assistant 是什么,为什么值得自建
  • 服务器选型:配置推荐与价格对比
  • 准备工作:系统初始化与 Docker 安装
  • 部署实战:用 Docker Compose 拉起 Home Assistant
  • 完成初始化引导(Onboarding)
  • 接入你的第一台设备
  • Nginx 反向代理 + Let's Encrypt 免费 HTTPS

Meta Description: 手把手教你用海外云服务器搭建 Home Assistant 自建智能家居中枢:Docker Compose 部署 HA Container、初始化引导、MQTT/Zigbee 设备接入、Nginx 反向代理 + Let's Encrypt 免费 HTTPS、SQLite/PostgreSQL 历史数据库、备份与版本升级、安全加固与常见问题,附服务器配置推荐与价格对比。

关键词: Home Assistant搭建、自建智能家居、智能家居中枢、HA Container、Docker部署Home Assistant、MQTT、Zigbee、Nginx反向代理、海外云服务器、智能家居服务器

前言

如果你家里已经攒了几件智能设备,大概率会碰到同一个尴尬:灯是米家的、插座是涂鸦的、摄像头是另一个牌子的、音箱又只认自己的 App。想做一个「进门自动开灯 + 阴天关窗帘 + 没人时摄像头上线」的联动,就得在四五个 App 之间来回跳,还常常因为品牌不互通而根本做不成。

智能家居行业有个共识:真正的价值不在「单个设备能不能联网」,而在设备之间的联动与编排——谁来决定「如果……就……」,谁就是中枢。商业方案通常把中枢锁在自家生态里(米家、Apple Home、Google Home 各有各的围墙),而开源方案给的是另一种可能:中枢跑在你自己拥有的服务器上,设备、数据、自动化规则全归你。

本文的主角 Home Assistant(简称 HA)就是这类开源中枢里最流行的一个。它由 Python 写成,主打本地优先(local-first)——断网了自动化照跑、历史数据存在你自己的磁盘上、任何品牌只要能被集成就能接入。你要付出的,仅仅是一台服务器和一点点运维成本。

本教程要做的事很直接:

  1. 用一台海外云服务器,通过 Docker Compose 拉起 Home Assistant Container,把中枢搬到你自己的机器上;
  2. 完成初始化引导,设置账号、位置、时区,做出第一个仪表盘;
  3. 接入你的第一台设备——先用 MQTT 打通「会说话」的设备,再用 Zigbee 接入不需要 Wi-Fi 的传感器;
  4. 用 Nginx 反向代理 + Let's Encrypt 绑定域名、开启免费 HTTPS,让你在外网也能安全访问;
  5. 最后补齐历史数据库、备份、升级、安全加固这些「生产环境必须有」的环节。

🚀 搭建智能家居中枢需要云架构支持? 还没有海外云服务器?通过 5.chengzicloud.cloud 选购阿里云 / AWS / 腾讯云国际版,享专属折扣和中文技术支持。

一、方案选型:Home Assistant 是什么,为什么值得自建

动手之前,先把「智能家居中枢」这一类的几个主流方案分清楚。它们都能「管设备」,但回答的问题和前提条件差别很大,选错了会事倍功半。

方案它回答的问题前提条件代价
Home Assistant(本文)「不同品牌的设备要怎么互相联动」你有一台能长期运行的服务器/主机、愿意折腾需要自己部署与运维
米家 / Apple Home / Google Home「我只用这一个生态,怎么最省事」设备都买同一生态跨品牌联动受限、数据在厂商云、规则能力弱
云厂商 IoT 平台(阿里云 IoT、AWS IoT Core 等)「我要做企业级的设备接入与规模化管理」会写代码、按设备数/消息数付费面向开发者、不是给家庭用户用的开箱即用中枢
站内其他自建服务(监控/网盘/媒体)「服务本身活得好不好 / 文件怎么同步」各自独立它们管的是服务器,不是家里的设备

一句话定位:Home Assistant 是「设备控制与联动编排层」——站在所有设备之上,把不同协议、不同品牌的设备抽象成统一的「实体(entity)」,再用自动化把实体串起来。它和站内已有的 server-monitoring-guide(Prometheus + Grafana,管的是服务器指标)、uptime-kuma(管的是服务可用性)不是一回事:那两篇回答「我的服务器怎么样」,本篇回答「我家的设备该听谁指挥」。

选它还有三个现实理由:

  • 本地优先,断网可用:自动化规则在本地执行,不依赖厂商云。厂商云挂了、你的宽带断了上游、甚至设备厂商倒闭了,家里的灯照常按规则开关。
  • 集成数量可观:从 Zigbee、Z-Wave、Matter、Thread 到小米、涂鸦、飞利浦 Hue、Sonos、特斯拉、太阳能逆变器,官方集成覆盖了绝大多数能联网的东西;社区还有 HACS 这样的插件商店补足长尾设备。
  • 数据主权:想想「可穿戴设备厂商把健康数据卖给保险」这类旧闻——智能家居记录的是你在不在家、几点回家、家里温度多少,这些数据的归属权值不值得我们认真对待,答案不言自明。

1.1 先搞清楚四种安装方式

Home Assistant 官方提供两大类安装方式,选错会在后面到处踩坑,所以务必先看清楚:

安装方式一句话说明支持「应用」适合谁
Home Assistant OS(HA OS)官方定制的嵌入式系统,刷到树莓派/迷你主机/虚拟机✅ 支持绝大多数人、想用官方生态开箱即用
Home Assistant Container官方 Docker 镜像,跑在你自己的 Linux 上❌ 不支持已有服务器、习惯 Docker、想跟其他服务共用一台机器
Home Assistant Supervised手动在 Debian 上装 Supervisor✅(但已非主推)高级用户,运维负担重
Home Assistant Core直接跑 Python 包❌开发者、调试用

本文走的是 Home Assistant Container(Docker)路线,原因是:你已经在用一台海外云服务器,Docker 是复用度最高、最干净、最容易和其他自建服务(反向代理、监控、备份)协同的方式。但必须提前说清楚一个硬性限制:

⚠️ Container 安装不支持「应用」(Apps,即旧称 Add-ons)。所谓应用,是官方应用商店里那些一键安装的附加组件。更关键的是,Thread 和 Z-Wave 这类由「应用」驱动的集成,在 Container 安装下没有开箱即用的支持。如果你重度依赖 Z-Wave,官方推荐直接用 HA OS。

那 Container 是不是就不够用了?也不是。下面这些能力在 Container 下完全正常:仪表盘(Dashboard)、自动化(Automation)、集成(Integrations)、蓝图(Blueprints)、备份(Backups,需自行安排)。MQTT、Zigbee、以及绝大多数「云集成 / 局域网集成」都能用——差别只在于那些必须靠专属应用托管的协议。对大多数以 Wi-Fi 设备和 Zigbee 传感器为主的家庭场景,Container 完全够用。

二、服务器选型:配置推荐与价格对比

Home Assistant 本身并不吃资源——一个只有几十个实体的家庭部署,日常占用通常就在 1 核 / 1 GB 上下。但有几个「隐形吃资源」的因子会显著抬高门槛:

  • 历史数据库(Recorder):每一条状态变化都要落库,设备越多、刷新越勤,磁盘和 I/O 压力越大;
  • 摄像头 / 视频流:一旦接入 RTSP 摄像头或做实时转码,CPU 会瞬间被吃满;
  • 附加组件与语音:跑本地语音识别、图像处理、Mosquitto 等,都会叠加内存占用。

2.1 配置推荐

场景推荐配置说明
体验/入门(< 20 个设备)1–2 vCPU / 2 GB 内存 / 50 GB 磁盘只做灯、插座、传感器联动,非常够用
推荐起步(20–80 个设备)2 vCPU / 2 GB 内存 / 60 GB 磁盘社区最主流的甜点档,跑 MQTT + 若干集成无压力
舒适(多区域 + 摄像头)2 vCPU / 4 GB 内存 / 80 GB 磁盘有余量跑摄像头、数据库外置、附加服务
重度(大量摄像头 / 本地 AI)4 vCPU / 8 GB 内存 / 160 GB 磁盘需要本地转码或跑本地方案时才上

💡 官方对 HA OS 虚拟机给出的最低配置是 2 GB 内存 + 2 vCPU。Container 路线可以更低,但内存不建议低于 1 GB,2 GB 起步会稳得多。

2.2 海外云服务器价格参考

下表为常见海外云服务商的入门到中档机型参考价(均为月付、Linux 系统口径):

服务商内存vCPU磁盘月流量月费(USD)
DigitalOcean Droplet1 GB125 GB SSD1 TB$6
DigitalOcean Droplet2 GB150 GB SSD2 TB$12
DigitalOcean Droplet2 GB260 GB SSD3 TB$18
DigitalOcean Droplet4 GB280 GB SSD4 TB$24
DigitalOcean Droplet8 GB4160 GB SSD5 TB$48
AWS Lightsail1 GB2*40 GB SSD2 TB$7
AWS Lightsail2 GB2*60 GB SSD3 TB$12
AWS Lightsail4 GB280 GB SSD4 TB$24
AWS Lightsail8 GB2160 GB SSD5 TB$44
AWS Lightsail16 GB4320 GB SSD6 TB$84
阿里云国际版 轻量/ECS2–4 GB240–80 GB按套餐约 $12–$30
腾讯云国际版 轻量/CVM2–4 GB240–80 GB按套餐约 $12–$30

\* Lightsail 低档的 2 vCPU 为突发型(burstable),长期满载时会回落到基准性能;DigitalOcean、阿里云、腾讯云的国际版价格因机房、活动、计费方式差异较大,表中给的是常见公开区间,下单前请以官网实时价为准。

声明:本文价格数据采集于 2026 年 10 月,仅为公开官网参考区间,实际价格以各厂商官网实时报价为准;汇率波动、区域差异、促销活动均会影响最终价格。金额单位均为美元(USD)。

🚀 想要更划算的海外服务器? 通过 5.chengzicloud.cloud 购买阿里云 / AWS / 腾讯云国际版,享折扣与中文技术支持。

2.3 一句选型建议

对绝大多数家庭场景,「2 vCPU / 2 GB 内存 / 60 GB 磁盘」就是最优解——对应 DigitalOcean 的 $18 档或 AWS Lightsail 的 $12 档。省下来的预算建议优先加在磁盘上(历史库和备份都需要空间),而不是盲目堆 CPU:Home Assistant 的瓶颈几乎从不在算力,而在存储与网络。

如果你还会在同机部署 Nginx、Mosquitto、监控等伴随服务,直接上 2 vCPU / 4 GB 更从容,也避免将来为了加内存而折腾迁移。

三、准备工作:系统初始化与 Docker 安装

3.1 系统选择

Home Assistant Container 是官方维护的 Docker 镜像,只要宿主机能跑 Docker 即可,不挑发行版。但强烈建议用仍在维护期内的系统:

  • ✅ 推荐:Ubuntu 22.04 LTS / 24.04 LTS、Debian 12
  • ⚠️ 不建议:CentOS 7(已于 2024 年 6 月 EOL,软件源失效、内核偏旧,新机器不要再用)

选 Ubuntu 的另一个理由是社区资料最多——出问题时一搜一大把,排障成本最低。

3.2 初始化服务器

用 SSH 登录服务器后,先做基础更新并装好常用工具。以下命令可直接复制执行:

第 1 步,更新系统并安装基础工具


apt update && apt upgrade -y
apt install -y curl ca-certificates gnupg lsb-release git vim htop

第 2 步,设置时区

时区很重要——自动化(比如「日落开灯」)要靠它判断本地时间。这里以东京时区为例,请按你的实际所在地替换:


timedatectl set-timezone Asia/Tokyo
timedatectl

第 3 步,创建一个专用系统用户(可选但推荐)

为了不和 root 混用,可以给 HA 单独建一个用户,并把配置目录挂到它名下。如果你图省事也可以跳过,用 root 跑。


useradd -r -m -d /opt/homeassistant -s /usr/sbin/nologin ha
mkdir -p /opt/homeassistant/config
chown -R ha:ha /opt/homeassistant

3.3 安装 Docker Engine

Home Assistant Container 要求 Docker Engine 23.0.0 或更高版本,并且必须用 Docker Engine,不能用 Docker Desktop——后者是给桌面开发用的,在服务器上会带来网络与权限的坑。

第 1 步,添加 Docker 官方软件源


install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update

第 2 步,安装 Docker 与 Compose 插件


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

第 3 步,验证


docker --version
docker compose version
docker run --rm hello-world

看到 hello-world 正常输出、docker compose version 返回 v2.x 即可继续。若你用的是 Debian,把上面源地址里的 ubuntu 换成 debian 即可,其余不变。

四、部署实战:用 Docker Compose 拉起 Home Assistant

4.1 为什么用 Compose 而不是 docker run

官方的 docker run 一行命令也能跑起来,但参数已经相当长(网络模式、特权、多个挂载卷、优雅停机时间……)。用 docker compose 有两个现实好处:配置与命令分离、便于自动重启与升级;而且将来要改任何参数,只改一个 YAML 文件即可,不用回忆上次敲的那串命令。

4.2 编写 compose 文件

在配置目录下创建 compose.yaml。注意把 /opt/homeassistant/config 换成本文 3.2 节里你实际用的路径,TZ 换成你的时区:


services:
  homeassistant:
    container_name: homeassistant
    image: "ghcr.io/home-assistant/home-assistant:stable"
    volumes:
      - /opt/homeassistant/config:/config
      - /etc/localtime:/etc/localtime:ro
      - /run/dbus:/run/dbus:ro
    restart: unless-stopped
    stop_grace_period: 60s
    privileged: true
    network_mode: host
    environment:
      TZ: Asia/Tokyo

逐个字段解释清楚,避免「抄了但不知道抄了什么」:

  • image:官方镜像在 GitHub Container Registry,即 ghcr.io/home-assistant/home-assistant:stable。stable 是稳定线标签;生产上若想锁版本,可换成具体版本号(如 2026.10)。
  • /opt/homeassistant/config:/config:配置目录是整个实例的命根子——账号、集成、自动化、SQLite 历史库 home-assistant_v2.db、SSL 证书全在这里。这个目录必须持久化,且必须备份。
  • /etc/localtime:/etc/localtime:ro:让容器读到宿主机时区,避免时间错乱导致的「日落开灯」在半夜触发。
  • /run/dbus:/run/dbus:ro:只读挂载 D-Bus,如果你要用蓝牙集成就必须带上;不用蓝牙也可以留着,无副作用。
  • restart: unless-stopped:宕机或服务器重启后自动拉起。
  • stop_grace_period: 60s:这是最容易被忽略、但最该加的一行。Docker 默认只给容器 10 秒的 SIGTERM 超时,而 Home Assistant 关闭数据库可能超过 10 秒。若被强杀,下次启动日志会报 Ended unfinished session 和 The system could not validate that the sqlite3 database ... was shutdown cleanly,长期如此还可能损坏历史库。加长到 60 秒即可(它是上限而非延迟,HA 退出后 Docker 会立刻继续)。
  • privileged: true 与 network_mode: host:官方推荐写法。Host 网络让 HA 能发现局域网设备(mDNS/SSDP),特权模式则保证对某些硬件与网络接口的访问。

4.3 启动与查看日志

在 compose.yaml 所在目录执行:


docker compose up -d

查看是否正常启动:


docker compose ps
docker compose logs -f --tail=50

日志里出现 Home Assistant initialized 之类的行、容器状态为 running 即成功。默认监听 8123 端口,先在服务器本地验证:


curl -I http://127.0.0.1:8123

返回 200 或 302 就说明服务起来了。

4.4 一个常见的 ARM64 报错

如果你用的是 ARM64 服务器,日志里可能出现 <jemalloc>: Unsupported system page size。这是因为 HA 用了 jemalloc 做内存分配优化,而某些 ARM64 平台的内存页大小不是 4K。解法是禁用 jemalloc,在 environment: 下加一行:


    environment:
      TZ: Asia/Tokyo
      DISABLE_JEMALLOC: "true"

改完执行 docker compose up -d(配置变了会自动重建容器),再查看日志确认报错消失。

五、完成初始化引导(Onboarding)

容器跑起来后,在浏览器访问 http://<你的服务器IP>:8123(正式环境会在第七节换成域名 + HTTPS),会进入首次配置向导。

第 1 步,创建管理员账号。 设置用户名与强密码。这一步创建的账号拥有全部权限,请务必使用强密码,并尽快在个人资料里开启两步验证(TOTP)。

第 2 步,填写家庭信息。 包括家庭名称、所在位置(用于日出日落、天气等服务)和时区。位置建议用经纬度精确填写而不是只选城市,这样「日落开灯」才会在你的真实日落时间触发。

第 3 步,选择是否匿名上报。 这一步会询问是否加入使用统计与崩溃报告,属于自愿,按偏好选即可。

第 4 步,等待设备自动发现。 HA 启动后会自动扫描局域网(mDNS/SSDP),把发现的设备(路由器、电视、音箱、NAS……)列出来,一键即可添加。这也正是要开 host 网络的原因。

完成后你就有了一个空的仪表盘。默认面板是「概览」,可以拖拽增删卡片;后续你也可以按房间/功能建多个仪表盘。

💡 别忘了立刻做第一件事——备份配置目录。 至少执行一次 tar czf /root/ha-backup-$(date +%F).tar.gz -C /opt/homeassistant config,把配置目录打个包。后面第八节会教自动化备份方案。

六、接入你的第一台设备

Home Assistant 的「接入」本质是把设备变成一个个实体(entity),再用自动化把它们串起来。下面给出两条最有代表性的路子。

6.1 路线一:云集成 / 局域网集成(最快上手)

对于支持标准协议的设备,最快的办法是直接在「设置 → 设备与服务 → 添加集成」里搜品牌名。例如:

  • 小米 / 米家:搜索 Xiaomi 或 Xiaomi Miio;
  • 飞利浦 Hue、Sonos、Roborock 等:直接搜品牌;
  • 支持 Matter/Thread 的新设备:添加 Matter 集成(注意 Thread 在 Container 下受限,见 1.1 节)。

添加时通常需要填写账号密码或设备的 IP,按向导即可。这类集成对 Container 安装最友好,先把它们跑通,能快速获得成就感。

6.2 路线二:MQTT(打通「会说话」的设备)

MQTT 是智能家居里最通用的消息协议。很多 DIY 设备、刷了固件的插座、ESPHome 固件、以及 Zigbee2MQTT 转发的设备,都通过 MQTT 和 HA 通信。做法是:先跑一个 MQTT Broker(消息中间件),再让 HA 连上它。

官方推荐用 Mosquitto 作为 Broker。在 Container 方案里,Mosquitto 需要你自己再起一个容器。下面把它加进同一个 compose.yaml(追加到 services: 下):


  mosquitto:
    container_name: mosquitto
    image: eclipse-mosquitto:2
    restart: unless-stopped
    ports:
      - "1883:1883"
    volumes:
      - /opt/mosquitto/config:/mosquitto/config
      - /opt/mosquitto/data:/mosquitto/data
      - /opt/mosquitto/log:/mosquitto/log

创建配置目录与一个最基础的配置文件(注意:先开匿名,联调通了再按第九节加认证):


mkdir -p /opt/mosquitto/config /opt/mosquitto/data /opt/mosquitto/log

tee /opt/mosquitto/config/mosquitto.conf > /dev/null <<'CONF'
listener 1883
allow_anonymous true
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
CONF

然后拉起它,并在 HA 里「设置 → 设备与服务 → 添加集成 → MQTT」,Broker 地址填 127.0.0.1(因为 HA 用的是 host 网络),端口 1883。

⚠️ 安全提醒:allow_anonymous true 只应出现在内网联调阶段。一旦对外开放,必须按第九节配置用户名密码,否则任何人连上你的 1883 端口都能读取并伪造你家里的所有消息。

6.3 路线三:Zigbee 传感器

温湿度计、门磁、人体感应这类低功耗传感器大多走 Zigbee。常规做法是插一个 USB 协调器(如 Sonoff Zigbee 3.0 Dongle),但云服务器通常没有 USB 口——这正是「云上跑中枢」的一个真实短板。

因此若你重度依赖 Zigbee,有两条现实选择:

  1. 把 HA 部署在本地主机(HA OS / Container),USB 协调器直插本机,云服务器只作为站点镜像或备份;
  2. 云服务器上跑 HA + 内网放一个 Zigbee2MQTT 网关,由网关把 Zigbee 设备转成 MQTT 消息再上行到云端 HA。

如果你在 Container 里确实要挂载 USB 设备,需要显式映射设备节点:


    devices:
      - /dev/ttyUSB0:/dev/ttyUSB0

并确保运行容器的用户对该设备有访问权限。结论:纯云方案更适合 Wi-Fi 设备 + MQTT + 云集成;Zigbee/Z-Wave 的硬件门槛决定了它们更适合本地部署。

七、Nginx 反向代理 + Let's Encrypt 免费 HTTPS

前面一直在用 IP:8123 访问,这既不好记,明文 HTTP 还会把登录密码暴露在公网上。正确做法是:用一个域名 + HTTPS,由 Nginx 反向代理到本机的 8123。站内 nginx-ssl-guide 已有完整的 Nginx + certbot 教程,这里只讲 Home Assistant 专属的两个关键点。

7.1 第 1 步,解析域名并签证书

先把一个子域名(如 home.example.com)的 A 记录解析到你的服务器 IP,然后在服务器上装 Nginx 与 certbot:


apt install -y nginx certbot python3-certbot-nginx

7.2 第 2 步,写 Nginx 反代配置

HA 的前端是实时应用,靠 WebSocket 维持长连接。如果反代不转发 WebSocket,页面会「打开但一直转圈」「状态不刷新」——这是 HA 反代最常见的坑。下面这份配置把关键头都写全了:


server {
    listen 80;
    server_name home.example.com;

    location / {
        proxy_pass http://127.0.0.1:8123;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

其中最后两行 Upgrade / Connection 就是 WebSocket 转发的关键,不能省。

7.3 第 3 步,开启 HTTPS


certbot --nginx -d home.example.com

certbot 会自动改写配置、申请 Let's Encrypt 证书并设置自动续期,同时把 HTTP 跳转到 HTTPS。

7.4 第 4 步,告诉 HA「我在反向代理后面」

这一步不做,HA 会拒绝来自反代的请求——从 Home Assistant 2026.8 起,HTTP 服务器设置搬到了界面里:进入「设置 → 系统 → 网络」的 HTTP 服务器区域,做两件事:

  1. 打开 Trust X-Forwarded-For(信任 X-Forwarded-For);
  2. 在 Trusted proxies(受信代理) 里加入你的反代地址,通常是 127.0.0.1(同机 Nginx)。

两个细节坑:

  • 网段必须写「网络地址」而不是主机地址。也就是 192.168.1.0/24 ✅,192.168.1.50/24 ❌。
  • 保存 HTTP 设置会重启 HA,重启后管理员需在 5 分钟内确认新设置,超时会自动回退到旧配置。
  • 如果你用的是官方的 Home Assistant Cloud(现已更名 Home Assistant Link) 远程访问,请求走的是安全隧道而非传统反代,这两个选项对它无效、也不需要配。

同机 Nginx 反代时,Trusted proxies 填 127.0.0.1 即可(若 Nginx 与 HA 不在同一台机器上,填 Nginx 的内网 IP)。

7.5 关于 CDN 缓存

如果你在 HA 前面又套了一层 CDN(如 Cloudflare),要确保它不缓存动态内容,否则升级后浏览器可能一直加载旧的旧前端:

  • 不要缓存 404 响应、HTML 页面(含 index.html)、以及服务 worker 文件(/sw-modern.js、/sw-legacy.js);
  • 不要缓存 /api/ 和 /auth/ 下的响应——这些是实时数据与登录页,缓存会导致状态过时或登录失败;
  • 可以放心缓存 /frontend_latest/、/frontend_es5/、/static/ 下的静态资源。

好消息是,Nginx 与 Cloudflare 默认都不缓存 HTML,只要你没手动加过缓存规则,一般无需额外处理。

八、数据持久化、备份与版本升级

8.1 历史数据库:SQLite 还是 PostgreSQL

HA 的 Recorder(记录器) 集成默认开启,把每一个状态变化写进数据库。默认使用 SQLite,文件位置是配置目录下的 /config/home-assistant_v2.db,开箱即用、无需任何配置,对家庭场景完全够用。

若你要把数据库外置(换机器更从容、便于备份),Recorder 支持的数据库有:

数据库官方支持版本
MariaDB≥ 10.3
MySQL≥ 8.0
PostgreSQL≥ 12
SQLite≥ 3.40.1

外置时在 configuration.yaml 里写 db_url 即可。但有一条铁律:

⚠️ 中途切换数据库会导致现有历史数据丢失,官方明确不支持数据迁移。 所以「要不要外置」最好在第一次部署时就决定。

8.2 让历史库别无限膨胀

Recorder 有几个默认值值得理解,它们就是「磁盘会不会被撑爆」的答案:

  • purge_keep_days(默认 10):保留多少天历史;
  • auto_purge(默认 true):每天本地时间 04:12 自动清理;
  • auto_repack(默认 true):每月第二个周日自动重整数据库(不重整的话,清理后文件大小可能不下降);
  • commit_interval(默认 5 秒):状态变化多久提交一次数据库。调大可减少磁盘 I/O、延长 SSD/存储卡寿命,代价是数据库略滞后(注意:是数据库滞后,前端历史面板不滞后,因为变化会立刻流向前端)。

磁盘预留原则:官方要求你随时保留不少于数据库体积的空闲临时空间——因为重整/修复/升级时可能需要在磁盘上放一份数据库副本。数据库 1.5 GiB,就得常留 1.5 GiB。

按需排除:如果某个高频刷新的传感器(比如每秒上报的电表)把数据库撑爆,可以用 recorder 的 exclude(按 domains / entities / entity_globs)把它排除在外。

8.3 备份策略

请记住一句话:HA 的全部身家 = 配置目录。 备份就等于把 /opt/homeassistant/config 打包保存。建议三层:

  1. 本地定时打包:用 cron 每天凌晨打包一次配置目录,保留最近 7 份;
  2. 异地复制:把打包文件同步到对象存储(如站内 minio 或云厂商 OSS/S3),或另一台机器;
  3. 升级前必做:任何版本升级前,先手动打一个快照。

重要:如果你用的是官方 Home Assistant Cloud / Link 订阅,它自带异地备份(Offsite Backups)能力,可以把备份加密上传到官方,这也是它 $6.50/月订阅最实在的价值之一。

8.4 版本升级

Container 方案的升级动作很简单——拉新镜像再重建容器:


docker compose pull
docker compose up -d

但有两条纪律:

  1. 升级前先备份配置目录,尤其是跨大版本(如 2026.9 → 2026.10)时,数据库 schema 可能变化;
  2. 锁版本的生产环境更稳妥——想把 stable 换成具体版本号,改 image: 一行后 docker compose up -d 即可,出问题能快速回退。

九、安全加固与性能优化

Home Assistant 一旦对外,就是一个「能控制你家所有设备」的入口,安全优先级高于一切。

9.1 必做的加固清单

  • 只暴露 HTTPS:8123 端口不要直接对公网开放,只允许 Nginx 从本机转发(127.0.0.1:8123)。
  • 强密码 + 两步验证(TOTP):管理员账号务必开启 2FA。
  • 开启 IP 封禁:在「设置 → 系统 → 网络」的 HTTP 服务器里打开 Enable IP banning 并设置 Login attempts before ban——多次登录失败后自动封禁来源 IP,名单写入配置目录的 ip_bans.yaml。注意封禁不会自动过期,解封要么删文件里对应条目,要么直接删掉整个文件(下次触发会重建)。
  • MOSQUITTO 加认证:生产环境必须把 allow_anonymous 关掉,改用用户名密码或 TLS。
  • 别把静态目录当保险箱:配置目录下的 www/ 文件夹会以 /local/ 路径对外提供静态文件,但它不经过 HA 的身份认证——只要有人知道 URL,就能下载里面的文件。敏感文件不要放这里。
  • 少开端口:只开放 22(改密钥登录)、80、443;其余一律关闭。

9.2 API 访问

HA 提供 REST API,可用长期访问令牌(Long-Lived Access Token)在「个人资料 → 安全」里创建。拿到令牌后即可用 curl 读写实体状态,适合做外部脚本联动:


curl -H "Authorization: Bearer 你的长期访问令牌" http://127.0.0.1:8123/api/states

令牌等同于密码,泄露后对方能操作你所有实体,务必妥善保管、定期轮换。

9.3 反代层的额外加固

站内 website-security-hardening-guide 里的加固项同样适用于 HA 域名:限制请求速率、开启安全响应头、禁用不必要的 HTTP 方法、隐藏版本信息。此外,由于 HA 与 Nginx 同机,务必保证 Nginx 配置里没有把 8123 直接 proxy_pass 暴露给任意来源——反代只应服务你自己的域名。

十、常见问题 FAQ

Q1:Home Assistant 免费吗? 开源版完全免费。付费项是可选的官方订阅 Home Assistant Cloud(2026 年 12 月起更名为 Home Assistant Link):$6.50/月或 $65/年,含远程访问、异地备份、Alexa/Google 语音、语音处理(STT/TTS)等;月付还有 31 天免费试用。

Q2:云服务器上跑 HA,和买官方 Home Assistant Green 比哪个好? 官方 Home Assistant Green 售价 $199 / 179€(四核 ARM、4 GB 内存、32 GB eMMC),开箱即用、功耗低,适合纯家庭场景。云服务器胜在弹性、可与其他自建服务共用、任意地点访问;但要自己运维,且本地 Zigbee/Z-Wave 硬件受限。要硬件生态、图省事选 Green;要复用服务器、要远程访问选云。

Q3:Container 安装是不是比 HA OS 差很多? 谈不上「差」,是取舍不同。Container 不支持官方「应用」商店,且 Thread/Z-Wave 这类由应用驱动的集成没有开箱支持;但仪表盘、自动化、集成、备份、MQTT、Zigbee(走 Zigbee2MQTT)都正常。重度依赖 Z-Wave 的用户才建议改用 HA OS。

Q4:为什么我的页面能打开却一直转圈、状态不刷新? 99% 是反代没转发 WebSocket。回到 7.2 节,确认 Nginx 配置里有 proxy_http_version 1.1、Upgrade $http_upgrade 和 Connection "upgrade" 三行。

Q5:日志里出现 Ended unfinished session / sqlite3 database ... was shutdown cleanly 怎么办? 说明容器被强杀、数据库没来得及干净关闭。在 compose 里加 stop_grace_period: 60s 即可,见 4.2 节。

Q6:ARM64 上启动报 <jemalloc>: Unsupported system page size? 某些 ARM64 平台页大小非 4K 导致,加环境变量 DISABLE_JEMALLOC: "true" 即可,见 4.4 节。

Q7:历史数据太占磁盘,怎么瘦身? 先用 recorder 的 exclude 排除高频实体,再调小 purge_keep_days;数据库清理后不缩小是正常的——auto_repack 会在每月第二个周日重整。记住官方要求:随时保留不少于数据库体积的空闲空间。

Q8:换机器时怎么迁移? HA 的全部身家就是配置目录。在新机器上装好同样的容器,把「备份好的配置目录」还原到 /config,重启即可,账号、集成、自动化、历史数据都在。这也是为什么第 8.3 节的备份必须做。

Q9:可以从 SQLite 换成 PostgreSQL 吗? 可以,但已有历史数据会丢失,官方不支持迁移。想换请尽早决定。

Q10:怎么在外网安全访问? 两条路:① 自己的域名 + Nginx 反代 + Let's Encrypt(本文第七节,免费);② 官方 Home Assistant Cloud/Link 订阅($6.50/月,走安全隧道、含异地备份)。千万不要把 8123 端口明文暴露到公网。

Q11:接入了摄像头后卡顿严重? 视频流与实时转码是最吃 CPU 的。先降码率/分辨率,仍不够就升级到 4 vCPU 档,或让摄像头走子码流(substream)只做低清预览。

Q12:为什么 HA 发现不了局域网设备? 两个常见原因:没有用 host 网络(默认桥接网络会隔离 mDNS/SSDP 发现),或防火墙拦了组播。确认 compose 里写了 network_mode: host。

Q13:Mosquitto 一定要自己装吗? 在 Container 方案下是的——官方应用商店不可用,Broker 需要你另起一个容器(本文 6.2 节)。用 HA OS 则可在应用里一键安装 Mosquitto。

Q14:HA 对服务器配置要求高吗? 不高。2 vCPU / 2 GB 内存 / 60 GB 磁盘是社区甜点档;瓶颈通常在存储(历史库)与摄像头转码(CPU),而不是日常联动逻辑。

Q15:CentOS 7 还能跑吗? Container 镜像本身与宿主机发行版无关,理论上能跑;但 CentOS 7 已于 2024 年 6 月 EOL,软件源失效、内核偏旧、Docker 版本难装到位,新机器请直接用 Ubuntu 22.04/24.04 或 Debian 12。

十一、总结

把 Home Assistant 搭在自己的海外云服务器上,本质上是用「一台机器的成本」换回三样东西:设备之间自由联动的能力、数据留在自己手里的确定性、以及一套随你心意长大的自动化系统。

回看整个流程,其实只有几步是真正需要动脑的:

  1. 选清安装方式——Container 复用现有服务器,代价是没有官方应用商店与 Z-Wave/Thread 的开箱支持;
  2. 用 Compose 起服务——记住那行 stop_grace_period: 60s,保护好你的历史数据库;
  3. 反向代理别忘 WebSocket——Upgrade / Connection 三行是全篇最值钱的排错点;
  4. 在 HA 里信任反代——「Trust X-Forwarded-For」+「Trusted proxies」不配,请求会被拒;
  5. 备份就是备份配置目录——记住这一句,你就能在任何机器上原地复活。

维护它其实很轻:每天备份配置目录、每月看一次历史库大小、需要新功能时 docker compose pull && docker compose up -d。剩下的时间,就交给那些终于肯听你指挥的灯、窗帘和传感器吧。

如果你还想在这套栈上继续扩展,下面这些站内教程都能无缝衔接。

延伸阅读:

本文由 5.chengzicloud.cloud 提供,点击访问首页了解更多海外云服务器部署方案和专属优惠。