前言
为了使用小爱同学控制我的移动空调前段时间安装了一个Home Assistant ,只是简单用用的话这样到此为止也可以,不过为了随处访问我给它绑定域名做了DDNS,比较可惜的是这么一搞问题就出现了,我的其它二级域名都加了SSL证书,可以进行https访问,这个没有加SSL证书的Home Assistant因为缓存的问题就只能在浏览器的无痕模式中打开。在捣鼓的过程中参考了下边两篇文章,但都不太符合我的情况,我最终选择了使用Nginx反向代理来实现,因为前段时间搭建PhotoPrism的时候我也是这么做的,可谓驾轻就熟。
Home Assistant配置https访问 - 哔哩哔哩 (bilibili.com)
为Home Assistant 开启HTTPS访问 - 天雨的博客 - Masterain (irain.in)
在看下边的内容之前需要明确一些需要注意的点:
- Home Assistant是Docker搭建的
- 服务器环境内有Nginx,最好有个宝塔
- 提前申请了SSL证书并上传到服务器中
- Home Assistant搭建完成可以使用DDNS正常访问
上传 SSL 证书
下边两个就是上传好的SSL证书,我这边使用的是宝塔免费申请的Let's Encrypt通配符证书,文件中内容是我自己新建文本文件从其它地方复制过来的,需要注意后缀名为crt和key,之后记好两个文件的绝对路径就可以。
配置NGINX反向代理
如果只是PhotoPrism下边的配置加到NGINX的配置文件中并重启就可以了,可惜今天搞的是Home Assistant,这个过程已经经过验证,并不怎么顺畅,简单来说会有两个坑。尤其是第二个,很少有人提到。
server {
listen 80;
server_name 你的域名;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name 你的域名;
client_max_body_size 500M;
ssl_certificate /root/data/photo/photoprism.crt; #SSL证书路径
ssl_certificate_key /root/data/photo/photoprism.key; #SSL证书路径
location / {
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_pass http://127.0.0.1:8123;# 确保指向 Home Assistant
proxy_redirect off;
client_max_body_size 500M;
}
}
配置HA反向代理白名单
第一个比较坑的点是HA的反向代理有白名单设置,需要将NGINX反向代理服务的网段添加到白名单配置中,不然会出现 400 bad request 的错误,页面无法访问。 全部配置完毕之后需要重启HA使其生效。配置文件的路径在你容器的根目录,名为:configuration.yaml
# Configure a default setup of Home Assistant (frontend, api, etc)
default_config:
# Text to speech
tts:
- platform: google_translate
group: !include groups.yaml
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
#从此处开始添加,上边的是默认存在的
http:
use_x_forwarded_for: True
trusted_proxies:
- 127.0.0.1
- 172.17.0.1
- 192.168.2.1 #根据容器日志中被屏蔽的 IP 添加
到了这一步反向代理的配置就初步成功了,可以通过https访问Home Assistant的登录界面,不过别急着高兴,还有一个坑在等着呢。输入用户名和密码之后点击登录你会发现页面上提示Unable to connect to Home Assistant.Retrying in 59 seconds...
最终的NGINX配置文件
使用http登录会发现有这样Login attempt or request with invalid authentication from 49.64.212.241 (49.64.212.241). See the log for details.
或这样的提示:Login attempt or request with invalid authentication from 192.168.2.1 (192.168.2.1). See the log for details.
~~~这个错误信息表明从 IP 地址 49.64.212.241/192.168.2.1
发起的登录尝试或请求存在无效的认证。为了安全起见,我们需要确保没有未经授权的访问,并且正确配置了 Home Assistant 的反向代理和认证设置。和Chatgpt缠斗了几个小时始终都是那么几句话,让我确认Home Assistant 配置和Nginx 配置,而这些我已经确认了很多次,可以完全保证没有问题,关于这些我也和Chatgpt说过,最后很明确的告诉它证书没问题,完全复制上边提供的配置问题依旧,这次情况发生了一些扭转,它提供了一份稍微有些不一样的NGINX配置文件:
server {
listen 80;
server_name 你的域名;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name 你的域名;
ssl_certificate /root/data/photo/photoprism.crt;#SSL证书路径
ssl_certificate_key /root/data/photo/photoprism.key;#SSL证书路径
location / {
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_pass http://127.0.0.1:8123; # 确保指向 Home Assistant
proxy_redirect off;
# 添加以下行以增强调试
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection '';
}
# 可选:为 WebSocket 连接配置
location /api/websocket {
proxy_pass http://127.0.0.1:8123/api/websocket;
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";
}
}
复制粘贴重启然后它就好了,经过实验起关键作用的正是它在配置文件中注释了#可选:为 WebSocket 连接配置
下边的那段代码,我注释解注释尝试了几次才最终确定。神奇的是这段配置的生效无需重启NGINX服务。
最后的最后我又问了它一个问题:为什么我之前提问了那么多次都没加这个配置?
Chatgpt:可能是因为在讨论中没有专门提到 WebSocket 配置的重要性,或者在问题分析时没有明确指出需要处理的具体内容。WebSocket 在 Home Assistant 中用于处理实时事件和状态更新,漏掉这个配置确实会导致连接问题。
作者:晨岩
本站所有文章除特别声明外,均采用 BY-NC-SA 4.0 许可协议。转载请注明出处!