Das hatte ich schon länger vor: HomeAssistant ans Internet zu hängen. Dann kann ich auch aus der Ferne die liebe Familie erschrecken 🙂
Normalerweise würde man auf dem Router ein Portforwarding einrichten und gut. Aber das wird dann ganz schnell eklig mit HTTPS und dessen Zertifikaten. Außerdem spricht mein HomeAssistant kein HTTPS, und ich wollte möglichst wenig daran rumkonfigurieren. Letztlich muße ich dort (HA) gar nichts machen.
Meine Lösung: HA läuft auf einem Raspi, auf dem auch ein Apache läuft. Der stellt einen reverse Proxy mit HTTPS (selbstsignierte Zertifikat) zur verfügung, der dann mit plain HTTP auf HA weitervermittelt. Bleibt aber das Problem mit den Zertifikaten.
Aber ich habe ja noch einen Root-Server im Internet! Und der hat ein richtiges Wildcard-Zertifikat. Also habe ich auch dort einen reverse Proxy installiert, der dann per HTTPS auf meinen Heim-IP geht, dort gibt es dann in der Tat ein Portforwarding auf den HTTPS-Proxy auf dem Raspi.
Funktioniert!
Der Apache auf dem Raspi:
ServerName hass.sokoll.com ServerAdmin webmaster@sokoll.com ErrorLog ${APACHE_LOG_DIR}/hass.sokoll.com-error.log CustomLog ${APACHE_LOG_DIR}/hass.sokoll.com-access.log combined SSLEngine on SSLCertificateFile /etc/ssl/private/raspi.crt SSLCertificateKeyFile /etc/ssl/private/raspi.key ProxyPreserveHost On ProxyRequests off ProxyPass /api/websocket ws://localhost:8123/api/websocket ProxyPassReverse /api/websocket ws://localhost:8123/api/websocket ProxyPass / http://127.0.0.1:8123/ ProxyPassReverse / http://127.0.0.1:8123/ RewriteEngine on RewriteCond %{HTTP:Upgrade} =websocket [NC] RewriteRule /(.*) ws://localhost:8123/$1 [P,L] RewriteCond %{HTTP:Upgrade} !=websocket [NC] RewriteRule /(.*) http://localhost:8123/$1 [P,L]
Der auf dem Root-Server:
Protocols h2 http/1.1 ServerName hass.sokoll.com ServerAlias home.sokoll.com ServerAdmin webmaster@sokoll.com ErrorLog ${APACHE_LOG_DIR}/hass.sokoll.com-error.log CustomLog ${APACHE_LOG_DIR}/hass.sokoll.com-access.log combined SSLEngine on SSLCertificateFile /etc/dehydrated/certs/wildcard_sokoll.com/fullchain.pem SSLCertificateKeyFile /etc/dehydrated/certs/wildcard_sokoll.com/privkey.pem ProxyRequests off ProxyPreserveHost On ProxyPass /api/websocket wss://91.66.58.188/api/websocket ProxyPassReverse /api/websocket wss://91.66.58.188/api/websocket ProxyPass / https://91.66.58.188/ ProxyPassReverse / https://91.66.58.188/ SSLProxyEngine on SSLProxyCheckPeerCN off SSLProxyCheckPeerExpire off SSLProxyCheckPeerName off ServerName hass.sokoll.com ServerAlias home.sokoll.com ServerAdmin webmaster@sokoll.com RedirectMatch permanent ^/(.*) https://hass.sokoll.com/$1
Die websocket-Geschichten habe ich mir aus dem Internet zusammengeklau(b)t, natürlich. Bislang habe ich keine Fehler bemerkt.
Meh. WordPress frißt <VirtualHost blafasel> nach dem <pre>. Auf Diaspora (https://pluspora.com/posts/a75e57c05bc501372dc0005056264835) ist es richtig angekommen.