O czym w artykule:
Dostęp do Home Assistant przez Internet na pewno się przyda, a do tego własny adres internetowy i szyfrowane połączenie będzie dobrym rozwiązaniem.
Wiem, że można zarejestrować darmową subdomenę w serwisie Duck DNS i że Home Assistant posiada łatwą integrację z tym hostingiem.
Ja jednak mam wykupiona własną domenę – loginhome.pl – i wykorzystam ją, dodając dla niej subdomenę dla mojego Home Assistant.
Do szyfrowania połączenia wykorzystam darmowego serwisu certyfikacji domen – Let’s Encrypt.
Wydaje on certyfikat dla domeny ważny 90 dni. Będę musiał więc też zadbać o automatyczne odnawianie go.
Ale po kolei.
Subdomena dla Home Assistant
Pierwsze czynności muszę wykonać na stronie firmy, która utrzymuje moją domenę.
Dla każdej wykupionej domeny internetowej możemy dodawać subdomeny oraz zarządzać rekordami DNS dla niej.
Ja dodam własną subdomenę – ha.loginhome.pl. Będzie ona przekierowywać adres na mój router i dalej na serwer na którym mam zainstalowanego Home Assistant.
Gdybym posiadał stały adres publiczny IP przy moim serwerze to ustawił bym w DNS rekord A do niego dla mojej subdomeny i sprawa załatwiona.
Jednak ja nie mam stałego adresu publicznego więc wykorzystam do tego publiczną dynamiczną domenę DDNS jaką daje mi mój router Mikrotik. Jest ona dostępna na routerze Mikrotik w oknie IP -> Cloud, w polu DNS Name (ma postać typu XXXXXXXXX.sn.mynetname.net).
Ciężko ją zapamiętać, więc kopiuję ją sobie bo będzie mi zaraz potrzebna.
Przez stronę firmy, która utrzymuje moją domenę odnajduję miejsce do zarządzania rekordami DNS mojej domeny i dodaje tam nowy rekord.
Jego typ ustawiam na CNAME, jako alias wpisuję ha.loginhome.pl, a nazwę kanoniczną uzupełniam adresem DDNS z mojego routera Mikrotik (XXXXXXXXX.sn.mynetname.net – niekiedy trzeba ją podać z dodatkową kropką na końcu, ale to zależy od firmy u której mamy domenę). TTL ustawiam na 3600 i zatwierdzam ten nowy rekord DNS. W efekcie pojawia się na liście rekordów nowa pozycja.
ha.loginhome.pl CNAME XXXXXXXXX.sn.mynetname.net 3600
Subdomena już działa i mapuje adres na razie na mój router Mikrotik.
Przekierowanie portów na routerze
Dotychczas łączyłem się tylko lokalnie z Home Assistant po adresie lokalnym 10.0.0.2 i porcie 8123 (http://10.0.0.2:8123).
Subdomena ha.loginhome.pl pozwoli mi na łączenie się lokalnie oraz dodatkowo na łączenie się z zewnątrz przez Internet.
Mimo że połączenie będzie docelowo w protokole https, chcę jednak by odbywało się ono po porcie 8123, a nie po 443.
Mój adres do Home Assistant będzie więc docelowo wyglądał tak: https://ha.loginhome.pl:8123.
Na razie ten adres odwołuje się bezpośrednio do routera w mojej sieci.
Muszę teraz na routerze przekierować odpowiednio port 8123 na mój serwer na którym jest Home Assistant.
Do wygenerowania certyfikatu potrzebne też będzie przekierowanie portu 80 na serwer.
Aby zrealizować te przekierowania – dodam kilka reguły na firewallu routera.
Loguję się na router Mikrotik. Z menu wybieram IP > Firewall. Dodaję kolejne reguły wciskając w oknie Firewall na zakładce NAT przycisk
.
Pierwsza reguła będzie przekierowywać zapytania z zewnątrz na porcie 8123.
W oknie NAT Rule.
Na zakładce General w polu Chain wybieram dstnat, w polu Protocol wybieram 6 (tcp), w polu Dst. Port wpisuję 8123, w polu In. Interface List wybieram WAN
Na zakładce Action w polu Action wybieram dst-nat, w polu To Addresses wpisuję 10.0.0.2, w polu To Ports wpisuję 8123 i wciskam OK
Kolejne dwie reguły przekierują zapytania lokalne na porcie 8123.
W oknie NAT Rule.
Na zakładce General w polu Chain wybieram dstnat, w polu Protocol wybieram 6 (tcp), w polu Dst. Port wpisuję 8123
Na zakładce Extra w sekcji Dst. Address Type w polu Address Type wybieram local i zaznaczam pole Invert (w niektórych przypadkach przekierowanie działa bez zaznaczenia tego pola!)
Na zakładce Action w polu Action wybieram dst-nat, w polu To Addresses wpisuję 10.0.0.2, w polu To Ports wpisuję 8123 i wciskam OK
W oknie NAT Rule.
Na zakładce General w polu Chain wybieram srcnat, w polu Src. Address wpisuję 10.0.0.0/8, w polu Dst. Address wpisuję 10.0.0.2, w polu Protocol wybieram 6 (tcp), w polu Dst. Port wpisuję 8123, w polu Out Interface wybieram bridge1
Na zakładce Action w polu Action wybieram masquerade i wciskam OK
Ostatnia reguła to przekierowanie portu 80 na potrzebę wygenerowania certyfikatu. To przekierowanie w przyszłości wykorzystam też dla usługi WWW na moim serwerze.
W oknie NAT Rule.
Na zakładce General w polu Chain wybieram dstnat, w polu Protocol wybieram 6 (tcp), w polu Dst. Port wpisuję 80, w polu In. Interface wybieram ether1
Na zakładce Action w polu Action wybieram dst-nat, w polu To Addresses wpisuję 10.0.0.2, w polu To Ports wpisuję 80i wciskam OK
Przekierowania gotowe.
Klient certyfikatów Certbot
Początkowo myślałem o zainstalowaniu dodatku Let’s Encrypt do Home Assistant. Jednak nie wiedziałem jak rozwiązać z jego pomocą automatyczne odnawianie certyfikatu.
Dlatego zdecydowałem się na zainstalowanie klienta Certbot w kontenerze Docker. Z nim już poradzę sobie z odnawianiem certyfikatu.
Loguję się programem putty przez SSH na mój serwer NUC na konto root.
Zatrzymuję na początek serwer WWW – Apache na moim serwerze, gdyż może przeszkadzać przy generowaniu certyfikatu.
root@nuc:~# service apache2 stop
Domyślnie Certbot generuje certyfikat w lokalizacji systemu Linux Debian, która zaczyna się ścieżką /etc/letsencrypt/.
Moja instancja Home Assistant jest w kontenerze i nie ma dostępu do tej lokalizacji, dlatego muszę przy instalacji Certbota ustawić ją niestandardowo.
Home Assistant jest zainstalowany w /opt/hassio/ dlatego ścieżkę dla certyfikatu i wolumenu ustawię na /opt/hassio/ssl/letsencrypt (zamiast /etc/letsencrypt/).
Instaluję więc kontener z klientem Certbot i generuję certyfikat dla subdomeny ha.loginhome.pl, podając też mój adres email.
root@nuc:~# docker run -it --rm -p 80:80 --name certbot -v "/opt/hassio/ssl/letsencrypt:/opt/hassio/ssl/letsencrypt" certbot/certbot --config-dir /opt/hassio/ssl/letsencrypt certonly --standalone --preferred-challenges http-01 --email admin@loginhome.pl -d ha.loginhome.pl
Podczas generowania odpowiadam na dwa pytania twierdząco – wpisując Y i wciskam Enter.
Mogę teraz już z powrotem uruchomić serwer WWW.
root@nuc:~# service apache2 start
Certyfikat oraz klucz zostały wygenerowane. Znajdują się one z poziomu serwera Linux Debian w katalogu /opt/hassio/ssl/letsencrypt/.
Home Assistant w kontenerze widzi je natomiast z poziomu /ssl/letsencrypt/.
Same pliki certyfikatu nie znajdują się bezpośrednio w tym katalogu lecz w głębiej w /ssl/letsencrypt/live/ha.loginhome.pl/.
Są to dwa pliki o nazwach fullchain.pem oraz privkey.pem.
Potrzebuję jednak by były one widoczne bezpośrednio z katalogu /ssl na kontenerze Home Assistant.
Zrobię więc linki w tym katalogi do nich, ale będę je musiał utworzyć z poziomu kontenera Home Assistant.
Zainstaluję dodatek który mi w tym pomoże.
Dodatek Terminal & SSH w Home Assistant
Na panelu Home Assistant z lewego dolnego menu wybieram Supervisor, a dalej u góry Sklep z dodatkami. Odszukuję dodatek Terminal & SSH, otwieram go i klikam ZAINSTALUJ.
Teraz Uruchamiam go a po uruchomieniu otwieram Interfejs Użytkownika.
Na jego poziomie wykonuję linki do plików z certyfikatem.
~ # ln -s /ssl/letsencrypt/live/ha.loginhome.pl/fullchain.pem /ssl/fullchain.pem ~ # ln -s /ssl/letsencrypt/live/ha.loginhome.pl/privkey.pem /ssl/privkey.pem
Pliki z certyfikatem i kluczem są już na miejscu.
Automatyczne odnawianie certyfikatu
Stworze teraz skrypt, który serwer będzie uruchamiał raz w tygodniu, i który:
- zatrzyma serwer WWW Apache
- uruchomi w kontenerze klienta Certbot, który sprawdzi czy trzeba odnowić certyfikat, i odnowi go gdy będzie taka potrzeba, zostawiając przy tym serwerowi informacje że trzeba zrestartować Home Assistant
- uruchomi serwer WWW Apache
- sprawdzi czy Certbot zostawił informacje, że trzeba zrestartować Home Assistant i zrobi to gdy taka będzie
- w logach wstawi informacje o odnowieniu certyfikatu z datą tej operacji
Loguję się programem putty przez SSH na mój serwer NUC na konto root.
Skrypt będzie miał nazw renew_cert.sh, i umieszczę go w nowym katalogu /opt/scripts/ nadając mu prawo do wykonania przez roota.
root@nuc:~# mkdir /opt/scripts
root@nuc:~# echo -e '#!/bin/bash\n\n/etc/init.d/apache2 stop\n\ndocker run -i --rm -p 80:80 --name certbot \
-v "/opt/hassio/ssl/letsencrypt:/opt/hassio/ssl/letsencrypt" \
-v "/var/log/letsencrypt:/var/log/letsencrypt" certbot/certbot \
--config-dir /opt/hassio/ssl/letsencrypt renew \
--deploy-hook "echo 1 > /opt/hassio/ssl/letsencrypt/restart_ha"\n\n/etc/init.d/apache2 start
\n\nif [ -f "/opt/hassio/ssl/letsencrypt/restart_ha" ]; then\nrm /opt/hassio/ssl/letsencrypt/restart_ha\ndocker restart homeassistant
\necho "`date`: Certyfikat odnowiony, Home Assistant zrestartowany!" >> /var/log/letsencrypt/certbot_renew.log\nfi' > /opt/scripts/renew_cert.sh
root@nuc:~# chmod 755 /opt/scripts/renew_cert.sh
Chcę by serwer uruchamiał skrypt w każdą sobotę o godzinie 3 w nocy. Będzie on uruchamiał się z Crona.
Uruchamiam Cron w trybie edycji
root@nuc:~# crontab -e
I w edytorze dopisuję na końcu linię:
0 3 * * 6 /opt/scripts/renew_cert.sh
Zapisuję plik i zamykam edytor.
Odnawianie certyfikatu jest już zautomatyzowane.
Konfiguracja Home Assistant
Zostało skonfigurować jeszcze Home Assistant by widział certyfikat.
Na panelu uruchamiam z bocznego menu File editor. W pliku configuration.yaml dopisuję konfigurację:
http: ssl_certificate: /ssl/fullchain.pem ssl_key: /ssl/privkey.pem
Na górnym niebieskim pasku klikam na ikonę dyskietki i zapisuję zmiany, a następnie klikam na ikonę koła zębatego po prawej stronie i wybieram z listy Restart HASS i potwierdzam.
Chwilę trwa ponowne jego uruchomienie.
Od tej chwili dostęp do mojego Home Assistant mam po adresie https://ha.loginhome.pl:8123, zarówno lokalnie jak i przez Internet z zewnątrz.
Wpisuję ten adres w przeglądarce i loguję się.
Wybieram z lewego menu Konfiguracja -> Ogólne.

W polu Publiczny adres URL wpisuję https://ha.loginhome.pl:8123, a w polu Lokalny adres URL wpisuje https://10.0.0.2:8123 i wciskam ZAPISZ.
Podsumowanie
Połączenie z Home Assistant po protokole https na pewno będzie teraz bezpieczniejsze.
Również niektóre dodatki dla niego, które będę instalował w przyszłości, będą mogły korzystać z zainstalowanego certyfikatu.












