{"id":3859,"date":"2026-04-08T08:58:00","date_gmt":"2026-04-08T06:58:00","guid":{"rendered":"https:\/\/domo.rem81.com\/?p=3859"},"modified":"2026-05-08T08:59:33","modified_gmt":"2026-05-08T06:59:33","slug":"sauvegarder-automatiquement-sa-configuration-home-assistant-sur-github","status":"publish","type":"post","link":"https:\/\/domo.rem81.com\/index.php\/2026\/04\/08\/sauvegarder-automatiquement-sa-configuration-home-assistant-sur-github\/","title":{"rendered":"Sauvegarder automatiquement sa configuration Home Assistant sur GitHub"},"content":{"rendered":"\n\n\n\n<h1 class=\"wp-block-heading\">Intro:<\/h1>\n\n\n\n<p>Dans cet article, je vous guide pas \u00e0 pas pour mettre en place une sauvegarde automatique de votre configuration Home Assistant vers un d\u00e9p\u00f4t GitHub.<\/p>\n\n\n\n<p>L\u2019objectif est simple : conserver un historique propre de ses fichiers de configuration, retrouver facilement une ancienne version et s\u00e9curiser son installation domotique en cas de mauvaise manipulation.<\/p>\n\n\n\n<p>Cette m\u00e9thode ne remplace pas les sauvegardes compl\u00e8tes de Home Assistant, mais elle est tr\u00e8s pratique pour suivre les modifications des fichiers YAML, des scripts, des automatisations, des tableaux de bord ou des fichiers personnalis\u00e9s.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Pr\u00e9requis<\/h1>\n\n\n\n<p>Avant de commencer, il faut disposer de :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Home Assistant OS ou Home Assistant Supervised avec acc\u00e8s au dossier <code>\/config<\/code>.<\/li>\n\n\n\n<li>L\u2019add-on <strong>Terminal &amp; SSH<\/strong> ou un acc\u00e8s SSH \u00e9quivalent.<\/li>\n\n\n\n<li>\u00c9ventuellement l\u2019add-on <strong>Studio Code Server<\/strong> pour modifier les fichiers plus confortablement.<\/li>\n\n\n\n<li>Un compte GitHub.<\/li>\n\n\n\n<li>Un d\u00e9p\u00f4t GitHub, priv\u00e9 de pr\u00e9f\u00e9rence.<\/li>\n\n\n\n<li>Quelques notions de base en ligne de commande.<\/li>\n<\/ul>\n\n\n\n<p>L\u2019acc\u00e8s au terminal est indispensable, car nous allons initialiser un d\u00e9p\u00f4t Git directement dans le dossier de configuration de Home Assistant.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Cr\u00e9er un d\u00e9p\u00f4t GitHub<\/h1>\n\n\n\n<p>Connectez-vous \u00e0 GitHub, puis cr\u00e9ez un nouveau d\u00e9p\u00f4t.<\/p>\n\n\n\n<p>Je conseille de choisir un d\u00e9p\u00f4t <strong>priv\u00e9<\/strong>, afin d\u2019\u00e9viter d\u2019exposer publiquement des fichiers li\u00e9s \u00e0 votre installation domotique.<\/p>\n\n\n\n<p>Lors de la cr\u00e9ation du d\u00e9p\u00f4t, vous pouvez le laisser vide :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>sans README ;<\/li>\n\n\n\n<li>sans fichier <code>.gitignore<\/code> ;<\/li>\n\n\n\n<li>sans licence.<\/li>\n<\/ul>\n\n\n\n<p>Cela \u00e9vite les conflits lors du premier envoi depuis Home Assistant.<\/p>\n\n\n\n<p>Exemple d\u2019URL SSH du d\u00e9p\u00f4t :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git@github.com:VOTRE_COMPTE\/VOTRE_DEPOT.git\n<\/code><\/pre>\n\n\n\n<p>Remplacez bien <code>VOTRE_COMPTE<\/code> et <code>VOTRE_DEPOT<\/code> par vos propres informations GitHub.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Pr\u00e9parer l\u2019acc\u00e8s SSH vers GitHub<\/h1>\n\n\n\n<p>Pour que Home Assistant puisse envoyer automatiquement les modifications vers GitHub, le plus propre est d\u2019utiliser une cl\u00e9 SSH d\u00e9di\u00e9e.<\/p>\n\n\n\n<p>Dans le terminal Home Assistant, ex\u00e9cutez :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p \/config\/.ssh\nchmod 700 \/config\/.ssh\n\nssh-keygen -t ed25519 -C \"homeassistant-github\" -f \/config\/.ssh\/id_ed25519 -N \"\"\n\nchmod 600 \/config\/.ssh\/id_ed25519\nchmod 644 \/config\/.ssh\/id_ed25519.pub\n<\/code><\/pre>\n\n\n\n<p>Affichez ensuite la cl\u00e9 publique :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/config\/.ssh\/id_ed25519.pub\n<\/code><\/pre>\n\n\n\n<p>Copiez tout le contenu affich\u00e9, puis ajoutez cette cl\u00e9 dans GitHub.<\/p>\n\n\n\n<p>Deux possibilit\u00e9s existent :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>l\u2019ajouter dans les cl\u00e9s SSH de votre compte GitHub ;<\/li>\n\n\n\n<li>l\u2019ajouter dans les <strong>Deploy keys<\/strong> du d\u00e9p\u00f4t, avec l\u2019option <strong>Allow write access<\/strong> activ\u00e9e.<\/li>\n<\/ul>\n\n\n\n<p>Pour un usage d\u00e9di\u00e9 \u00e0 Home Assistant, la solution <strong>Deploy key<\/strong> est g\u00e9n\u00e9ralement plus propre, car elle limite cette cl\u00e9 \u00e0 un seul d\u00e9p\u00f4t.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Cr\u00e9er le fichier <code>.gitignore<\/code><\/h1>\n\n\n\n<p>Dans le dossier <code>\/config<\/code>, cr\u00e9ez un fichier nomm\u00e9 <code>.gitignore<\/code>.<\/p>\n\n\n\n<p>Ce fichier permet d\u2019exclure les fichiers sensibles, volumineux ou inutiles.<\/p>\n\n\n\n<p>Voici une base adapt\u00e9e \u00e0 Home Assistant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># On ignore tout par d\u00e9faut\n*\n\n# On garde l'arborescence des dossiers\n!*\/\n\n# Fichiers de configuration et scripts utiles\n!*.yaml\n!*.yml\n!*.md\n!*.sh\n!*.py\n!*.js\n!*.css\n!*.html\n!*.csv\n!*.dash\n!*.png\n!*.jpg\n!*.jpeg\n!.gitignore\n\n# Fichiers sensibles\n\/secrets.yaml\n\/.storage\/\n\/.ssh\/\n\/.cloud\/\n\n# Bases de donn\u00e9es et fichiers temporaires\n*.db\n*.db-*\n*.log\n*.log.*\nhome-assistant.log*\nOZW_Log.txt\n\n# Fichiers g\u00e9n\u00e9r\u00e9s ou caches\n\/deps\/\n\/tts\/\n\/__pycache__\/\n<\/code><\/pre>\n\n\n\n<p>Le point le plus important est de ne pas envoyer <code>secrets.yaml<\/code> sur GitHub.<\/p>\n\n\n\n<p>Ce fichier contient souvent des mots de passe, des tokens, des adresses IP, des cl\u00e9s API ou d\u2019autres informations sensibles.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Initialiser le d\u00e9p\u00f4t Git dans Home Assistant<\/h1>\n\n\n\n<p>Placez-vous dans le dossier <code>\/config<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/config\n<\/code><\/pre>\n\n\n\n<p>Initialisez le d\u00e9p\u00f4t Git :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git init\ngit branch -M main\n<\/code><\/pre>\n\n\n\n<p>Configurez l\u2019identit\u00e9 utilis\u00e9e pour les commits :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git config user.email \"votre_email@gmail.com\"\ngit config user.name \"Votre Nom\"\n<\/code><\/pre>\n\n\n\n<p>Ajoutez le d\u00e9p\u00f4t GitHub distant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git remote add origin git@github.com:VOTRE_COMPTE\/VOTRE_DEPOT.git\n<\/code><\/pre>\n\n\n\n<p>V\u00e9rifiez que le d\u00e9p\u00f4t distant est bien configur\u00e9 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git remote -v\n<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Faire le premier commit manuel<\/h1>\n\n\n\n<p>Avant d\u2019automatiser la sauvegarde, il faut faire un premier envoi \u00e0 la main.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/config\ngit add -A\ngit status\ngit commit -m \"Premier commit Home Assistant\"\ngit push -u origin main\n<\/code><\/pre>\n\n\n\n<p>Si tout est correctement configur\u00e9, les fichiers autoris\u00e9s par le <code>.gitignore<\/code> apparaissent maintenant dans votre d\u00e9p\u00f4t GitHub.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">V\u00e9rifier qu\u2019aucun fichier sensible n\u2019est suivi<\/h1>\n\n\n\n<p>Avant d\u2019aller plus loin, il est important de v\u00e9rifier que les fichiers sensibles ne sont pas suivis par Git.<\/p>\n\n\n\n<p>Ex\u00e9cutez :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git ls-files | grep -E 'secrets.yaml|\\.storage|\\.ssh|\\.db|\\.log'\n<\/code><\/pre>\n\n\n\n<p>Si la commande ne retourne rien, c\u2019est parfait.<\/p>\n\n\n\n<p>Si un fichier sensible appara\u00eet, retirez-le du suivi Git sans le supprimer du disque :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git rm --cached secrets.yaml\ngit rm -r --cached .storage\ngit commit -m \"Suppression des fichiers sensibles du suivi Git\"\ngit push origin main\n<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Cr\u00e9er le script automatique <code>gitpush.sh<\/code><\/h1>\n\n\n\n<p>Cr\u00e9ez maintenant un fichier <code>\/config\/gitpush.sh<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano \/config\/gitpush.sh\n<\/code><\/pre>\n\n\n\n<p>Collez le contenu suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\nset -euo pipefail\n\nLOG_FILE=\"\/config\/gitpush-debug.log\"\n\n{\n  echo \"----------------------------------------\"\n  echo \"Sauvegarde GitHub Home Assistant\"\n  echo \"Date : $(date +'%Y-%m-%d %H:%M:%S')\"\n\n  cd \/config\n\n  export HOME=\/config\n  export GIT_SSH_COMMAND=\"ssh -i \/config\/.ssh\/id_ed25519 -o IdentitiesOnly=yes -o StrictHostKeyChecking=accept-new\"\n\n  git config user.email \"votre_email@gmail.com\"\n  git config user.name \"Votre Nom\"\n\n  git add -A\n\n  if git diff --cached --quiet; then\n    echo \"Aucun changement \u00e0 sauvegarder.\"\n    exit 0\n  fi\n\n  git commit -m \"Sauvegarde auto - $(date +'%Y-%m-%d %H:%M:%S')\"\n  git push origin main\n\n  echo \"Sauvegarde termin\u00e9e avec succ\u00e8s.\"\n\n} &gt;&gt; \"$LOG_FILE\" 2&gt;&amp;1\n<\/code><\/pre>\n\n\n\n<p>Rendez le script ex\u00e9cutable :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>chmod +x \/config\/gitpush.sh\n<\/code><\/pre>\n\n\n\n<p>Testez-le manuellement :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/config\/gitpush.sh\n<\/code><\/pre>\n\n\n\n<p>Consultez ensuite le fichier de log :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/config\/gitpush-debug.log\n<\/code><\/pre>\n\n\n\n<p>Ce script pr\u00e9sente plusieurs avantages :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>il journalise les actions dans <code>\/config\/gitpush-debug.log<\/code> ;<\/li>\n\n\n\n<li>il ne cr\u00e9e pas de commit vide s\u2019il n\u2019y a aucun changement ;<\/li>\n\n\n\n<li>il utilise explicitement la cl\u00e9 SSH d\u00e9di\u00e9e ;<\/li>\n\n\n\n<li>il envoie les modifications vers la branche <code>main<\/code>.<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Ajouter la commande dans Home Assistant<\/h1>\n\n\n\n<p>Dans <code>configuration.yaml<\/code>, ajoutez :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>shell_command:\n  gitpush: \"bash \/config\/gitpush.sh\"\n<\/code><\/pre>\n\n\n\n<p>Red\u00e9marrez Home Assistant ou rechargez la configuration YAML si votre installation le permet.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Cr\u00e9er l\u2019automatisation Home Assistant<\/h1>\n\n\n\n<p>Vous pouvez maintenant cr\u00e9er une automatisation pour lancer la sauvegarde automatiquement.<\/p>\n\n\n\n<p>Par exemple, pour ex\u00e9cuter la sauvegarde toutes les nuits \u00e0 03h30 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>alias: GitHub - Sauvegarde automatique Home Assistant\ndescription: \"Envoie automatiquement la configuration Home Assistant vers GitHub.\"\ntrigger:\n  - platform: time\n    at: \"03:30:00\"\ncondition: &#091;]\naction:\n  - service: shell_command.gitpush\nmode: single\n<\/code><\/pre>\n\n\n\n<p>\u00c0 chaque ex\u00e9cution, Home Assistant lancera le script, cr\u00e9era un commit si des fichiers ont chang\u00e9, puis enverra les modifications vers GitHub.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Tester depuis Home Assistant<\/h1>\n\n\n\n<p>Pour tester sans attendre l\u2019heure pr\u00e9vue, allez dans <strong>Outils de d\u00e9veloppement<\/strong>, puis dans l\u2019onglet <strong>Services<\/strong>.<\/p>\n\n\n\n<p>Recherchez le service :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>shell_command.gitpush\n<\/code><\/pre>\n\n\n\n<p>Lancez le service, puis v\u00e9rifiez le d\u00e9p\u00f4t GitHub.<\/p>\n\n\n\n<p>Vous pouvez \u00e9galement consulter le fichier de log :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/config\/gitpush-debug.log\n<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">G\u00e9rer une erreur d\u2019authentification SSH<\/h1>\n\n\n\n<p>Si le <code>git push<\/code> \u00e9choue avec une erreur de permission, testez la connexion SSH :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ssh -T -i \/config\/.ssh\/id_ed25519 git@github.com\n<\/code><\/pre>\n\n\n\n<p>Si GitHub ne reconna\u00eet pas la cl\u00e9, v\u00e9rifiez que la cl\u00e9 publique affich\u00e9e avec cette commande :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cat \/config\/.ssh\/id_ed25519.pub\n<\/code><\/pre>\n\n\n\n<p>est bien ajout\u00e9e dans GitHub.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">G\u00e9rer une erreur <code>non-fast-forward<\/code><\/h1>\n\n\n\n<p>Cette erreur peut arriver si vous avez modifi\u00e9 le d\u00e9p\u00f4t directement depuis GitHub.<\/p>\n\n\n\n<p>Au lieu de forcer imm\u00e9diatement l\u2019envoi, commencez par r\u00e9cup\u00e9rer les modifications distantes :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/config\ngit pull --rebase origin main\ngit push origin main\n<\/code><\/pre>\n\n\n\n<p>\u00c9vitez autant que possible cette commande :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git push -f origin main\n<\/code><\/pre>\n\n\n\n<p>Elle force l\u2019\u00e9crasement de l\u2019historique distant et peut supprimer des modifications pr\u00e9sentes sur GitHub.<\/p>\n\n\n\n<p>Si vous devez vraiment forcer l\u2019envoi, pr\u00e9f\u00e9rez :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git push --force-with-lease origin main\n<\/code><\/pre>\n\n\n\n<p>Cette commande reste \u00e0 utiliser avec prudence, mais elle est plus s\u00fbre qu\u2019un simple <code>git push -f<\/code>.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">R\u00e9appliquer le <code>.gitignore<\/code><\/h1>\n\n\n\n<p>Si un fichier \u00e9tait d\u00e9j\u00e0 suivi par Git avant l\u2019ajout du <code>.gitignore<\/code>, il continuera \u00e0 \u00eatre suivi m\u00eame s\u2019il est ensuite ajout\u00e9 dans les exclusions.<\/p>\n\n\n\n<p>Pour r\u00e9appliquer proprement le <code>.gitignore<\/code>, ex\u00e9cutez :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/config\ngit rm -r --cached .\ngit add -A\ngit commit -m \"R\u00e9application du .gitignore\"\ngit push origin main\n<\/code><\/pre>\n\n\n\n<p>V\u00e9rifiez ensuite les fichiers suivis :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git status\ngit ls-files\n<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Bonnes pratiques<\/h1>\n\n\n\n<p>Quelques r\u00e8gles simples permettent d\u2019\u00e9viter les mauvaises surprises :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>utilisez un d\u00e9p\u00f4t GitHub priv\u00e9 ;<\/li>\n\n\n\n<li>n\u2019envoyez jamais <code>secrets.yaml<\/code> ;<\/li>\n\n\n\n<li>n\u2019envoyez jamais le dossier <code>.storage<\/code> ;<\/li>\n\n\n\n<li>n\u2019envoyez jamais le dossier <code>.ssh<\/code> ;<\/li>\n\n\n\n<li>gardez une vraie sauvegarde Home Assistant en compl\u00e9ment ;<\/li>\n\n\n\n<li>v\u00e9rifiez r\u00e9guli\u00e8rement que les commits se font bien ;<\/li>\n\n\n\n<li>consultez <code>\/config\/gitpush-debug.log<\/code> en cas de doute ;<\/li>\n\n\n\n<li>\u00e9vitez de modifier directement les fichiers sur GitHub si Home Assistant est la source principale.<\/li>\n<\/ul>\n\n\n\n<p>GitHub est tr\u00e8s pratique pour suivre l\u2019\u00e9volution des fichiers de configuration, mais ce n\u2019est pas une sauvegarde compl\u00e8te de Home Assistant.<\/p>\n\n\n\n<p>Les sauvegardes natives restent indispensables pour restaurer rapidement l\u2019ensemble du syst\u00e8me.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p>Votre Home Assistant est maintenant capable d\u2019envoyer automatiquement sa configuration vers GitHub.<\/p>\n\n\n\n<p>\u00c0 chaque modification importante, un commit permet de garder une trace claire de ce qui a chang\u00e9. C\u2019est particuli\u00e8rement pratique apr\u00e8s une mise \u00e0 jour, une modification d\u2019automatisation ou un gros nettoyage de configuration.<\/p>\n\n\n\n<p>Cette m\u00e9thode apporte une vraie s\u00e9curit\u00e9 suppl\u00e9mentaire : en cas d\u2019erreur, il devient plus facile de comparer les versions, revenir en arri\u00e8re ou simplement comprendre ce qui a \u00e9t\u00e9 modifi\u00e9.<\/p>\n\n\n\n<p>C\u2019est une solution simple, fiable et tr\u00e8s utile pour garder une installation Home Assistant propre, suivie et ma\u00eetris\u00e9e.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro: Dans cet article, je vous guide pas \u00e0 pas pour mettre en place une sauvegarde automatique de votre configuration Home Assistant vers un d\u00e9p\u00f4t GitHub. L\u2019objectif est simple : &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[98],"tags":[],"class_list":["post-3859","post","type-post","status-publish","format-standard","hentry","category-linux"],"_links":{"self":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/3859","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/comments?post=3859"}],"version-history":[{"count":6,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/3859\/revisions"}],"predecessor-version":[{"id":4388,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/posts\/3859\/revisions\/4388"}],"wp:attachment":[{"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/media?parent=3859"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/categories?post=3859"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/domo.rem81.com\/index.php\/wp-json\/wp\/v2\/tags?post=3859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}