Configuration serveur
Machine utilisée
Mon installation est faite sur un NAS que j'utilise aussi comme système de sauvegarde pour les ordinateurs de la maison.
Le serveur ayant déjà un système d'exploitation et d'autres applications installées, j'ai opté pour une installation dans des containers docker afin de la rendre independante du reste du système.
Hébergement local de Home Assistant
La publication de l'application nécessite les éléments suivant :
- un nom de domaine,
- un proxy pour lier le nom de domaine à l'application locale,
- un certificat pour publier le site en https
Gestion du nom de domaine
Au lieu d'acheter un nom de domaine, j'utilise un sous domaine gratuit proposé par le site duckdns.org. Cela donne une adresse du type ma-maison.duckdns.org
.
Une fois le sous domaine déclaré, il faut lui associer l'adresse ip, visible depuis internet, du serveur hébergeant Home Assistant, ou dans mon cas l'adresse de ma box internet (une règle de routage au niveau de la box fait alors la rediction vers le serveur nas).
Cette association est faite par un autre container docker linuxserver/duckdns, qui va périodiquement récupérer l'adresse externe de la box et l'associer au nom de domaine duckdns. Cela est utile quand l'adresse ip externe fournie par son fournisseur d'accès à internet n'est pas fixe.
Voici un exemple de configuration :
duckdns:
image: lscr.io/linuxserver/duckdns
container_name: duckdns
environment:
- TZ=Europe/Paris
- SUBDOMAINS=ma-maison.duckdns.org
- TOKEN=xxx-xxx-xxx # (1)
restart: unless-stopped
- Token fournis lors de la création du compte duckdns.
Tip
Ce container peut être remplacé par une intégration Home Assistant duckdns.
Application proxy et certificat SSL
J'ai choisi Traefik car il permet :
- la création et le renouvellement d'un certificat Let's encrypt.
- d'exposer d'autres containers docker grace à des annotations posées sur ceux ci.
Le container est déclaré de la façon suivante :
traefik:
hostname: traefik
image: traefik:v2.9
container_name: traefik
restart: always
domainname: ma-maison.duckdns.org # (1)
network_mode: host
command:
- --providers.docker=true # (2)
- --providers.docker.exposedbydefault=false # (3)
- --entrypoints.web.address=:80 # (4)
- --entrypoints.websecure.address=:443 # (5)
- --entryPoints.web.forwardedHeaders.trustedIPs=127.0.0.1/32,192.168.1.69 # (6)
- --entrypoints.websecure.http.tls.certresolver=myresolver
- --certificatesresolvers.myresolver.acme.email=xxxx.xxxx@gmail.com
- --certificatesresolvers.myresolver.acme.dnschallenge.provider=duckdns # (7)
- --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
environment:
- DUCKDNS_TOKEN=xxx-xxx-xxx # (8)
ports:
- "80:80"
- "443:443"
volumes:
- "/data/docker/traefik:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- Nom du sous domaine duckdns
- Utilise les labels associés aux containers docker pour les exposer ou non
- N'expose que les containers avec le label
traefik.enable=true
- Port pour le trafique http
- Port pour le trafique https
- Liste des IP autorisées
- Configuration let's encrypt pour un challenge de type DNS
- Token duckdns : permet à traefik d'écrire un enregistrement texte au niveau du DNS afin de prouver que le domaine nous appartient avant de nous delivrer un certificat.
Outils complémentaires
Interface d'administration
Portainer est une interface d'administration qui permet d'ajouter ou de mettre à jour des containers, mais aussi de le démarrer ou de les arrêter.