『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 35075|回复: 19

[基础教程] Docker安装HomeAssistant并配置MQTT和公网访问

[复制链接]

1

主题

1

帖子

28

积分

论坛分享达人

积分
28
金钱
27
HASS币
10
发表于 2021-1-16 15:05:50 | 显示全部楼层 |阅读模式
本帖最后由 vcer 于 2021-1-16 16:42 编辑

买了论坛上的Hassmart窗帘电机, 分享下我的安装配置过程。使用Docker安装是最灵活的方式,不管是群晖NAS还是路由器甚至电视盒子(armbian), 无所谓CPU是ARM还是x86,通过docker安装过程都是一样的。
当然,前提条件是需要熟悉docker相关的命令。

我将HA安装在R2S路由器上,R2S路由器用的是Lean的固件自带Docker Engine: https://github.com/klever1988/na ... R2S-Lean-2020-12-02


一、安装HA

SSH连接到宿主机上, 执行

docker run -d --name="home-assistant" --net=host --cpus=2 --restart=always -v /root/homeassistant/config:/config homeassistant/home-assistant:2021.1.3

其中的 /root/homeassistant/config 是配置保存文件夹路径,可以修改为其它合适路径。
--cpus=2 限制最多使用两个核心CPU, R2S路由器 RK3328 CPU, 4核 A53, 为了避免过于影响路由器的性能,限制只能使用两核,当然也可以不限制。
--net=host表示使用主机网络,因为后面HA将使用127.0.0.1连接MQTT服务。


二、安装MQTT

准备 mosquitto.conf文件内容如下
listener 1883 0.0.0.0
persistence true
persistence_location /mosquitto/data/
log_dest stderr
allow_zero_length_clientid true
protocol mqtt #websockets 
log_type all

SSH 执行
docker run -d --name="mqtt" --cpus=2 --restart=always \
  -p 1883:1883 \
  -v /root/mqtt/config:/mosquitto/config \
  -v /root/mqtt/data:/mosquitto/data \
  eclipse-mosquitto:2.0

/root/mqtt/config是配置文件夹, mosquitto.conf 放在其中。/root/mqtt/data是保存数据文件夹

启动后需要创建用户名和密码,如下命令创建名为mqttuser的用户,然后根据提示输入密码。
docker run exec -ti mqtt mosquitto_passwd -c /mosquitto/config/pwd.file mqttuser
完成后, pwd.file就保存在/root/mqtt/config文件夹中了。

回过头去, 修改/root/mqtt/config文件夹中的mosquitto.conf,添加一行password_file /mosquitto/config/pwd.file ,最后得:
listener 1883 0.0.0.0
persistence true
persistence_location /mosquitto/data/
log_dest stderr
allow_zero_length_clientid true
protocol mqtt #websockets 
password_file /mosquitto/config/pwd.file
log_type all
重启mqtt应用配置
docker restart mqtt

三、HA连接MQTT
编辑configuration.yaml文件,如果前面第一步没有改过路径则它在/root/homeassistant/config文件夹中。增加下面这段
mqtt:
  broker: 127.0.0.1
  port: 1883
  username: mqttuser
  password: 替换为前面输入的密码
  discovery: true
然后重启
docker restart home-assistant
如果一切正常则可以在HA的界面中看到MQTT实体了; 如果不成功, 可以用docker logs命令查看日志分析原因。

四、配置HTTPS

首先配置NGINX作为HTTPS的前端,首先准备SSL证书。假设域名是www.domain.com。将域名证书放入/root/nginx/文件夹,如www.domain.com.keywww.domain.com.crt
然后创建/root/nginx/default.conf文件,如下内容
server {
    listen       18123 ssl;
    server_name  www.domain.com;
    ssl_certificate_key         /etc/nginx/conf.d/www.domain.com.key;
    ssl_certificate             /etc/nginx/conf.d/www.domain.com.crt;

    add_header Strict-Transport-Security "max-age=15768000; includeSubdomains;";
    ssl_protocols               TLSv1.2;
    ssl_ciphers   EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED;
    ssl_prefer_server_ciphers   on;
    ssl_session_cache shared:SSL:15m;
    ssl_session_timeout 10m;

    # enable ocsp stapling
    resolver 223.5.5.5;

    location / {
        real_ip_header  X-Real-IP;
        proxy_pass http://127.0.0.1:8123;
        proxy_http_version 1.1;
        proxy_ssl_verify off;
        proxy_buffering off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }   
}



然后启动NGINX
docker run -d --name="nginx" --net=host --cpus=2 --restart=always  -v /root/nginx/default.conf:/etc/nginx/conf.d/default.conf  -v /root/nginx/www.domain.com.key:/etc/nginx/conf.d/www.domain.com.key  -v /root/nginx/www.domain.com.crt:/etc/nginx/conf.d/www.domain.com.crt  nginx:1.19-alpine
在浏览器中用IP地址访问18123端口,忽略SSL警告,验证NGINX反向代理是否成功。

五、配置公网访问
这里采用的是FRP方案。需要一台具有固定IP的公网服务器。
公网服务器的frps.ini配置如下:
[common]
# A literal address or host name for IPv6 must be enclosed
# in square brackets, as in "[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80"
bind_addr = 0.0.0.0
bind_port = 7000
# udp port used for kcp protocol, it can be same with 'bind_port'
# if not set, kcp is disabled in frps
kcp_bind_port = 7000

# udp port to help make udp hole to penetrate nat
bind_udp_port = 7001


dashboard_addr = 0.0.0.0
dashboard_port = 7500

# dashboard user and passwd for basic auth protect, if not set, both default value is admin
dashboard_user = admin
dashboard_pwd = 098766551

# AuthenticationMethod specifies what authentication method to use authenticate frpc with frps.
# If "token" is specified - token will be read into login message.
# If "oidc" is specified - OIDC (Open ID Connect) token will be issued using OIDC settings. By default, this value is "token".
authentication_method = token

# auth token
token = fgs4321fewfrew42432


# if tcp stream multiplexing is used, default is true
tcp_mux = true

# only allow frpc to bind ports you list, if you set nothing, there won't be any limit
allow_ports = 8123

# trace, debug, info, warn, error
log_level = warn

然后本地frpc.ini的配置如下

[common]
# A literal address or host name for IPv6 must be enclosed
# in square brackets, as in "[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80"
server_addr = www.domain.com # 服务器IP
server_port = 7000

# for authentication
token = fgs4321fewfrew42432

# decide if exit program when first login failed, otherwise continuous relogin to frps
# default is true
login_fail_exit = true

# now it supports tcp and kcp and websocket, default is tcp
protocol = kcp

# if tls_enable is true, frpc will connect frps by tls
tls_enable = true

[home_assistant]
# tcp | udp | http | https | stcp | xtcp, default is tcp
type = tcp
local_ip = 127.0.0.1
local_port = 18123
# remote port listen by frps
remote_port = 8123



评分

参与人数 2金钱 +28 HASS币 +10 收起 理由
hisoo + 8
+ 20 + 10 厉害了word楼主!

查看全部评分

回复

使用道具 举报

8

主题

382

帖子

1779

积分

金牌会员

Rank: 6Rank: 6

积分
1779
金钱
1397
HASS币
0
发表于 2021-1-16 17:46:00 | 显示全部楼层
请问下内网穿透必须配置NGINX吗?
回复

使用道具 举报

6

主题

287

帖子

4147

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4147
金钱
3855
HASS币
0
发表于 2021-1-23 16:06:57 | 显示全部楼层
peter5858 发表于 2021-1-16 17:46
请问下内网穿透必须配置NGINX吗?

不是必须,楼主这样的配置是可以https,为下一步实现其他的功能,比如天猫精灵接入做好了准备工作。
回复

使用道具 举报

8

主题

382

帖子

1779

积分

金牌会员

Rank: 6Rank: 6

积分
1779
金钱
1397
HASS币
0
发表于 2021-1-23 17:15:09 | 显示全部楼层
谢谢回复,我安装了一个内网穿透,用外网登陆HA,可以看见登陆界面,输入账号没办法进入ha不知道哪里不对
回复

使用道具 举报

0

主题

61

帖子

140

积分

注册会员

Rank: 2

积分
140
金钱
79
HASS币
0
发表于 2021-2-4 01:29:58 | 显示全部楼层
谢谢分享,学习了。
回复

使用道具 举报

0

主题

24

帖子

134

积分

注册会员

Rank: 2

积分
134
金钱
110
HASS币
0
发表于 2021-2-18 14:00:39 | 显示全部楼层

谢谢分享,学习了。
回复

使用道具 举报

4

主题

83

帖子

418

积分

论坛积极会员

积分
418
金钱
335
HASS币
0
发表于 2021-4-10 17:49:08 | 显示全部楼层
群晖上应该怎么安装
回复

使用道具 举报

0

主题

3

帖子

8

积分

新手上路

Rank: 1

积分
8
金钱
5
HASS币
0
发表于 2021-4-17 10:01:06 | 显示全部楼层
谢谢分享,学习了。
回复

使用道具 举报

0

主题

6

帖子

28

积分

新手上路

Rank: 1

积分
28
金钱
22
HASS币
0
发表于 2021-4-28 15:56:09 | 显示全部楼层
同问,在群晖上的Docker怎么安装楼主知道吗?
回复

使用道具 举报

3

主题

60

帖子

357

积分

论坛积极会员

积分
357
金钱
297
HASS币
0
发表于 2021-5-26 17:10:07 | 显示全部楼层
HA连接mqtt,必须要配置https和公网访问吗,还是只要做了前三步就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-23 21:44 , Processed in 0.317634 second(s), 39 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表