<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Migration on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/migration/</link><description>Recent content in Migration on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 29 Nov 2021 08:00:00 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/migration/index.xml" rel="self" type="application/rss+xml"/><item><title>J'ai enfin migré de Wordpress vers Hugo - partie 2</title><link>https://blog.zwindler.fr/2021/11/29/jai-enfin-migre-de-wordpress-a-hugo-partie-2/</link><pubDate>Mon, 29 Nov 2021 08:00:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/11/29/jai-enfin-migre-de-wordpress-a-hugo-partie-2/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/11/wordpress-to-hugo.webp" alt="Featured image of post J'ai enfin migré de Wordpress vers Hugo - partie 2" /&gt;&lt;p&gt;Cette article fait partie d&amp;rsquo;une suite d&amp;rsquo;articles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/" &gt;J&amp;rsquo;ai enfin migré de Wordpress vers Hugo - partie 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/11/29/jai-enfin-migre-de-wordpress-a-hugo-partie-2/" &gt;J&amp;rsquo;ai enfin migré de Wordpress vers Hugo - partie 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="extraire-les-données-de-wordpress"&gt;Extraire les données de WordPress
&lt;/h2&gt;&lt;p&gt;Normalement &lt;a class="link" href="https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/" &gt;si vous avez lu la première partie&lt;/a&gt;, vous savez qu&amp;rsquo;on a un Hugo fonctionnel (mais vide). Et que dans mon cas, l&amp;rsquo;objectif était de migrer 12 ans d&amp;rsquo;historique (350 articles tout de même) de Wordpress vers notre Hugo.&lt;/p&gt;
&lt;p&gt;Vous vous en doutez, le but n&amp;rsquo;est pas de reprendre les articles uns par uns (sauf si vous n&amp;rsquo;en avez qu&amp;rsquo;une dizaine, ça doit se faire) mais bien de trouver une méthode pour exporter le contenu existant en markdown pour repartir comme si de rien n&amp;rsquo;était.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://gohugo.io/tools/migrations/#wordpress" target="_blank" rel="noopener"
&gt;La documentation officielle de Hugo donne plusieurs pistes&lt;/a&gt; pour migrer depuis Wordpress et c&amp;rsquo;est la première que j&amp;rsquo;avais utilisé en 2019 (la première fois que j&amp;rsquo;avais tenté de migrer, sans succès). J&amp;rsquo;ai re-installé l&amp;rsquo;extension &lt;code&gt;wordpress-to-hugo-exporter&lt;/code&gt; (je vous invite quand même à regarder les alternatives car il n&amp;rsquo;est pas impossible que ça ait évolué depuis).&lt;/p&gt;
&lt;h2 id="wordpress-to-hugo-exporter"&gt;wordpress-to-hugo-exporter
&lt;/h2&gt;&lt;p&gt;La première chose à faire pour installer cette extension est de vérifier que votre serveur qui héberge le WordPress dispose bien de l’extension PHP &lt;code&gt;zip.so&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/php.d/40-zip.ini
; Enable ZIP extension module
extension=zip.so
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut ensuite cloner le projet git du plugin directement dans le dossier plugin de WordPress&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd PATH_TO_WORDPRESS/wp-content/plugins/
git clone https://github.com/SchumacherFM/wordpress-to-hugo-exporter
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, il est possible de démarrer un export soit depuis l&amp;rsquo;interface, soit via un script en PHP lancé depuis le serveur en ligne de commandes. Évidemment, dans ce genre de procédures, on arrive toujours à un moment où on se tape un timeout quelque part. Dans mon cas, les données exportées (articles + medias, environ ~1.5 Go) prenaient 500 Mo de RAM et 20 minutes d&amp;rsquo;exécution.&lt;/p&gt;
&lt;p&gt;On oublie donc le clic dans l&amp;rsquo;interface (sauf à tuner votre nginx pour autoriser des requêtes clients avec un timeout &amp;gt; 60s) et on lance depuis la ligne de commande. Et bien entendu, on augmente toutes les limites possibles et imaginables, notamment celle de wordpress via le fichier wp-config.php.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-PHP" data-lang="PHP"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Set initial default constants including WP_MEMORY_LIMIT, WP_MAX_MEMORY_LIMIT, WP_DEBUG, SCRIPT_DEBUG, WP_CONTENT_DIR and WP_CACHE.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;wp_initial_constants&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;WP_MEMORY_LIMIT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2048M&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;WP_MAX_MEMORY_LIMIT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2048M&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; PATH_TO_WORDPRESS/wp-content/plugins/wordpress-to-hugo-exporter/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;php hugo-export-cli.php &lt;span class="nv"&gt;memory_limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Qui devrait se terminer, si tout se passe bien, par un :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is your file!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/tmp/wp-hugo.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Note: on peut également exporter les commentaires, il faut modifier manuellement une ligne dans le fichier &lt;code&gt;hugo-export.php&lt;/code&gt; (voir la doc)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A partir de là, on a une archive qui contient vos posts, vos pages et vos médias importés (grosso modo tout wp-content).&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;archive a l&amp;rsquo;arborescence suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un dossier &lt;strong&gt;posts&lt;/strong&gt; qui contient tous les articles (&lt;em&gt;posts&lt;/em&gt; dans la terminologie wordpress) dans un mélange de markdown + html brut (ce qui n&amp;rsquo;aura pas été correctement converti, on y reviendra)&lt;/li&gt;
&lt;li&gt;un dossier &lt;strong&gt;wp-content&lt;/strong&gt; qui contient tous les médias&lt;/li&gt;
&lt;li&gt;des dossiers pour chacune de vos &amp;ldquo;&lt;em&gt;pages&lt;/em&gt; (&amp;ldquo;à propos&amp;rdquo;, &amp;ldquo;mentions légales&amp;rdquo;, etc).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="importer-dans-hugo"&gt;Importer dans Hugo
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;arborescence de Hugo est elle un peu différente. De base, tout ce qui est markdown doit être dans &lt;strong&gt;content&lt;/strong&gt;, avec des sous dossiers en fonction du type de page (&lt;em&gt;post&lt;/em&gt; ou &lt;em&gt;page&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;La première petite &amp;ldquo;blaguounette&amp;rdquo; est que les &lt;em&gt;posts&lt;/em&gt; doivent être déposés dans le sous-dossier &lt;strong&gt;content/post&lt;/strong&gt; (sans S à la fin !!!).&lt;/p&gt;
&lt;p&gt;Chaque post commence par des métadonnées encadrées par des triples tirets &amp;ldquo;&amp;mdash;&amp;rdquo; avant et après. Ca donne quelque chose comme ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;title: &amp;#39;ESXi 4.0 &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Explorons l&amp;amp;rsquo;Hidden Console Part 1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;authors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;zwindler&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;post&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ld"&gt;2010-04-28T08:32:20&lt;/span&gt;&lt;span class="m"&gt;+00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/2010/04/28/esxi-4-0-explorons-lhidden-console-part-1/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;featured_image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://blog.example.org/wp-content/uploads/2014/10/vmware-220x162.jpg&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;Virtualisation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;ESX(i)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;Hidden Console&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SSH&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;L&amp;#39;article lui même...]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ca peut différer un peu selon les thèmes je pense, mais grosso modo les markdown des &lt;em&gt;pages&lt;/em&gt; iront eux dans &lt;strong&gt;content/page&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Enfin, tout ce qui est media (dossier wp-media) va dans un dossier &lt;strong&gt;static&lt;/strong&gt;. On peut garder la même arborescence que wordpress (/année/mois/) mais rien ne nous y oblige.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So far, so good&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="emile-et-images"&gt;Emile et Images
&lt;/h2&gt;&lt;p&gt;Enfin&amp;hellip; &lt;em&gt;so good&lt;/em&gt;, c&amp;rsquo;est vite dit&amp;hellip;&lt;/p&gt;
&lt;p&gt;Et oui parce que l&amp;rsquo;exporter n&amp;rsquo;exporte pas hyper bien un certain nombre de choses, à commencer par l&amp;rsquo;image de garde de chaque article :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;featured_image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://blog.example.org/wp-content/uploads/2014/10/vmware-220x162.jpg&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On peut remarquer plusieurs soucis avec cette variable. D&amp;rsquo;abord, la variable utilisée pour indiquer le chemin de l&amp;rsquo;image dans les métadonnées générées est &lt;code&gt;featured_image&lt;/code&gt; alors qu&amp;rsquo;Hugo attend &lt;code&gt;image&lt;/code&gt;. Petit &lt;code&gt;sed&lt;/code&gt; sur vos md pour corriger ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/featured_image/image/g&amp;#34;&lt;/span&gt; fichier.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mais bien sûr, ce n&amp;rsquo;est pas fini ;-)&lt;/p&gt;
&lt;p&gt;Ensuite, on remarque qu&amp;rsquo;on a un chemin est une URL complète et non pas relative. Si vous gardez les média dans le chemin &lt;strong&gt;static/wp-content/uploads/YYYY/MM&lt;/strong&gt; ça marchera, mais je trouve ça moche.&lt;/p&gt;
&lt;p&gt;2 solutions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on supprime &lt;strong&gt;/wp-content/uploads&lt;/strong&gt; avec un bête &lt;code&gt;sed -i &amp;quot;s!/wp-content/uploads!!g fichier.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;on passe en relatif en supprimant carrément toute la première partie de l&amp;rsquo;URL &lt;strong&gt;&lt;a class="link" href="https://yourblog.example.org/wp-content/uploads" target="_blank" rel="noopener"
&gt;https://yourblog.example.org/wp-content/uploads&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous choisissez la 2ème solution (mon choix), faites quand même bien attention. En fonction de &lt;em&gt;comment&lt;/em&gt; vous rédigez votre expression régulière, ça pourrait affecter aussi toutes les autres images que vous auriez en lien dans vos articles. Ce n&amp;rsquo;est pas forcément une mauvaise chose (moi j&amp;rsquo;aime mieux les liens relatifs car c&amp;rsquo;est plus flexible) mais ça demande un travail supplémentaire.&lt;/p&gt;
&lt;h2 id="images-intermédiaires"&gt;Images intermédiaires
&lt;/h2&gt;&lt;p&gt;Toujours dans les images, vous remarquerez aussi que l&amp;rsquo;image &amp;ldquo;mise en avant&amp;rdquo; (dans les métadonnées) possède un suffixe de type &lt;code&gt;-111x222&lt;/code&gt; juste avant l&amp;rsquo;extension. En fait, chaque fois que vous importez une image dans wordpress, celui ci la convertie en plusieurs tailles pour accélérer le chargement des pages.&lt;/p&gt;
&lt;p&gt;Sauf que le &lt;strong&gt;wordpress-to-hugo-exporter&lt;/strong&gt; choisi une des plus petites résolution pour l&amp;rsquo;image en tête de l&amp;rsquo;article. Ca sera souvent hyper moche&amp;hellip;&lt;/p&gt;
&lt;p&gt;Là encore, j&amp;rsquo;ai donc passé un gros &lt;code&gt;sed&lt;/code&gt; pour virer tous les suffixes &lt;code&gt;-111x222&lt;/code&gt; avant l&amp;rsquo;extension, puis je n&amp;rsquo;ai copié QUE les images originales dans le dossier &lt;strong&gt;static&lt;/strong&gt; (regex non triviale) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; PATH_TO_EXPORT/wp-content/uploads
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; i in &lt;span class="sb"&gt;`&lt;/span&gt;seq &lt;span class="m"&gt;2010&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; 2021&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; find &lt;span class="nv"&gt;$i&lt;/span&gt; -mindepth &lt;span class="m"&gt;1&lt;/span&gt; -type f -regextype posix-egrep -not -iregex &lt;span class="s2"&gt;&amp;#34;.*/.*-[0-9]{1,4}x[0-9]{1,4}.*\..*&amp;#34;&lt;/span&gt; -exec cp &lt;span class="o"&gt;{}&lt;/span&gt; PATH_TO_HUGO/static/&lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nettoyer-les-caractères-spéciaux-html"&gt;Nettoyer les caractères spéciaux HTML
&lt;/h2&gt;&lt;p&gt;Si vous avez bien lu l&amp;rsquo;exemple de métadonnées exportées que j&amp;rsquo;ai donné, vous aurez peut être remarqué la présence d&amp;rsquo;un caractère spécial encodé &lt;code&gt;&amp;amp;rsquo;&lt;/code&gt; dans le titre.&lt;/p&gt;
&lt;p&gt;Dans une page HTML, ce n&amp;rsquo;est pas grave, mais Hugo lui, ne les interprète pas comme tel dans le markdown. Il faut donc leur faire la chasse et tous les convertir 🤦. Et encore, il faut faire attention, car certains de ces caractères pourraient être légitimement écris en HTML (si vous faite un tuto sur HTML, ce n&amp;rsquo;est pas impossible par exemple)&amp;hellip;&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai pour ma part lancé un gros &lt;code&gt;sed&lt;/code&gt; (une fois de plus) sur tous mes articles mais prudence !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;rsquo;/’/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#8211;/--/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#8230;/.../g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;gt;/&amp;gt;/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;lt;/&amp;lt;/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#8212;/-/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#8217;/&amp;#39;/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#215;/×/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je n&amp;rsquo;ai pas osé modifier les caractères suivants, très souvent présents dans les URLs :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;amp;#038
&amp;amp;#039
&amp;amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mais c&amp;rsquo;est quand même une bonne idée de faire une grosse recherche avec votre éditeur de texte favori pour voir s&amp;rsquo;il ne reste pas des &lt;code&gt;&amp;amp;#&lt;/code&gt; qui traînent dans votre contenu.&lt;/p&gt;
&lt;h2 id="html-désactivé"&gt;HTML désactivé
&lt;/h2&gt;&lt;p&gt;Au delà des caractères spéciaux, il arrive aussi que l&amp;rsquo;exporter est un peu de mal avec les différents types d&amp;rsquo;éditeurs que Wordpress a pu avoir au fil du temps.&lt;/p&gt;
&lt;p&gt;Typiquement, beaucoup du contenu &amp;ldquo;non texte&amp;rdquo; que j&amp;rsquo;ai ajouté au fil des années s&amp;rsquo;est retrouvé non converti par ce que j&amp;rsquo;ai rédigé s&amp;rsquo;est retrouvé exporté tel quel, en HTML brut inséré dans mon markdown.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est hyper traître car Hugo ne renvoie aucune erreur. Il manque &amp;ldquo;juste&amp;rdquo; des bouts ! On peut les retrouver en allant voir le code source de la page, qui affiche alors les commentaires HTML suivants :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- raw HTML omitted --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En attendant de nettoyer tout ça à grand coup de &lt;code&gt;sed&lt;/code&gt;, on peut résoudre une partie des problèmes en &amp;ldquo;réactivant le support du code HTML dans le markdown dans votre &lt;code&gt;config.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;goldmark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;## Set to true if you have HTML content inside Markdown&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;unsafe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ca permet de sauver les meubles mais ce n&amp;rsquo;est pas suffisant&amp;hellip;&lt;/p&gt;
&lt;h2 id="markdown-hates-html"&gt;Markdown hates HTML
&lt;/h2&gt;&lt;p&gt;Même comme ça, on grosse partie du HTML sera HS&amp;hellip; Tous les tableaux (table/tr/td) et listes (ul/li) HTML sont pétés car l&amp;rsquo;exporter laisse des sauts de lignes entre les blocs, que le markdown interprète mal. Il faudra supprimer tous les sauts de lignes en trop (ou réécrire en markdown)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;table class=&amp;#34;Content&amp;#34; border=&amp;#34;0&amp;#34; width=&amp;#34;750&amp;#34;&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td class=&amp;#34;LargeBold&amp;#34;&amp;gt;
SEND_CUSTOM_SVC_NOTIFICATION
&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td class=&amp;#34;MediumBold&amp;#34;&amp;gt;
Command Format:
&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sachez également que toutes les &amp;ldquo;videos embedded&amp;rdquo; Youtube disparaîtront purement et simplement, et que pour les tweets, vous aurez une version très moche du tweet, sans l&amp;rsquo;image&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;blockquote&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;twitter-tweet&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;550&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;en&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-dnt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-partner&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;jetpack&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fr&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ltr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [[#SAPHANA](ht tps://tw itter.com/hashtag/SAPHANA?src=hash&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;ref_src=twsrc%5Etfw)] Finies les mises à jour incompatibles avec votre plateforme, optez pour la simplicité et la tranquillité, chez SAP : on collecte, on connecte, ça marche : [t.co/2AdCCEQ97L](https://t.c o/2AdCCEQ97L) [pic.twi tter.com/yy7moMnZmC](ht tps://t.c o/yy7moMnZmC)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- SAP France (@SAPFrance)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [October 8, 2018](ht tps://twiter.com/SAPFrance/status/1049286253533962241?ref_src=twsrc%5Etfw)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;blockquote&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;J&amp;rsquo;en avais peu heureusement, j&amp;rsquo;ai donc pris des captures d&amp;rsquo;écran et ajouté des liens.&lt;/p&gt;
&lt;h2 id="balises-de-code-pre-etc"&gt;Balises de code, pre, etc.
&lt;/h2&gt;&lt;p&gt;Une autre grosse catégorie de code &amp;ldquo;mal exporté&amp;rdquo; est le &amp;ldquo;code&amp;rdquo;. Je donne souvent des bouts de scripts ou de code ou tout simplement des commandes à passer sur des serveurs. Et au fil des années, j&amp;rsquo;ai (&amp;amp; wordpress) changé plusieurs fois la façon d&amp;rsquo;afficher du code dans mes articles.&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;abord avec des balises HTML &lt;code&gt;&amp;lt;pre&amp;gt;&amp;lt;/pre&amp;gt;&lt;/code&gt;, puis des balises &lt;code&gt;&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;/code&gt;, puis via des extensions (pour avoir la coloration syntaxique), puis via du markdown via Jetpack, puis de nouveau via les extensions&amp;hellip;&lt;/p&gt;
&lt;p&gt;Autant dire que le HTML généré par Wordpress ne ressemble à rien&amp;hellip;&lt;/p&gt;
&lt;p&gt;Il a fallut faire un gros gros boulot pour détecter toutes les balises de code ouvrantes et fermantes pour les convertir en ``` de markdown&amp;hellip;&lt;/p&gt;
&lt;p&gt;Quelques exemples que j&amp;rsquo;ai rencontré :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;brush: plain; title: ; notranslate&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;brush: perl; collapse: false; title: ; wrap-lines: false; notranslate&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;EnlighterJSRAW&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-enlighter-language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;null&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;EnlighterJSRAW&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-enlighter-language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;generic&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;EnlighterJSRAW&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-enlighter-language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;generic&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-enlighter-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;... et bien d&amp;#39;autres encore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="final-words"&gt;Final words
&lt;/h2&gt;&lt;p&gt;Je m&amp;rsquo;arrête là car l&amp;rsquo;article est déjà très long, mais il y a eu d&amp;rsquo;autres petits problèmes du même style, plus sporadiques&amp;hellip;&lt;/p&gt;
&lt;p&gt;Vous voyez donc qu&amp;rsquo;exporter le blog sur Hugo n&amp;rsquo;aura pas été de tout repos, dans mon cas. Et encore ! Je n&amp;rsquo;ai pas exporté les commentaires historiques (plus de 1600) !&lt;/p&gt;
&lt;p&gt;Cependant, si vous avez un blog plus petit que celui ci, vous devriez avoir moins de mal et les conseils que je donne ici devraient vous permettre de régler rapidement 90% des problèmes.&lt;/p&gt;
&lt;p&gt;Enjoy !&lt;/p&gt;</description></item><item><title>J'ai enfin migré de Wordpress vers Hugo - partie 1</title><link>https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/</link><pubDate>Mon, 22 Nov 2021 08:00:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/11/wordpress-to-hugo.webp" alt="Featured image of post J'ai enfin migré de Wordpress vers Hugo - partie 1" /&gt;&lt;p&gt;Cette article fait partie d&amp;rsquo;une suite d&amp;rsquo;articles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/" &gt;J&amp;rsquo;ai enfin migré de Wordpress vers Hugo - partie 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/11/29/jai-enfin-migre-de-wordpress-a-hugo-partie-2/" &gt;J&amp;rsquo;ai enfin migré de Wordpress vers Hugo - partie 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="plus-de-2-ans-et-demi"&gt;Plus de 2 ans et demi
&lt;/h2&gt;&lt;p&gt;Ca fait plus de 2 ans et demi que je râle que j&amp;rsquo;en ai ma claque de Wordpress.&lt;/p&gt;
&lt;p&gt;Stack LEMP à maintenir, perfs bof (j&amp;rsquo;ai du mettre un cache pour passer sous la seconde, wtf&amp;hellip;), plugins aux MAJs hasardeuses, failles de sécu, pas de support propre du markdown, éditeur à ch*** (Gutenberg, je te hais), &amp;hellip; you name it.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/tweet_mieuxavant.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Après 12 ans de blogging, il était temps de faire l&amp;rsquo;effort et de quitter Wordpress pour quelque chose qui me convient mieux : un moteur de blog statique (rien de dynamique dans ce que je poste) en markdown (parce que de toute façon c&amp;rsquo;est comme ça que j&amp;rsquo;écris mes articles à la base). Le tout dans git pour historiser tout ça.&lt;/p&gt;
&lt;p&gt;Et j&amp;rsquo;ai choisi Hugo pour des raisons que &lt;a class="link" href="https://blog.zwindler.fr/2019/06/10/comment-migrer-de-wordpress-a-hugo/" &gt;je détaille dans l&amp;rsquo;article 2019 &amp;ldquo;Comment migrer de Wordpress à Hugo&amp;rdquo; si ça vous intéresse&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="forcément-cest-pas-si-facile"&gt;Forcément, c&amp;rsquo;est pas si facile
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;en parlais déjà dans l&amp;rsquo;article de 2019 : migrer de Wordpress à Hugo, forcément ce n&amp;rsquo;est pas si facile. D&amp;rsquo;ailleurs, j&amp;rsquo;avais même abandonné l&amp;rsquo;idée devant l&amp;rsquo;ampleur da tâche !&lt;/p&gt;
&lt;p&gt;Ce n&amp;rsquo;est pas tant la partie technique (installation de Hugo, export du blog existant) le problème. En quelques minutes, on a un blog fonctionnel, l&amp;rsquo;export prend guère plus de temps. Rajouter l&amp;rsquo;outillage pour automatiser certaines tâches prend un peu de temps mais rien d&amp;rsquo;incroyable.&lt;/p&gt;
&lt;p&gt;Mon problème était plutôt que je voulais obtenir au moins aussi bien que ce que j&amp;rsquo;avais avant, existant inclus.&lt;/p&gt;
&lt;p&gt;Et c&amp;rsquo;est là que le bat blesse : wordpress, avec mes 12 ans (350 articles) d&amp;rsquo;historique, c&amp;rsquo;est au fil des années 15 façons différentes d&amp;rsquo;afficher du HTML&amp;hellip; que le plugin d&amp;rsquo;export gère comme il peut ! Nous y reviendrons.&lt;/p&gt;
&lt;p&gt;Je vais donc vous guider un peu sur la partie technique, puis j&amp;rsquo;aborderai ensuite les points pénibles du nettoyage du markdown, qui m&amp;rsquo;a pris un bonne partie de mes vacances (plusieurs journées à ~2-3 heures par jour). Il y aura aussi, plus tard, des articles sur l&amp;rsquo;outillage à mettre en place pour se faciliter la vie au quotidien.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;installation en elle même est triviale. On a un binaire compilé en go packagé dans un &lt;strong&gt;.deb&lt;/strong&gt; (ou les sources si vous voulez le builder vous même) disponible sur github. Fin.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0.88.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/gohugoio/hugo/releases/download/v&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/hugo_&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;_Linux-64bit.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ou https://github.com/gohugoio/hugo/releases/download/v${VER}/hugo_extended_${VER}_Linux-64bit.deb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ./hugo*_0.88.1_Linux-64bit.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A noter que dans mon cas, je n&amp;rsquo;ai pas téléchargé la version ci dessus, mais la version &amp;ldquo;extended&amp;rdquo;, nécessaire pour le thème que j&amp;rsquo;ai choisi, mais le principe est le même.&lt;/p&gt;
&lt;h2 id="initialisation-du-site-et-du-dépôt-git"&gt;Initialisation du site et du dépôt git
&lt;/h2&gt;&lt;p&gt;Hugo est maintenant disponible sur votre machine.&lt;/p&gt;
&lt;p&gt;A partir de là, je vous invite fortement à versionner tout ce que vous allez faire avec votre blog. C&amp;rsquo;est bien entendu optionnel mais pourquoi se priver de toute la puissance du couple markdown + git ?&lt;/p&gt;
&lt;p&gt;On commence par créer un dossier puis on génère un squelette de site vierge avec &lt;code&gt;hugo new site&lt;/code&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir hugo &amp;amp;&amp;amp; cd hugo
hugo new site toto
Congratulations! Your new Hugo site is created in toto.
Just a few more steps and you&amp;#39;re ready to go:
1. Download a theme into the same-named folder.
Choose a theme from https://themes.gohugo.io/ or
create your own with the &amp;#34;hugo new theme &amp;lt;THEMENAME&amp;gt;&amp;#34; command.
2. Perhaps you want to add some content. You can add single files
with &amp;#34;hugo new &amp;lt;SECTIONNAME&amp;gt;/&amp;lt;FILENAME&amp;gt;.&amp;lt;FORMAT&amp;gt;&amp;#34;.
3. Start the built-in live server via &amp;#34;hugo server&amp;#34;.
Visit https://gohugo.io/ for quickstart guide and full documentation.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, on va pouvoir initialiser notre dépôt git&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; toto
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bon, si jamais vous lancez la génération du blog avec simplement la commande de preview &lt;code&gt;hugo server&lt;/code&gt;, vous allez être assez déçus, ça donne une page blanche. Mais, ça marche !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Start building sites …
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo v0.88.1-5BC54738+extended linux/amd64 &lt;span class="nv"&gt;BuildDate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2021-09-04T09:39:19Z &lt;span class="nv"&gt;VendorInfo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gohugoio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARN 2021/11/14 06:57:47 found no layout file &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; kind &lt;span class="s2"&gt;&amp;#34;taxonomy&amp;#34;&lt;/span&gt;: You should create a template file which matches Hugo Layouts Lookup Rules &lt;span class="k"&gt;for&lt;/span&gt; this combination.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARN 2021/11/14 06:57:47 found no layout file &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; kind &lt;span class="s2"&gt;&amp;#34;home&amp;#34;&lt;/span&gt;: You should create a template file which matches Hugo Layouts Lookup Rules &lt;span class="k"&gt;for&lt;/span&gt; this combination.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARN 2021/11/14 06:57:47 found no layout file &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; kind &lt;span class="s2"&gt;&amp;#34;taxonomy&amp;#34;&lt;/span&gt;: You should create a template file which matches Hugo Layouts Lookup Rules &lt;span class="k"&gt;for&lt;/span&gt; this combination.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; EN
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-------------------+-----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Pages &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Paginator pages &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Non-page files &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Static files &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Processed images &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Aliases &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Sitemaps &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Cleaned &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Built in &lt;span class="m"&gt;1&lt;/span&gt; ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Watching &lt;span class="k"&gt;for&lt;/span&gt; changes in /toto/&lt;span class="o"&gt;{&lt;/span&gt;archetypes,content,data,layouts,static&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Watching &lt;span class="k"&gt;for&lt;/span&gt; config changes in /toto/config.toml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Environment: &lt;span class="s2"&gt;&amp;#34;development&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Serving pages from memory
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Web Server is available at http://localhost:1313/ &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt; address 127.0.0.1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Press Ctrl+C to stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ajout-dun-thème"&gt;Ajout d&amp;rsquo;un thème
&lt;/h2&gt;&lt;p&gt;Avant même de commencer à ajouter du contenu, il est probable que vous allez vouloir choisir un thème. Il existe une liste de thèmes, plus fournie qu&amp;rsquo;en 2019, &lt;a class="link" href="https://themes.gohugo.io/" target="_blank" rel="noopener"
&gt;disponible ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une fois le thème choisi, on va l&amp;rsquo;ajouter au site à l&amp;rsquo;aide de la (très utile) commande git &lt;code&gt;git submodule&lt;/code&gt; qui va nous permettre de gérer notre thème et ses mises à jour avec git sans pour autant commiter tous les fichiers.&lt;/p&gt;
&lt;p&gt;Dans mon cas j&amp;rsquo;ai choisi le thème &amp;ldquo;stack&amp;rdquo; mais le principe est grosso modo le même pour tous (à quelques détails d&amp;rsquo;implémentation près) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; themes/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule add https://github.com/CaiJimmy/hugo-theme-stack.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="avant-le-premier-article-"&gt;Avant le premier article !
&lt;/h2&gt;&lt;p&gt;Si on veut bosser un peu proprement, on va vouloir éviter de commiter n&amp;rsquo;importe quoi. Comme hugo est un générateur de blog statique, on va bien entendu éviter de commiter le code statique généré par la commande &lt;code&gt;hugo&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On utilise simplement un fichier &lt;strong&gt;.gitignore&lt;/strong&gt; à la racine du projet pour ignorer tout ce qui est technique ou qui n&amp;rsquo;est pas du code :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; .gitignore &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;themes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;resources/_gen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;assets/jsconfig.json
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;public
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On va aussi vouloir paramétrer a minima notre site. Vous aurez peut être remarqué qu&amp;rsquo;il existe un fichier &lt;code&gt;config.toml&lt;/code&gt; généré par défaut par la commande &lt;code&gt;hugo new site&lt;/code&gt;. Il s&amp;rsquo;agit de &amp;ldquo;l&amp;rsquo;ancienne&amp;rdquo; manière de faire de la configuration Hugo, mais surtout d&amp;rsquo;un fichier agnostique du thème utilisée. Généralement, il vaut mieux le supprimer et repartir du fichier d&amp;rsquo;exemple inclus avec votre thème.&lt;/p&gt;
&lt;p&gt;Dans mon cas, il s&amp;rsquo;agit du fichier &lt;strong&gt;theme/hugo-theme-stack/config.yaml&lt;/strong&gt; que j&amp;rsquo;ai donc copié à la racine du projet et modifié pour correspondre à mon site et mes besoins.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;baseurl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://blog.zwindler.fr&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;languageCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;fr-fr&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;hugo-theme-stack&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Zwindler&amp;#39;s Reflection&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;...]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="le-premier-commit"&gt;Le premier commit
&lt;/h2&gt;&lt;p&gt;C&amp;rsquo;est un petit moment agréable dans n&amp;rsquo;importe quel projet informatique. Le premier commit.&lt;/p&gt;
&lt;p&gt;Bon moi, comme j&amp;rsquo;ai hébergé le dépôt sur Github et qu&amp;rsquo;ils ont décidé de renommer &lt;strong&gt;master&lt;/strong&gt; en &lt;strong&gt;main&lt;/strong&gt; dans le nom de la branche par défaut on a un peu de gymnastique à faire, mais pourquoi pas.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;first commit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git branch -M main
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote add origin git@github.com:zwindler/example.org.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push -u origin main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le &amp;ldquo;code&amp;rdquo; de notre (absence de) blog est publié Internet :)&lt;/p&gt;
&lt;h2 id="et-en-prod-"&gt;Et en prod ?
&lt;/h2&gt;&lt;p&gt;Vous pouvez donc commencer à écrire (dans &lt;strong&gt;content/post&lt;/strong&gt;), tester votre blog en local, puis pousser le code sur git. Mais si jamais vous voulez héberger votre site ailleurs que sur votre laptop (et je parie que c&amp;rsquo;est le cas) ?&lt;/p&gt;
&lt;p&gt;Et bien c&amp;rsquo;est là où c&amp;rsquo;est chouette d&amp;rsquo;utiliser git et un dépôt accessible depuis Internet. Vous n&amp;rsquo;avez qu&amp;rsquo;à reproduire l&amp;rsquo;installation de hugo, ajouter votre dépôt, initialiser les submodules (notre thème) et le tour est joué !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0.88.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/gohugoio/hugo/releases/download/v&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/hugo_&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;_Linux-64bit.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ou https://github.com/gohugoio/hugo/releases/download/v${VER}/hugo_extended_${VER}_Linux-64bit.deb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ./hugo*_0.88.1_Linux-64bit.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/zwindler/toto.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Normalement, le site devrait se générer, comme en local. Si vous n&amp;rsquo;avez pas d&amp;rsquo;historique à migrer, comme moi, vous êtes donc l&amp;rsquo;heureux propriétaire d&amp;rsquo;un blog statique fonctionnel :-). La classe !&lt;/p&gt;
&lt;p&gt;Sinon, dans le prochain article, j&amp;rsquo;aborderai un plus gros morceau, à savoir l&amp;rsquo;export et le nettoyage du markdown depuis un Wordpress existant.&lt;/p&gt;</description></item><item><title>Migration CentOS + KVM vers Proxmox VE</title><link>https://blog.zwindler.fr/2015/11/21/migration-centos-kvm-vers-proxmox/</link><pubDate>Sat, 21 Nov 2015 11:30:53 +0000</pubDate><guid>https://blog.zwindler.fr/2015/11/21/migration-centos-kvm-vers-proxmox/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/10/Logo-ProxmoxVE.webp" alt="Featured image of post Migration CentOS + KVM vers Proxmox VE" /&gt;&lt;p&gt;Juste après avoir sorti un article qui traite de la migration de KVM/Ubuntu vers KVM/RHEL, voilà que je migre ENCORE pour ProxMox !?! Mais c’est parce qu’en fait j’avais juste beaucoup de retard sur ces précédents articles ;-).&lt;/p&gt;
&lt;h2 id="présentation-de-la-solution"&gt;Présentation de la solution
&lt;/h2&gt;&lt;p&gt;Cette fois ci, il s’agit donc de vous donner les clés pour migrer sans stress votre serveur sous KVM (Ubuntu, Debian, RHEL, Whatever &amp;hellip;) vers Proxmox VE.&lt;/p&gt;
&lt;p&gt;Pour ceux qui ne connaissent pas Proxmox VE, il s’agit d’une distribution Debian adaptée pour faire de la virtualisation full (qemu/KVM) et par conteneur (anciennement via openVZ, maintenant via LXC). LE gros plus de la solution, c’est l’interface graphique et l’installation clé en main d’un hyperviseur disposant de fonctionnalités qu’on retrouve chez les grands du marché.&lt;/p&gt;
&lt;p&gt;Pour être honnête, j’étais très content de mon KVM pour ce qui est des performances et de la consommation de ressources (point faible d’un ESXi à la maison), mais pas du tout satisfait des manières que j’avais pour l’administrer. J’ai testé plusieurs interfaces graphiques (web ou pas) sans jamais en trouver une à ma convenance (même les usines à gaz comme oVirt, la base de RedHat Entreprise Virtualisation).&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation
&lt;/h2&gt;&lt;p&gt;Comme beaucoup d’hyperviseur clés en main, l’étape d’installation est particulièrement soignée pour être simple et rapide. On récupère un ISO, &lt;a class="link" href="https://pve.proxmox.com/wiki/Install_from_USB_Stick" target="_blank" rel="noopener"
&gt;on le copie sur une clé USB&lt;/a&gt;, on boot dessus. Quelques écrans et moins de 5 minutes plus tard le serveur reboot et on nous invite à nous connecter à la console web.&lt;/p&gt;
&lt;p&gt;Ah ! Ça fait du bien !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/10/02_proxmox_kvm.avif"
loading="lazy"
alt="L’interface Web, bien qu’un peu austère, est relativement intuitive. On ne trouve pas tous les menus du premiers coup, mais on s’habitue vite"
&gt;&lt;/p&gt;
&lt;p&gt;La première chose à faire est de créer des pools de stockages (un &lt;em&gt;local&lt;/em&gt; est créé par défaut). On peut choisir s’il s’agit d’un pool dédié aux VMs, à la sauvegarde, aux fichiers ISOs. C’est assez pratique.&lt;/p&gt;
&lt;h2 id="raid-logiciel-mdadm"&gt;RAID logiciel MDADM
&lt;/h2&gt;&lt;p&gt;Sous ProxMox, le RAID logiciel via MDADM Linux &lt;strong&gt;n’est pas supporté&lt;/strong&gt; (voir &lt;a class="link" href="https://pve.proxmox.com/wiki/Software_RAID" target="_blank" rel="noopener"
&gt;wiki officiel&lt;/a&gt;). Seuls les RAID Hardware sont supportés.&lt;/p&gt;
&lt;p&gt;Dans l’interface, vous ne pourrez donc pas le configurer (ni même pendant la phase d’installation). Depuis la version 3.4, vous pouvez cependant installer ProxMox sur un espace ZFS, avec notamment tous les niveaux de RAID/RAIDZ que vous souhaitez. Mais mon petit doigt me dit qu’il s’agit probablement de &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=zfsonlinux" &gt;ZFSonLinux&lt;/a&gt; et j’ai déjà donné ;-).&lt;/p&gt;
&lt;p&gt;Cette absence de RAID logiciel est une des raisons pour lesquels j’étais initialement réfractaire à ProxMox par rapport à un linux classique avec qemu. Cependant, ce n’est pas parce ce n’est pas supporté que vous ne pouvez pas le faire ! Après tout, il s’agit d’une Debian customisée donc il n’y a rien qui vous retient.&lt;/p&gt;
&lt;p&gt;Voici deux articles que j’ai sélectionnés qui vous guideront pas à pas pour le faire (à vos risques et périls, comme d’habitude).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://www.mbardot.com/installation-de-proxmox-ve-en-raid1-logiciel/" target="_blank" rel="noopener"
&gt;www.mbardot.com/installation-de-proxmox-ve-en-raid1-logiciel/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://kbdone.com/proxmox-ve-3-2-software-raid/" target="_blank" rel="noopener"
&gt;kbdone.com/proxmox-ve-3-2-software-raid/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[Edit]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt; : la partie amorçage ne fonctionnera pas si vous avez un boot EFI (Proxmox 4+). Il faudra trouver une autre technique. Vous pouvez lire cet article qui explique comment  faire en général sur Debian :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.debian-fr.org/t/raid-logiciel-linux-et-amorcage-en-uefi/64655" target="_blank" rel="noopener"
&gt;www.debian-fr.org/t/raid-logiciel-linux-et-amorcage-en-uefi/64655&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La partie du tutoriel traitant de lvm pour ProxMox (3ème partition) contenant le / et les données importantes peut par contre bien être suivie. C’est vraiment uniquement le boot EFI qui va nous enquiquiner.&lt;/p&gt;
&lt;p&gt;[/Edit]&lt;/p&gt;
&lt;h2 id="migrer-ses-vm-existantes"&gt;Migrer ses VM existantes
&lt;/h2&gt;&lt;p&gt;Nous voici maintenant dans le vif du sujet. Selon la &lt;a class="link" href="https://pve.proxmox.com/wiki/Migration_of_servers_to_Proxmox_VE#KVM_to_Proxmox_VE_.28KVM.29" target="_blank" rel="noopener"
&gt;documentation officielle&lt;/a&gt;, voici ce qu’on doit faire pour migrer une machine KVM dans ProxMox.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/10/01_proxmox_kvm.avif"
loading="lazy"
alt="Ouais, d’accord… mais un peu plus de détails ? Non ?"
&gt;&lt;/p&gt;
&lt;p&gt;D’abord, on nous dit de créer une nouvelle machine virtuelle. Jusque là tout va bien. On lui affecte les options par défaut et pas de CD-ROM dans le lecteur.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/10/03_proxmox_kvm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/10/04_proxmox_kvm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ensuite ça se gâte. En effet, on veut supprimer le disque dur par défaut puis ajouter notre disque importé de l’ancien système KVM. On va donc dans les propriétés de la machine virtuelle nouvellement créée.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/10/06_proxmox_kvm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/10/07_proxmox_kvm.avif"
loading="lazy"
alt="Mais… Mais… Il est où le bouton « Parcourir »?"
&gt;&lt;/p&gt;
&lt;p&gt;Et là, blague&amp;hellip; Pas de bouton « Parcourir » pour aller chercher notre disque virtuel à importer !&lt;/p&gt;
&lt;p&gt;On peut trouver la solution assez vite sur les forums, mais c’est quand même assez frustrant, surtout quand on voit la malheureuse ligne donnée dans le wiki en guise de procédure&amp;hellip;&lt;/p&gt;
&lt;p&gt;Dans &lt;a class="link" href="http://forum.proxmox.com/threads/4227-How-to-add-existing-disk" target="_blank" rel="noopener"
&gt;ce thread&lt;/a&gt; et &lt;a class="link" href="http://serverfault.com/questions/441310/proxmox-uploading-disk-image" target="_blank" rel="noopener"
&gt;ce thread&lt;/a&gt;, on apprend que pour chaque banque de données, chaque VM dispose d’un dossier dans lequel il faut déposer le disque. Dans &lt;strong&gt;le bon&lt;/strong&gt; dossier ! Par exemple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pour le stockage local, la VM avec l’id &lt;em&gt;100&lt;/em&gt; a un dossier &lt;strong&gt;/var/lib/vz/images/100/&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;pour le stockage NFS nommé de manière originale &lt;strong&gt;NFS_VM&lt;/strong&gt;, il y a un dossier &lt;strong&gt;/mnt/pve/NFS_VM/images&lt;/strong&gt; avec des sous dossiers pour chaque VM qui dispose d’un disque sur ce partage NFS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A partir de là, on copie donc nos fichiers dans les bons dossiers en fonction de ce qu’on veut faire. Dans le cas présent je copie les fichiers sur le stockage local, dans un premier temps.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cp MaVM.qcow2 /var/lib/vz/images/100/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois que c’est fait, les disques apparaissent dans la page spécifique de la banque de données.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/10/08_proxmox_kvm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Mais le disque virtuel n’apparaît toujours pas dans la machine virtuelle. Il faut aller éditer à la main le fichier de configuration de la VM, situé dans &lt;strong&gt;/etc/pve/nodes/xxx/qemu-server/[VMID].conf&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/pve/nodes/xxx/qemu-server/100.conf
bootdisk: ide0;
cores: 2
ide2: none,media=cdrom
memory: 1024
name: bck-xxx-xxx
net0: e1000=7A:FA:D6:DC:06:70,bridge=vmbr0
numa: 0
ostype: l26
smbios1: uuid=ae5d66d6-724f-46cd-a85b-24eda7b9ecec
sockets: 1
ide0: local:100/xxx-xxx-flat.vmdk
ide1: local:100/xxx-xxx_1-flat.vmdk
unused0: local:100/vm-100-disk-1.vmdk
unused1: local:100/vm-100-disk-2.qcow2,size=32G
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, les disques apparaissent dans la VM au niveau de ide0 et ide1 dans mon cas. On progresse.&lt;/p&gt;
&lt;h3 id="cas-des-disques-qcow2"&gt;Cas des disques QCOW2
&lt;/h3&gt;&lt;p&gt;Dans le cas des disques QCOW2 (et les QCOW2 uniquement, pas les RAW), il sera nécessaire d’ajouter également un argument « taille » du disque, sans quoi la VM peut ne pas démarrer. Il faudra rajouter &lt;strong&gt;en fin de ligne&lt;/strong&gt; la taille du disque (&lt;strong&gt;xxx,size=yyG&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Astuce : si vous ne la connaissez pas, supprimez le disque de la VM (qui passera en inutilisé), puis éditer le (edit) pour l’ajouter à nouveau. Le fichier de configuration devrait se recréer avec les bonnes options automatiquement.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/10/09_proxmox_kvm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h3 id="cas-des-disques-raw"&gt;Cas des disques RAW
&lt;/h3&gt;&lt;p&gt;A l’inverse, la taille du disque en argument dans la configuration d’une VM pour une image RAW ne semble pas nécessaire.&lt;/p&gt;
&lt;p&gt;Par contre, pour les disques raw, il faut savoir qu’il faut ABSOLUMENT les nommer en « .raw » pour qu’ils soient visibles dans la liste des disques (mes disques provenant de KVM étaient nommés par défaut en « .img »).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/10/local.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Si vous ne les renommez pas, les disques seront présents dans la VM, mais elle refusera de démarrer avec l’erreur suivante :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;unable to parse volume filename&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il faudra prendre soin de tous les renommer, puis de modifier la configuration de la machine virtuelle en tenant compte de cette modification.&lt;/p&gt;</description></item><item><title>Migration KVM Ubuntu vers Redhat et problème /usr/libexec/qemu-kvm: No such file or directory</title><link>https://blog.zwindler.fr/2015/10/04/migration-kvm-ubuntu-vers-redhat-et-probleme-usrlibexecqemu-kvm-no-such-file-or-directory/</link><pubDate>Sun, 04 Oct 2015 19:20:58 +0000</pubDate><guid>https://blog.zwindler.fr/2015/10/04/migration-kvm-ubuntu-vers-redhat-et-probleme-usrlibexecqemu-kvm-no-such-file-or-directory/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/10/kvm.webp" alt="Featured image of post Migration KVM Ubuntu vers Redhat et problème /usr/libexec/qemu-kvm: No such file or directory" /&gt;&lt;p&gt;Je suis en train de migrer de KVM vers ProxMox. Et du coup, je ressors de mes tiroirs tous les articles que je n’ai pas &lt;del&gt;eu&lt;/del&gt; pris le temps d’écrire à propos des problèmes que j’ai pu rencontrer, notamment lors de ma migration VMware ESXi vers KVM/Uubuntu puis KVM/Ubuntu vers KVM/CentOS.&lt;/p&gt;
&lt;h2 id="processsu-de-migration-à-froid"&gt;Processsu de migration (à froid)
&lt;/h2&gt;&lt;p&gt;On pourrait penser que migrer une machine virtuelle KVM Ubuntu vers une machine virtuelle KVM sous RHEL/CentOS ne pose pas de problème particulier puisqu’il s’agit d’une même technologie : qemu. Et pourtant !&lt;/p&gt;
&lt;p&gt;Lorsque j’ai voulu passer sous CentOS pour des questions d’habitude d’administration (et aussi parce que la philosophie RHEL me plait plus que celle d’Ubuntu), je me suis rendu compte que ça n’est pas tout à fait vrai.&lt;/p&gt;
&lt;p&gt;Voici la procédure que j’ai suivi pour migrer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;copie de mes machines virtuelle sur un volume séparé, ainsi que dump de leur fichiers de configuration&lt;/li&gt;
&lt;li&gt;réinstallation &lt;em&gt;from scratch&lt;/em&gt; de l’OS de l’hyperviseur, j’en ai profité pour passer sur un OS installé en RAID1 pour plus de sécurité&lt;/li&gt;
&lt;li&gt;récupération des machines virtuelles et réimport de leur configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour ceux qui ne sont pas familier avec l’import/export de configuration de machines virtuelles via virsh, voici un petit aparté sur la marche à suivre :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;virsh list #affiche la liste des machines virtuelles actives sur le serveur
virsh list --all #affiche toutes les VMs enregistrés sur l&amp;#39;hôte, même celles inactives
virsh dumpxml GuestID &amp;gt; guest.xml #dump XML du fichier de configuration pour sauvegarde ou import futur
virsh define guest.xml #réimporter le fichier de configuration XML (sans démarrer la VM à la suite)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="en-cas-derreur-no-such-file-or-directory-lors-de-limport"&gt;En cas d’erreur &lt;em&gt;No such file or directory&lt;/em&gt; lors de l’import
&lt;/h2&gt;&lt;p&gt;Lors qu’on importe la machine virtuelle, on peut avoir l’erreur suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;virsh define MaVM.xml
error: Failed to define domain from MaVM.xml
error: Cannot find QEMU binary /usr/bin/kvm: No such file or directory
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La première chose à vérifier bien entendu est que tous les packages sont bien installés mais dans mon cas c’était bien le cas (le package qemu contenant l’émulateur KVM était bien installé).&lt;/p&gt;
&lt;p&gt;Sur Ubuntu, l’émulateur est stocké dans le binaire &lt;strong&gt;/usr/bin/kvm&lt;/strong&gt;. A l’inverse, sur RHEL ou CentOS, il n’est pas situé dans le même dossier, et ne s’appelle même pas &lt;strong&gt;kvm&lt;/strong&gt; mais &lt;strong&gt;/usr/libexec/qemu-kvm&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;On doit donc passer sur chaque fichier XML de configuration de machine virtuelle pour modifier le chemin vers le binaire. On en profitera également pour mettre à jour le chemin vers le disque dur virtuel si jamais l’arborescence de stockage n’est pas la même entre les deux serveurs.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vim MaVM.xml
&amp;lt;emulator&amp;gt;/usr/bin/kvm&amp;lt;/emulator&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, vous pouvez importer correctement vos VMs et les démarrer !&lt;/p&gt;
&lt;h2 id="pour-aller-plus-loin"&gt;Pour aller plus loin
&lt;/h2&gt;&lt;p&gt;A noter, par défaut sous RHEL/CentOS les fichiers sont répartis de la façon suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/etc/libvirt/qemu/ pour tous les fichiers de configuration VM, storage, etc.&lt;/li&gt;
&lt;li&gt;/var/log/libvirt/qemu/ pour les fichiers journaux des machines virtuelles&lt;/li&gt;
&lt;li&gt;/var/run/libvirt/qemu/ contient les fichiers de fonctionnement de la machine, à avoir le .pid pour stocker le PID du process maitre de ma VM, ainsi qu’un fichier XML contenant une copie de la configuration de la VM en fonctionnement&lt;/li&gt;
&lt;li&gt;/var/lib/libvirt/qemu/ contient des fichiers permettant de suivre les performances de la VM, de stocker les éventuels dump/snapshots/sauvegardes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un peu de documentation clairement expliquée sur l’utilisation de virsh sur la communauté Ubuntu : &lt;a class="link" href="https://help.ubuntu.com/community/KVM/Virsh" target="_blank" rel="noopener"
&gt;Virsh&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Et pour aller plus loin dans le Troubleshooting, voici &lt;a class="link" href="https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/sect-Troubleshooting-Common_libvirt_errors_and_troubleshooting.html" target="_blank" rel="noopener"
&gt;un guide de RedHat listant les erreurs courantes avec Qemu/KVM&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>[Tutoriel] Migrer facilement son blog de WordPress.com vers un hébergement mutualisé OVH</title><link>https://blog.zwindler.fr/2015/04/11/tutoriel-migrer-facilement-son-blog-de-wordpress-com-vers-un-hebergement-mutualise-ovh/</link><pubDate>Sat, 11 Apr 2015 21:23:20 +0000</pubDate><guid>https://blog.zwindler.fr/2015/04/11/tutoriel-migrer-facilement-son-blog-de-wordpress-com-vers-un-hebergement-mutualise-ovh/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/04/10_manager.webp" alt="Featured image of post [Tutoriel] Migrer facilement son blog de WordPress.com vers un hébergement mutualisé OVH" /&gt;&lt;p&gt;Petit aparté avant le début de ce tutoriel, je rédige le premier article de mon blog géré par moi même (hébergé sur OVH). Ce matin même, j’étais encore hébergé en tant que blog gratuit chez WordPress.com. J’ai décidé de sauter le pas cars je trouvais le compte wordpress.com trop bridé, notamment au niveau de la limite pour les médias et l’impossibilité d’ajouter de plugins ou de toucher au CSS sans devoir mettre la main au porte monnaie.&lt;/p&gt;
&lt;p&gt;Et puis bon&amp;hellip; cela fait plus sens de gérer moi même mon blog sachant que je passe mon temps à bidouiller sur mes OS et que j’administre tout à la maison ;-)&lt;/p&gt;
&lt;p&gt;Ce n’est pas pour faire de la pub pour OVH, mais il faut reconnaître que leurs offres « premier prix » sont vraiment bon marché. Entre 2 et 5€ par mois, on peut avoir un hébergement « web » en mutualisé, un VPS, voire même un serveur physique dédié (kimsufi en Atom, mais quand même!). Imbattable (enfin, allez quand même vérifier, hein?).&lt;/p&gt;
&lt;p&gt;Si vous êtes sur ce tuto, c’est probablement que vous voulez que la migration se passe le plus simplement possible. Du coup, même si les trois options que je cite sont toutes viable, la plus simple est quand même à mon avis est d’ouvrir un compte pour de l’hébergement mutualisé, qui bénéficie chez OVH d’un module « 1-clic » dédié à WordPress.&lt;/p&gt;
&lt;p&gt;En réalité, il y a un peu plus d’un clic pour réussir votre migration. Je vais vous guider.&lt;/p&gt;
&lt;h2 id="création-de-linstance-de-base-de-données-pour-wordpress"&gt;Création de l’instance de base de données pour WordPress
&lt;/h2&gt;&lt;p&gt;La première chose à faire est de se connecter sur votre Manager OVH, de sélectionner votre nouvel hébergement mutualisé.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/01_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;La partie hébergement mutualisé se gère dans la partie « Plateforme » sous les noms de domaine.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/02_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;OVH a beau proposer des module « 1-click » pour installer WordPress, en réalité il faut quand même d’abord commencer par créer l’instance de base de données pour stocker le tout.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/03_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans l’offre d’éhbergement la moins chère d’OVH, on dispose d’une instance de 200 Mo, avec au choix MySQL ou PostgreSQL. C’est largmeent suffisant pour un blog, même avec beaucoup d’articles, car les médias (photos, vidéos) ne sont pas stockées en base.&lt;br&gt;
Professionnellement parlant, je préfère PostgreSQL, mais pour pouvoir utiliser le module 1-click de votre hébergement, il faut donc &lt;strong&gt;absolument&lt;/strong&gt; créer une instance de type &lt;strong&gt;MySQL&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/04_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/05_manager1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois la création de la base de données validée, le message suivant s’affiche.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/06_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On doit également avoir la ligne suivante dans les Tâches en cours.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/07_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Comme toutes les opérations chez OVH, ce n’est pas immédiatement opérationnel, il faut attendre quelques secondes voire quelques minutes selon l’opération. Une fois que c’est terminé, on peut procéder à l’installation de WordPress à proprement parler.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/08_manager1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="déploiement-du-nouveau-wordpress"&gt;Déploiement du nouveau WordPress
&lt;/h2&gt;&lt;p&gt;Ouvrir l’onglet « Modules en 1 clic » et cliquer sur Ajouter&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/09_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le processus d’installation est relativement simple à suivre&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/10_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans le cas où la base de données à été mal créée ou n’est pas encore opérationnelle, vous obtiendrez le message suivant en étape 2&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/11_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A l’inverse, si tout est bien paramétré, vous pourrez rentrer les informations de connexion à la base de données de votre compte OVH.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/13_manager1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et voilà le message qui indique que tout s’est bien passé&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/14_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois l&amp;rsquo;email reçu, vous pouvez vous connecter sur votre nouveau WordPress, qui sera vite (mis à par l’utilisateur d’administration et quelques pages d’exemple).&lt;/p&gt;
&lt;h2 id="export-des-données-existantes"&gt;Export des données existantes
&lt;/h2&gt;&lt;p&gt;Pendant que le WordPress est installé par OVH, on peut se connecter sur l’ancien blog et récupérer les données existantes.&lt;/p&gt;
&lt;p&gt;Ce n’est pas la première migration que je fais. J’avais débuté ce blog sur une page perso Free (pendant très peu de temps, encore plus bridé que wordpress à l’époque) et j’avais migré rapidement vers wordpress.com. A l’époque, il faut savoir qu’il n’était pas possible de réaliser la bascule inverse. Quand vous étiez chez WordPress.com, vous étiez ferrés (sauf probablement si vous étiez prêt à payer, j’imagine). Mais aujourd’hui c’est possible et même très simple. Il suffit d’ouvrir les outils dans la partie wp-admin.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/15_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois le menu ouvert, laisser les options par défaut et sauvegarder le fichier XML généré.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/16_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/17_manager.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="prise-en-main-du-nouveau-blog-mise-à-jour-et-création-dun-nouvel-utilisateur"&gt;Prise en main du nouveau blog, mise à jour et création d’un nouvel utilisateur
&lt;/h2&gt;&lt;p&gt;Le temps qu’on réalise cette opération, le site web est probablement installé et vous avez du recevoir l&amp;rsquo;email d’OVH pour vous dire que tout est prêt. Connectez vous sur votre nouveau site.&lt;/p&gt;
&lt;p&gt;La première chose qui saute aux yeux lorsqu’on se connecte pour la première fois, c’st WordPress qui nous indique que la mise à jour vers la dernière version a été faite, mais qu’il reste les extensions à mettre à jour. C’est un bon conseil ;-)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/20_maj.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Par souci de sécurité là encore, je préfère toujours séparer le compte d’administration (déjà créé lors de l’installation) du compte que j’utilise tous les jours.&lt;/p&gt;
&lt;p&gt;Ainsi, ce n’est pas le même compte que j’utilise pour administrer le site (et il n’est pas « visible » car il ne poste jamais) et le compte moins privilégié qui lui poste les articles.&lt;/p&gt;
&lt;p&gt;Je vous conseille de le faire également.&lt;/p&gt;
&lt;h2 id="import-des-données-dans-le-nouveau-wordpress"&gt;Import des données dans le nouveau WordPress
&lt;/h2&gt;&lt;p&gt;Ça y est, le plus urgent a été fait! On peut maintenant réutiliser le fichier XML pour réimporter les pages, les posts, les commentaires.&lt;/p&gt;
&lt;p&gt;Tout ce qui est « média » n’est pas présent dans le fichier XML, mais on pourra tout de même le récupérer grâce à une option lors de l’import. Pratique !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/22_import.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Lorsqu’on tente d’importer, WordPress nous redirige vers le module permettant de le faire. Il faut l’installer et l’activer avant de pouvoir importer notre XML.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/23_import.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/24_import.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ce message indique de l’installation s’est bien passée. &lt;strong&gt;N’oubliez pas&lt;/strong&gt; de cliquer sur « Activer l’extension &amp;amp; lancer l’importateur » !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/25_import.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Récupérer le fichier XML, cocher l’option « Download and import file attachments » si vous voulez récupérer les fichiers « Média » présents sur vos pas (typiquement, toutes les photos, images, vidéos, &amp;hellip; que vous avez importé et intégré à votre blog sur WordPress.com).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2015/04/26_import.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dernière astuce, dans cette même page vous pouvez également indiquer à WordPress de changer l’auteur des posts au moment de l’import. Même si c’est modifiable après coup, c’est très pratique si vous ne voulez pas que l’auteur de TOUS les posts soit signés comme provenant de l’utilisateur « admin » que vous avez utilisé pour réaliser l’import.&lt;/p&gt;</description></item></channel></rss>