Domodrive est un atelier de conception de scénarios domotiques pour Home Assistant. On y dessine des plannings horaires d'actions sur les volets et les éclairages, on les valide, on les déploie sur une plage de dates, puis on les retire sans laisser de trace. Le cas d'usage fondateur tient en une phrase : partir deux semaines en vacances avec une simulation de présence crédible.
Quatre articles ont déjà été consacrés au sujet. Ils racontent le pourquoi et le comment c'est fait. Il manquait le reste : comment on l'installe, où on trouve la documentation, et ce qu'il faut savoir avant de lancer la première commande. C'est l'objet de celui-ci, qui sert aussi de point d'entrée unique vers tout le reste.
Les quatre épisodes précédents
Dans l'ordre de lecture conseillé :
- Simuler une présence pendant les vacances, sans écrire une ligne de configuration — le besoin, le parcours complet, et ce que l'application refuse de faire.
- Dans le moteur : architecture, données et invariants — quatre couches, une règle de dépendance et des invariants tenus par la base plutôt que par la vigilance.
- Écrire dans Home Assistant sans jamais toucher aux volets — trois appels de service et pas un de plus, le garde-fou, et le YAML réellement produit.
- Les technologies, et pourquoi celles-là — les quinze dépendances de production, une par une.
Si vous n'en lisez qu'un, prenez le premier : il montre ce que l'application fait. Les trois autres expliquent comment elle le fait.
Ce que la 1.0.0 apporte
Le code n'a pas beaucoup changé — il était déjà couvert par des dizaines de tests. Ce qui change, c'est tout ce qui entoure le code :
- une image Docker publiée,
suntux57420/domodrive:1.0.0, également disponible en:latest; - des manifestes Kubernetes prêts à appliquer, dans
deploy/kubernetes/; - une documentation complète en treize pages, publiée sur le wiki (wiki.ev1.fr) ;
Installer avec Docker
La version la plus courte, pour essayer :
docker run -d --name domodrive \ -p 8000:8000 \ -v domodrive-data:/app/data \ -e SECRET_KEY="$(python3 -c 'import secrets; print(secrets.token_urlsafe(48))')" \ -e DATABASE_URL="sqlite+aiosqlite:////app/data/scenario_studio.db" \ -e HA_BASE_URL="http://homeassistant.local:8123" \ -e HA_TOKEN="<jeton longue durée>" \ suntux57420/domodrive:1.0.0
Puis http://localhost:8000, compte admin, mot de passe admin1234 — que l'application réclame de changer dès la première connexion, et dont elle continue de se plaindre par un bandeau rouge tant que c'est encore la valeur par défaut.

Le tableau de bord au premier lancement : rien n'est encore déployé, la liaison avec Home Assistant est établie et inventoriée, et l'application rappelle en pied de page ce qu'elle ne fera jamais — piloter les équipements elle-même.
Deux pièges qui coûtent une soirée
Quatre slashes, pas trois. sqlite+aiosqlite:////app/data/… désigne le chemin absolu /app/data/…. Avec trois slashes, le chemin devient relatif au répertoire de travail : la base n'est plus dans le volume, et elle disparaît au remplacement du conteneur. On ne s'en aperçoit qu'à la première mise à jour, c'est-à-dire au pire moment.
Le 127.0.0.1 d'un conteneur, c'est le conteneur. Si Home Assistant tourne sur le même hôte, il faut host.docker.internal dans HA_BASE_URL, et l'entrée extra_hosts correspondante sous Linux. Le docker-compose.yml du dépôt la contient déjà.
Ce que contient le volume
Tout ce qui doit survivre au remplacement du conteneur vit dans /app/data : la base SQLite, le fichier de réglages settings.json — jeton Home Assistant chiffré compris —, les archives de sauvegarde, le journal applicatif, le snapshot de mise à jour au besoin.
C'est donc le seul répertoire à sauvegarder.
Sur Kubernetes
Les manifestes sont dans le dépôt : namespace, ConfigMap, modèle de Secret, PVC, Deployment, Service, Ingress Traefik, et un kustomization.yaml pour appliquer l'ensemble.
kubectl apply -f deploy/kubernetes/00-namespace.yaml kubectl -n domodrive create secret generic domodrive \ --from-literal=SECRET_KEY="$(python3 -c 'import secrets; print(secrets.token_urlsafe(48))')" \ --from-literal=HA_TOKEN="<jeton longue durée>" kubectl apply -k deploy/kubernetes/
Deux choix méritent d'être explicités, parce qu'ils surprennent au premier regard :
replicas: 1. Sur SQLite, deux pods écriraient dans le même fichier. Pour monter en charge, il faut d'abord passer à PostgreSQL — l'écran d'administration copie les données et teste la cible avant de basculer — et ensuite seulement augmenter le nombre d'exemplaires.
strategy: Recreate. Avec un volume ReadWriteOnce, une mise à jour progressive se bloquerait : le nouveau pod attendrait un volume que l'ancien tient encore. Autant l'assumer explicitement plutôt que de découvrir un rollout figé.
Les trois sondes pointent sur /health, qui répond sans authentification et n'expose aucun secret. La sonde de démarrage tolère une minute, le temps que les migrations passent sur une base neuve.
La documentation
La documentation est publiée sur le wiki : présentation, installation Docker, installation Kubernetes, configuration et options, authentification et rôles, prise en main, plannings, routines de contrôle, périodes et déploiement, administration, exploitation et dépannage, référence technique.
Elle est illustrée des captures produites sur un jeu de démonstration. Le simulateur interne sert d'instance Home Assistant.
Tout au même endroit
- Documentation complète — treize pages, du premier
docker runau modèle de données. - Image Docker —
suntux57420/domodrive:1.0.0et:latest. - Fiche projet — le contexte, les choix, la démarche.
- Dépôt GitLab — dépôt privé, l'accès se demande.
Et les quatre articles de la série, rappelés plus haut, pour la partie qui n'est pas dans la documentation : les raisons.
La suite
Le prochain chapitre est déjà écrit dans deploy/kubernetes/ : faire tourner Domodrive sur le cluster k3s de la maison et le passage à PostgreSQL.
D'ici là, l'image est publique, la documentation est en ligne, et il suffit d'une commande pour l'essayer.