Home Assistant (HA),靠其强大的功能、可拓展性、和社区支持,得到了很多智能家居爱好者的青睐。而在内地复杂的宽带环境下,如何在局域网外访问HA成为最大的痛点之一。如果你正巧有自己的域名和云服务器,那么这篇指南可能是个不错的选择。
Updated on Aug. 23 —— 增加frpc服务连接失败自动重连配置
10秒速读:本文通过FRP在服务器端和客户端搭建通道,并通过Nginx反向代理来实现自定义域名访问家中的HA实例。
环境:Linux
需要准备:
- 有公网IP的云服务器,并预装Linux系统;
- 通过原生OS/Supervisor方式部署好的HA客户端(VM或者Docker可能会有未知问题)
- 一些耐心
1.服务器端配置
1.1下载
FRP软件包包含两部分:服务器端的FRPS和客户端的FRPC,该软件包提供跨平台支持,所以需要确定你服务器的架构。使用下面的命令输出:
1 | uname -m |
在下面的链接(可能需要魔法访问)复制对应架构的最新版的链接:
Releases · fatedier/frp (github.com)
下面amd64为例
1 | cd /home/ |
1.2配置FRPS
修改配置文件 frps.ini
1 | sudo vim frps.ini |
文件内容:
1 | [common] |
vim文件编辑器内输入i
进入编辑模式。
bind_port
是需要绑定的服务器端口,vhost_http_port
是你希望通过服务器访问的端口,需要提前确认这两个端口没有被占用
1 | # 查询端口占用 |
auto_token
是用来认证的密钥,可以自定义
配置完成后,按ESC退出编辑模式,输入:w
并按回车,紧接着输入:q
并按回车保存退出
1.3配置开机自启
创建一个服务,便于管理并随开机自动运行
1 | sudo cp frps /usr/local/bin/frps |
创建服务配置文件
1 | [Unit] |
编辑和保存命令同上
开启服务,并配置开机启动
1 | systemctl start frps |
查看是否运行成功
1 | systemctl status frps |
云服务器一般有安全管理,需要去控制台开放端口,示例里为7000
和9000
这两个端口。如果你希望通过Nginx反向代理,那么只开放7000
就可以了。
2.客户端配置
2.1 下载
同样的,我们需要下载frp,并配置frpc的部分运行,请注意与第一部的命令区分
1 | uname -m |
在下面的链接(可能需要魔法访问)复制对应架构的最新版的链接:
Releases · fatedier/frp (github.com)
下面arm为例
1 | cd /home/ |
2.2 配置FRPC
修改frpc的配置文件
1 | sudo vim frpc.ini |
文件内配置,需要注意,和bind_port
要一致,auto_token
也一样。
local_ip
为设备的内网IP,如192.168.0.122
local_port
是HA内网访问的端口号,默认为8123
remote_port
为服务器端要访问的端口号,和vhost_http_port
保持一致
⚠️login_fail_exit = false
这里非常重要,否则中途网络出现问题,frpc服务会自动终止,不能尝试自动重连!
1 | [common] |
2.3配置开机自启
创建服务,便于管理并随开机自动运行
1 | sudo cp frpc /usr/local/bin/frpc |
创建frpc.service
文件
1 | [Unit] |
开启服务,并配置开机启动
1 | systemctl start frpc |
查看是否运行成功
1 | systemctl status frpc |
3.配置HA
此时通过云服务器+9000
端口就能打开页面了,如果显示400错误,不用担心,是因为HA有额外的安全设置,需要把代理地址加入白名单才能正常在局域网外访问。
首先通过插件市场安装File editor用来编辑/config/configuration.yaml
配置文件
在结尾添加配置:
1 | http: |
进入设置,验证configuration.yaml
是否能通过,如果不能通过,请仔细检查格式,如果能通过,选择完全重启HA。
重启后,通过云服务器的域名/IP+端口应该可以直接访问。
如果不需要自定义域名来访问,那么本教程已经到此结束,休息一下来杯可乐奖励自己!
4.Nginx反向代理
这部分将带你为HA转发的服务套一层域名“马甲”。需要使用的软件为Nginx Proxy Manager,安装教程可以参考我之前发的这篇:
Nginx Proxy Manager——小而美的多容器转发方案 - 白桦 Birch (wardzhou.art)
首先在域名提供商进行解析,创建新的A记录指向你设置的公网IP。这里使用二级域名或者顶级域名都是可以的。
然后登陆Nginx Proxy Manager的Dashboard,创建新的Proxy,填写内网的IP,这里的获取方式在上述链接中有所提及。
Domin Names
填写刚刚设置的外网地址,选择http,然后切换到ssl
选项,申请https证书,稍等证书下发后勾选需要的选项保存。
此时就可以通过你设置的域名登陆HA啦!
如果你使用HA的官方APP的话,建议去设置一下外部访问的网址,并把内网的IP与家里的Wi-Fi名绑定,这样就能自动切换,在家访问更快。
此时vhost_http_port
这个端口已经不再需要了,可以去云服务器的安全组关掉。不需要的端口关掉更为安全。
参考
- 树莓派+阿里云+frp 实现内网穿透 - brilliant_999 - 博客园 (cnblogs.com)
- Nginx Proxy Manager——小而美的多容器转发方案 - 白桦 Birch (wardzhou.art)
- Home assistant (400 Bad Request) Docker + Proxy - Solution - Configuration - Home Assistant Community (home-assistant.io)
- 第一次链接服务器若网络不可用,则frpc会直接退出。 · Issue #2605 · fatedier/frp · GitHub