{"id":12,"date":"2026-09-11T14:03:31","date_gmt":"2026-09-11T14:03:31","guid":{"rendered":"https:\/\/noteback.chabod.eu\/?p=12"},"modified":"2026-09-11T14:03:31","modified_gmt":"2026-09-11T14:03:31","slug":"doc-07-tester-sans-casser","status":"publish","type":"post","link":"https:\/\/noteback.chabod.eu\/?p=12","title":{"rendered":"Tester la bascule sans casser la production"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Document g\u00e9n\u00e9r\u00e9 automatiquement depuis <code>\/home\/jerome\/pub\/docs\/07-tester-sans-casser.md<\/code> sur kimsufi3, le 11 September 2026 \u00e0 14:03. Toute modification faite ici sera \u00e9cras\u00e9e \u00e0 la prochaine r\u00e9g\u00e9n\u00e9ration : \u00e9diter le fichier source.<\/em><\/p>\n\n\n<p>La phase 7 est la plus risqu\u00e9e du projet. Elle ne se prend pas en bloc : quatre paliers, chacun franchi seulement quand le pr\u00e9c\u00e9dent est concluant.<\/p>\n<h2 id=\"pourquoi-la-faire-quand-m\u00eame\">Pourquoi la faire quand m\u00eame<\/h2>\n<p>En une journ\u00e9e de mise en place, <strong>cinq d\u00e9fauts r\u00e9els<\/strong> ont \u00e9t\u00e9 trouv\u00e9s, dont aucun ne se serait manifest\u00e9 avant le jour de la vraie panne :<\/p>\n<table>\n<thead>\n<tr>\n<th>D\u00e9faut<\/th>\n<th>Ce qu&#8217;il aurait provoqu\u00e9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>ufw limit<\/code> sur le port SSH<\/td>\n<td>r\u00e9plication bloqu\u00e9e <strong>en silence<\/strong><\/td>\n<\/tr>\n<tr>\n<td>k3 banni d\u00e9finitivement par fail2ban<\/td>\n<td>\u00ab Connection refused \u00bb sur tous les ports<\/td>\n<\/tr>\n<tr>\n<td><code>2&gt;\/dev\/null<\/code> dans la commande distante<\/td>\n<td>\u00ab pair injoignable \u00bb indiscernable d&#8217;une panne<\/td>\n<\/tr>\n<tr>\n<td>store ACME jamais d\u00e9pos\u00e9<\/td>\n<td>19 certificats \u00e0 r\u00e9\u00e9mettre en pleine bascule<\/td>\n<\/tr>\n<tr>\n<td>sonde disparue \u00e0 la r\u00e9installation<\/td>\n<td>3 h sans aucune surveillance, sans le savoir<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Un plan de secours non test\u00e9 n&#8217;est pas un plan de secours.<\/p>\n<h2 id=\"palier-7a----preparer-seul--risque-quasi-nul\">Palier 7a \u2014 <code>--preparer<\/code> seul \u00b7 risque quasi nul<\/h2>\n<p><strong>Sans toucher au DNS ni \u00e0 Home Assistant.<\/strong> R\u00e9versible par <code>--annuler<\/code>.<\/p>\n<p>Ce palier r\u00e9pond aux questions qui comptent le plus, et il n&#8217;engage rien :<\/p>\n<ul>\n<li>mailcow d\u00e9marre-t-il vraiment sur k3 ?<\/li>\n<li><strong>tient-on dans 3,8 Go de RAM ?<\/strong> (<code>docker stats<\/code>, cible : sous 3,3 Go)<\/li>\n<li>les dumps se restaurent-ils, et les bo\u00eetes sont-elles l\u00e0 ?<\/li>\n<li>le store ACME fusionn\u00e9 porte-t-il bien les 19 noms ?<\/li>\n<li>combien de temps prend le d\u00e9marrage sur l&#8217;Atom ?<\/li>\n<\/ul>\n<p>C&#8217;est <strong>l&#8217;essentiel de la valeur du test pour une fraction du risque.<\/strong> \u00c0 faire en premier, un jour ordinaire.<\/p>\n<h2 id=\"palier-7b--test-\u00e0-blanc--risque-nul\">Palier 7b \u2014 test \u00e0 blanc \u00b7 risque nul<\/h2>\n<p>k3 sert d\u00e9j\u00e0, mais <strong>le DNS pointe toujours vers k4<\/strong>. On force la r\u00e9solution c\u00f4t\u00e9 client :<\/p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb1-1\"><a href=\"#cb1-1\" aria-hidden=\"true\" tabindex=\"-1\"><\/a><span class=\"cf\">for<\/span> h <span class=\"kw\">in<\/span> chabod.eu mail.chabod.eu cloud.chabod.eu note.chabod.eu ha.chabod.eu<span class=\"kw\">;<\/span> <span class=\"cf\">do<\/span><\/span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>  <span class=\"ex\">curl<\/span> <span class=\"at\">-sS<\/span> <span class=\"at\">-o<\/span> \/dev\/null <span class=\"at\">-w<\/span> <span class=\"st\">&quot;%{http_code} %{ssl_verify_result} <\/span><span class=\"va\">$h<\/span><span class=\"st\">n&quot;<\/span> <span class=\"dt\"><\/span><\/span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>       <span class=\"at\">--resolve<\/span> <span class=\"st\">&quot;<\/span><span class=\"va\">$h<\/span><span class=\"st\">:443:37.59.39.138&quot;<\/span> <span class=\"st\">&quot;https:\/\/<\/span><span class=\"va\">$h<\/span><span class=\"st\">\/&quot;<\/span><\/span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" aria-hidden=\"true\" tabindex=\"-1\"><\/a><span class=\"cf\">done<\/span><\/span><\/code><\/pre><\/div>\n<p>On v\u00e9rifie les codes attendus, <strong>certificats compris<\/strong> (<code>ssl_verify_result<\/code> \u00e0 0). Rappel de <code>HERITAGE.md<\/code> : <code>chabod.eu<\/code> r\u00e9pond <strong>403<\/strong> et <code>note.chabod.eu<\/code> <strong>302<\/strong> \u2014 ce sont les r\u00e9ponses normales, pas des pannes.<\/p>\n<p>Puis on annule, et <strong>on n&#8217;a rien risqu\u00e9 du tout<\/strong>.<\/p>\n<h2 id=\"palier-7c--bascule-r\u00e9elle-courte--risque-r\u00e9el-ma\u00eetris\u00e9\">Palier 7c \u2014 bascule r\u00e9elle courte \u00b7 risque r\u00e9el, ma\u00eetris\u00e9<\/h2>\n<p>Seulement si 7a et 7b sont propres. Pr\u00e9cautions, toutes n\u00e9cessaires :<\/p>\n<ul>\n<li><strong>un cr\u00e9neau calme<\/strong> : pas un vendredi soir, pas avant un d\u00e9placement ;<\/li>\n<li><strong>la sauvegarde de la nuit v\u00e9rifi\u00e9e<\/strong> (<code>\/opt\/backup\/backup.bash<\/code> \u00e0 23 h) ;<\/li>\n<li><strong>Nextcloud en lecture seule<\/strong> pendant toute la bascule \u2014 c&#8217;est ce qui rend le retour trivial : sans \u00e9criture, aucun delta de 725 Go \u00e0 rapatrier ;<\/li>\n<li><strong>une dur\u00e9e courte et d\u00e9cid\u00e9e d&#8217;avance<\/strong> : 30 minutes, pas \u00ab on verra \u00bb.<\/li>\n<\/ul>\n<p>Le courrier est le point le plus tol\u00e9rant : un serveur distant qui ne joint pas <code>mail.chabod.eu<\/code> <strong>r\u00e9essaie pendant plusieurs jours<\/strong>. Un retard n&#8217;est pas une perte.<\/p>\n<h2 id=\"palier-7d--le-retour--le-vrai-moment-d\u00e9licat\">Palier 7d \u2014 le retour \u00b7 le vrai moment d\u00e9licat<\/h2>\n<p>C&#8217;est ici que deux jeux de donn\u00e9es divergents coexistent.<\/p>\n<p><strong>R\u00e8gle absolue : <code>--dry-run<\/code> du retour, relu, avant d&#8217;armer le <code>--delete<\/code>.<\/strong> Le sens de la r\u00e9plication s&#8217;inverse, donc <code>--delete<\/code> traite d\u00e9sormais k3 comme la r\u00e9f\u00e9rence. Une erreur de chemin y d\u00e9truit des donn\u00e9es sur k4.<\/p>\n<p>Ce qui a diverg\u00e9 pendant la bascule, et comment :<\/p>\n<table>\n<thead>\n<tr>\n<th>Donn\u00e9e<\/th>\n<th>Divergence<\/th>\n<th>Traitement<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Courrier re\u00e7u sur k3<\/td>\n<td>additive (nouveaux maildirs)<\/td>\n<td>le rsync retour les rapatrie<\/td>\n<\/tr>\n<tr>\n<td>Base mailcow<\/td>\n<td>modifi\u00e9e<\/td>\n<td>dump sur k3, restaur\u00e9 sur k4<\/td>\n<\/tr>\n<tr>\n<td>Nextcloud<\/td>\n<td><strong>aucune<\/strong> (lecture seule)<\/td>\n<td>rien \u00e0 faire<\/td>\n<\/tr>\n<tr>\n<td>Historique HA<\/td>\n<td>quelques heures d&#8217;\u00e9cart<\/td>\n<td>copie coh\u00e9rente au retour<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>L&#8217;ordre ne se n\u00e9gocie pas : <code>--ceder<\/code> sur k3, <strong>puis<\/strong> <code>--dry-run<\/code> relu, <strong>puis<\/strong> la r\u00e9plication, <strong>puis<\/strong> <code>--prendre<\/code> sur k4.<\/p>\n<h2 id=\"ce-qui-reste-vrai-quoi-quil-arrive\">Ce qui reste vrai quoi qu&#8217;il arrive<\/h2>\n<p>k3 n&#8217;est <strong>pas<\/strong> une sauvegarde. Si un palier tourne mal, le filet est <code>\/opt\/backup\/daily-backup-2.tar.encrypt<\/code> \u2014 sauf pour <code>NCData<\/code>, qui n&#8217;y figure pas. C&#8217;est pr\u00e9cis\u00e9ment pourquoi Nextcloud reste en <strong>lecture seule<\/strong> pendant toute l&#8217;op\u00e9ration : ce qui n&#8217;est pas \u00e9crit ne peut pas \u00eatre perdu.<\/p>","protected":false},"excerpt":{"rendered":"<p>Document g\u00e9n\u00e9r\u00e9 automatiquement depuis \/home\/jerome\/pub\/docs\/07-tester-sans-casser.md sur kimsufi3, le 11 September 2026 \u00e0 14:03. Toute modification faite ici sera \u00e9cras\u00e9e \u00e0 la prochaine r\u00e9g\u00e9n\u00e9ration : \u00e9diter le fichier source. La phase 7 est la plus risqu\u00e9e du projet. Elle ne se prend pas en bloc : quatre paliers, chacun franchi seulement quand le pr\u00e9c\u00e9dent est concluant. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-12","post","type-post","status-publish","format-standard","hentry","category-exploitation-dockersync"],"_links":{"self":[{"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=\/wp\/v2\/posts\/12","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12"}],"version-history":[{"count":0,"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=\/wp\/v2\/posts\/12\/revisions"}],"wp:attachment":[{"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=12"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/noteback.chabod.eu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=12"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}