roles/homeassistant: Proxy ZwaveJS2Mqtt Web UI

ZwaveJS2Mqtt includes a very powerful web-based UI for configuring and
controlling the Z-Wave network.  This functionality is no longer
available within Home Assistant itself, so being able to access the
ZwaveJS2Mqtt UI is crucial to operating the network.

I wanted to make the UI available at */zwave/*, which requires using
*mod_rewrite* to conditionally proxy requests based on the `Connection`
HTTP header, since the UI passes both HTTP and WebSocket requests to the
same paths.  *mod_rewrite* configuration is not inherited from the main
server configuration to virtual hosts, so the
`RewriteRule`/`RewriteCond` directives have to be specified within the
`<VirtualHost>` block.  This means that the Home Assistant proxy
configuration has to be within its own virtual host, and the
Zwavejs2Mqtt configuration has to be there as well.
jenkins-master
Dustin 2021-07-19 15:24:59 -05:00
parent b826d8355e
commit ceeb61cdb0
5 changed files with 45 additions and 17 deletions

View File

@ -8,3 +8,5 @@ mosquitto_listeners:
- port: 1883
address: ::1
mosquitto_password_file: /etc/mosquitto/passwd
apache_default_ssl_vhost: false
homeassistant_server_name: homeassistant.pyrocufflink.blue

View File

@ -1,6 +1,9 @@
- hosts: home-assistant
roles:
- apache
- role: apache
vars:
default_apache_ssl_vhost: false
tags: apache
- role: homeassistant
tags: homeassistant
- role: mosquitto

View File

@ -1 +1,6 @@
homeassistant_image_name: '{{ homeassistant_default_image_name }}'
homeassistant_ssl_certificate: >-
{{ apache_ssl_certificate }}
homeassistant_ssl_certificate_key: >-
{{ apache_ssl_certificate_key }}
homeassistant_proxy_zwavejs2mqtt: true

View File

@ -92,9 +92,9 @@
dest: /etc/httpd/conf.d/homeassistant.conf
mode: '0644'
notify:
- restart httpd
- reload httpd
tags:
- apache
- proxy-config
- name: ensure selinux allows apache to proxy
seboolean:
name: httpd_can_network_connect

View File

@ -1,19 +1,37 @@
ProxyPreserveHost On
ProxyRequests Off
ProxyPass /api/websocket ws://localhost:8123/api/websocket
ProxyPassReverse /api/websocket ws://localhost:8123/api/websocket
ProxyPass / http://localhost:8123/
ProxyPassReverse / http://localhost:8123/
RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule /.* https://%{SERVER_NAME}$0 [R=301,L]
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:8123/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://localhost:8123/$1 [P,L]
<VirtualHost _default_:443>
ServerName {{ homeassistant_server_name }}
Header always set \
Strict-Transport-Security "max-age=63072000; includeSubDomains"
SSLCertificateFile {{ homeassistant_ssl_certificate }}
SSLCertificateKeyFile {{ homeassistant_ssl_certificate_key }}
SSLCertificateChainFile {{ homeassistant_ssl_certificate }}
ProxyPreserveHost On
ProxyRequests Off
RewriteEngine on
{% if homeassistant_proxy_zwavejs2mqtt %}
RewriteRule ^/zwave$ /zwave/ [R=301,L]
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /zwave/(.*) ws://localhost:8091/$1 [P,L]
RewriteRule /zwave/(.*) http://localhost:8091/$1 [P,L]
# ZwaveJS2Mqtt doesn't respect X-External-Path for the logo URL
RewriteRule ^/static/logo\.png$ http://localhost:8091$0 [P,L]
<Location /zwave>
RequestHeader set X-External-Path /zwave
</Location>
ProxyPassReverse /zwave/ http://localhost:8091/
{% endif %}
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:8123/$1 [P,L]
RewriteRule /(.*) http://localhost:8123/$1 [P,L]
ProxyPassReverse / http://localhost:8123/
Header always set \
Strict-Transport-Security "max-age=63072000; includeSubDomains"
</VirtualHost>