Home Assistent + `haproxy` +`LetsEncrypt`+TransIP

Deze post gaat over mijn (positieve) ervaring met haproxy als reverse proxy voor Home Assistant. Toegang op afstand is nodig als je Home Assistant van buiten uw thuisnetwerk wilt openen.

Als voorwaarde zullen we ook de poort moeten doorsturen 443(https) in onze router/firewall naar het gebruikte systeem en zorg ervoor dat we een geldige DNS A/AAAA- of CNAME-record hebben ingesteld die verwijst naar het openbare IP-adres dat wordt gebruikt om door te sturen.

Ik wilde LetsEncrypt certificaten hebben die worden uitgegeven met behulp van een DNS-challenge. Hiervoor heb ik een Raspberry Pi 3b-bord gebruikt waarop Rasbian (Debian) is geïnstalleerd. Verder installeerde ik docker, en haproxy.

Het installeren van de haproxy pakket is zo simpel als:

sudo apt-update and sudo apt install haproxy

Als voorwaarde zullen we ook de poort moeten doorsturen 443(https) in onze router/firewall naar het gebruikte systeem en zorg ervoor dat we een geldige DNS A/AAAA- of CNAME-record hebben ingesteld die verwijst naar het openbare IP-adres dat wordt gebruikt om door te sturen.

LetsEncrypt met DNS-01 challenge en TransIP API

In mijn geval worden mijn internetdomeinen beheerd door TransIP, en DNS-toegang heeft API-ondersteuning. In het portaal kunt je een API-sleutel aanmaken en de IP-adressen die u wilt gebruiken voor DNS-toegangen whitelisten. We gebruiken deze API om in te schrijven LetsEncrypt certificaten. Het grote voordeel is dat we wild card certificaten kunnen inschrijven of certificaten met interne namen die we niet op het internet willen tonen, en we hoeven poort 80 niet te openen!

Voor de inschrijving van certificaten met LetsEncrypt via de TransIP API heb ik de docker image (rbongers/certbot-dns-transip) van gebruikt Roy Bongers waar alle functionaliteit in zit.

Opzetten LetsEncrypt

Maak eerst de mappen aan /etc/letsencrypt, /var/log/letsencrypt and /etc/transip.

Maak als root bestand config.php in /etc/transip. Gebruik de onderstaande link voor het sjabloon:

https://gist.github.com/jbouwh/3b6042ed4ca1189e1f37d0f8ff7274e5#file-config-php-L1-L17

Je dient de verkregen TransIP API key en je TransIP gebruikersnaam in te plakken.

Zorg ervoor dat u uw sleutelbestand beveiligt met sudo chmod 400 /etc/transip/config/php dus dat is alleen-lezen voor root.

Om het certificaat voor de eerste keer in te stellen, maken we een bash-script (ik plaatste het in /usr/local/sbin):

https://gist.github.com/jbouwh/3b6042ed4ca1189e1f37d0f8ff7274e5#file-certinit-bash-L1-L10

Vervang de `–cert-name` en het wild card domein (-d certificaatnaam.example.com), en vervang het domein door een willekeurige domeinnaam die u bezit. U kunt de -D parameter meerdere keren. Voor elk domein wordt een dns-challenge aangemaakt.

Zorg ervoor dat het script uitvoerbaar is chmod +x certinit.bash.

Ren nu certinit.bash . Het downloadt de afbeelding en start een docker voor de installatie. Dit is interactief, u krijgt enkele vragen zoals uw e-mailadres.

root@docker01:/usr/local/sbin# certinit.bash
Unable to find image 'rbongers/certbot-dns-transip:latest' locally
latest: Pulling from rbongers/certbot-dns-transip
330ad28688ae: Pull complete
882df4fa64e9: Pull complete
07e271639575: Pull complete
2d60c5e17079: Pull complete
f54b294a6f71: Pull complete
6f27ea6ab430: Pull complete
0c8c5a3cd6a8: Pull complete
6436ec8cd157: Pull complete
350482e0cef8: Pull complete
fcb8169b6442: Pull complete
ba9658959877: Pull complete
b9d5ffb589b1: Pull complete
a368f8fc57ed: Pull complete
Digest: sha256:faec7bc102edf00237041fbce8030249fb55f300da76b637660384c353043bff
Status: Downloaded newer image for rbongers/certbot-dns-transip:latest
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): user@example.com (your email adres)


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

Account registered.
Requesting a certificate for xxxxxx and jjjjj
Performing the following challenges:
dns-01 challenge for xxxx
dns-01 challenge for jjjjj
Running manual-auth-hook command: /opt/certbot-dns-transip/auth-hook
Output from manual-auth-hook command auth-hook:
[2023-03-31 08:32:03.596791] INFO: Creating TXT record for _acme-challenge with challenge 'FfGM5VPKWKkwR-6ggUhlpoZlQ5-vPGK-JIy25tekb_E' [] []
[2023-03-31 08:32:06.782752] INFO: Waiting until nameservers (ns0.transip.net, ns1.transip.nl, ns2.transip.eu) are up-to-date [] []
[2023-03-31 08:32:08.625219] INFO: All nameservers are updated! [] []

Running manual-auth-hook command: /opt/certbot-dns-transip/auth-hook
Output from manual-auth-hook command auth-hook:
[2023-03-31 08:32:09.659195] INFO: Creating TXT record for _acme-challenge with challenge 'lP_hQVRODhVCiglLiNSZvNky9voGChnTyo407N_xRU4' [] []
[2023-03-31 08:32:12.628115] INFO: Waiting until nameservers (ns0.transip.net, ns1.transip.nl, ns2.transip.eu) are up-to-date [] []
[2023-03-31 08:32:13.659641] INFO: All nameservers are updated! [] []

Waiting for verification...
Cleaning up challenges
Running manual-cleanup-hook command: /opt/certbot-dns-transip/cleanup-hook
Output from manual-cleanup-hook command cleanup-hook:
[2023-03-31 08:32:16.459605] INFO: Cleaning up record _acme-challenge with value 'FfGM5VPKWKkwR-6ggUhlpoZlQ5-vPGK-JIy25tekb_E' [] []

Running manual-cleanup-hook command: /opt/certbot-dns-transip/cleanup-hook
Output from manual-cleanup-hook command cleanup-hook:
[2023-03-31 08:32:20.031682] INFO: Cleaning up record _acme-challenge with value 'lP_hQVRODhVCiglLiNSZvNky9voGChnTyo407N_xRU4' [] []


IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/xxxxxx/fullchain.pem Uw sleutelbestand is opgeslagen op: /etc/letsencrypt/live/xxxxxx/privkey.pem
   Your certificate will expire on 202x-mm-ss. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Je certificaat wordt aangemaakt in /etc/letsencrypt/live/{certname}.

Automatische uitgifte instellen

We willen het certificaat automatisch verlengen en haproxy bijwerken om het nieuwe certificaat te gebruiken. Het haproxy certificaat wordt geplaatst in /etc/haproxy/cert.pem. Om in te schrijven heb ik een bash-script gemaakt certrenew.bash:

https://gist.github.com/jbouwh/3b6042ed4ca1189e1f37d0f8ff7274e5#file-certrenew-bash-L1-L68

Zorg ervoor dat u de basecert parameter in het script. en plaats het als certrenew in /usr/local/bin/sbin en maak het uitvoerbaar met sudo chmod + x /etc/local/sbin/certrenew.

We moeten certrenew een eerste keer uitvoeren om ervoor te zorgen dat het haproxy certificaat wordt gemaakt.

Om ervoor te zorgen dat het elke dag ergens tussen 23.00 uur en middernacht draait, maken we er een cronfile (`/etc/cron.d/certrenew`) voor (zie link).

https://gist.github.com/jbouwh/3b6042ed4ca1189e1f37d0f8ff7274e5#file-certrenew-cron-L1-L9.

Herstart cron sudo systemctl restart cron

Wanneer het script wordt uitgevoerd, wordt gecontroleerd of het certificaat binnen 30 dagen verloopt, in dat geval wordt een nieuw certificaat aangevraagd. Als het proces succesvol was, wordt het certificaat bijgewerkt en opnieuw opgestart haproxy met het nieuwe certificaat.

Nu zijn we helemaal klaar, zorg ervoor dat je de logboeken controleert om te zien of de hele installatie correct werkt.

Instellen haproxy

Als laatste stap kan nu haproxy (/etc/haproxy/haproxy.cfg) worden ingesteld met het nieuwe certificaat.

Je kunt https://gist.github.com/jbouwh/3b6042ed4ca1189e1f37d0f8ff7274e5#file-haproxy-cfg-L1-L61 gebruiken als sjabloon voor uw configuratie. U moet de DNS-namen en het interne IP-adres van uw backend wijzigen. In mijn geval heb ik een Raspberry PI met een SD-kaart gebruikt en logging uitgeschakeld om ervoor te zorgen dat de SD-kaart langer meegaat. Als u een SSD hebt aangesloten, kunt u de logging wijzigen.

Zorg ervoor dat u ook installeert /etc/haproxy/dhparam.pem (zie de opmerking op de laatste regel van het configuratiebestand over hoe u dit kunt verkrijgen).

In de voorbeeldconfiguratie heb ik de statistiekenpagina ingeschakeld op https://{jouw_domeinnaam}/stats. Je kunt deze pagina gebruiken om de statistieken te bekijken. acl network_allowed_src src wordt gebruikt om te beveiligen dat de pagina alleen toegankelijk is vanaf interne IP-adressen. Zorg ervoor dat je de juiste IP-ranges invult die toegang moeten hebben.

Als je klaar bent, kun je het configuratiebestand testen met:

haproxy -f /etc/haproxy/haproxy.cfg -c

Als dat goed is, ben je helemaal klaar. Herstart haproxy om de nieuwe configuratie te laden met: sudo systemctl restart haproxy.

Nu heb je van buitenaf toegang tot Home Assistant. Zorg ervoor dat twee-factor-authenticatie is ingesteld om de toegang tot uw netwerk te beveiligen.

Nieuwe Docker builds voor Omnik Data Logger

Nieuwe Docker images zijn beschikbaar voor Omnik Data Logger. Docker containers zijn ideaal wanneer je geen gebruik maakt van Home Assistant of de Home Assistant Community Store (HACS). Docker images kunnen gemakkelijk worden geïnstalleerd op verschillende platformen. Momenteel worden de volgende architecturen ondersteund:

  • linux/amd64
  • linux/arm64
  • linux/arm/v7
  • linux/arm/v6

Als je een ander nog niet ondersteunde architectuur nodig hebt, laat het mij dan weten. Docker en PIP pakketten worden vanaf nu automatisch gegenereerd via Github actions wanneer een nieuwe release wordt aangemaakt,

Zie https://github.com/jbouwh/omnikdatalogger/wiki/Install-using-docker voor meer informatie. Als je voorheen al gebruik maakte van Docker containers voor dit project, let er dan op dat de configuratie voor de containers in orde is. De standaard locatie voor configuratie bestanden binnen in de container is gewijzigd naar de map /config.

Docker support voor Omnik data logger

Omnik data logger kan nu ook worden gebruikt als een docker container. Dit maakt het gemakkelijk om de software in een Docker gebaseerde omgeving te gebruiken. Dit is nog een alternatief voor het gebruik van AppDaemon met HACS binnen Home Assistant.

Docker image installeren

Gebruik het commando docker pull jbouwh/omnikdatalogger om het laatste image op te halen.

Het docker image zelf te maken:

git clone https://github.com/jbouwh/omnikdatalogger cd omnikdatalogger/ docker build --tag jbouwh/omnikdatalogger:latest .

De docker container uitvoeren

In het volgende voorbeeld wordt aangenomen dat het configuratiebestand buiten de container op . is /home/pi/.omnik/config.yaml (gebruiker pi). In de docker-afbeelding is de gebruiker omnik en de standaardlocatie voor de configuratie in de container is op /config/config.yaml

De -p optie is alleen nodig wanneer de localproxy client wordt gebruikt met de tcp_proxy plugin.

Gebruik de --apparaat optie om direct toegang te geven aan een DSMR geschikte monitoring kabel. Je kunt ook ser2net gebruiken als je kabel op een ander apparaat zit aangesloten.

Start de container op de achtergrond met het volgende commando:

docker run -d -v /home/pi/.omnik/config.yaml:/config/config.yaml -p 10004:10004 --device /dev/ttyUSB0 --name omnikdatalogger jbouwh/omnikdatalogger:laatste

Omnik datalogger DSMR P1 ondersteuning

Met de splinternieuwe release van Omnik data logger heb ik de ondersteuning voor de Slimme meter (DSMR) toegevoegd. Met een simpele P1 naar USB kabel kan Omnik data logger nu ook het verbruik van je slimme meter publiceren (inclusief gasverbruik). Met PVoutput kan op basis hiervan het verbruik worden vastgelegd inclusief netspanning zodat de netto energie (gebruikt/teruggeleverd) kan worden berekend.

De P1 adapter kan direct aan het apparaat met Omnik data logger worden aangesloten of via TCP. Ik heb hiervoor ser2net gebruikt zodat ik met meerdere verbindingen naar mijn slimme meter kan voa de P1 adapter (handig voor testen). Om dit mogelijk te maken heb je minimaal ser2net v3.5 nodig. Ik heb hiervoor een docker container geïnstalleerd met als image (jsurf/rpi-ser2net:buster). Met het toevoegen van de max-connections optie in de configuratie worden meerdere gelijktijdige verbindingen ondersteund.

3333:raw:600:/dev/ttyUSB0:115200 GEEN 1STOPBIT 8DATABITS -XONXOFF RTSCTS max-connections=3

/etc/ser2net.conf

Al je je slimme meter gegevens binnen Home Assistant wilt hebben, dan kan Omnik Datalogger hiermee de ingebouwde DSMR integratie vervangen. Door gebruik van MQTT kan Home Assistant alle tellerstanden e.d. automatisch herkennen. In de config file kun je (indien gewenst) de namen van de alle gemeten waarden hernoemen naar het Nederlands. Aanvullend krijg je via MQTT binnen Home Assistant ook direct verbruik, direct verbruikte energie en de werkelijke verbruiksdata te zien. Deze data wordt zoawel over MQTT als over InfluxDB gelogd.

HACS-standaard

Omnik data logger is toegevoegd aan de hoofd appstore binnen Home Assistant Community Store (HACS), dit betekend dat je Omnik data logger kunt vinden tussen de Automatiseringen.

Zorg er eerst voor dat je de AppDamon plugin hebt geïnstalleerd vanuit de officiele Home Assistant Add-on store.

TCPclient getest en werkend

Met dank aan Han Lubach is de tcpclient nu succesvol getest. Het lijkt er op dat deze client, gebaseerd op de logger van Wouter van der Zwan nu ook te gebruiken is met Omnik data logger.