Et hop...

Tout nouveau tout beau. Il faut encore faire la peinture (ou plus exactement trouver une peinture qui me convienne), et fignoler deux ou trois bricoles techniques sous le capot (qui ne concernent pas Dotclear), mais le gros du travail est terminé.

La migration a été un peu délicate, parce que je voulais reprendre tout mon ancien contenu sans me fatiguer. Il s'avère que les informations sur le site de Dotclear sont pertinentes, mais insuffisantes par rapport à mes besoins (ou alors je n'ai pas trouvé LA page qu'il me fallait, ce qui est possible). Mes contraintes :

  1. reprendre le contenu du blog existant
  2. lequel contient des liens internes entre articles, qui sont au format Dotclear 1 abrégé (/index.php/aaaa/mm/dd/numéro)
  3. et des images internes.

En gros, pas de quoi casser quatre pattes à un canard non plus, mais quelques subtilités amusantes.

Le cadre de la migration

Changement d'hébergeur, donc de serveur. J'ai un accès complet au serveur, je peux y faire ce que je veux dans la limite de l'espace disque. Je peux notamment y exécuter mes propres programmes pour la migration, s'il le faut (et il l'a fallu).

Récupération du contenu existant

Là, rien à dire sur la documentation de migration DC1 vers DC2. Sauf que je suis un chieur. Je vous conseille[1] de détruire le premier billet d'exemple avant de procéder à l'importation des données issues de l'ancien blog. Et de compacter la base (Extensions>Maintenance).

Pour le reste, c'est nickel, tant du point de vue de l'export des anciennes données (merci Pep pour flatExport[2]) que pour l'import dans le nouveau blog.

Récupération des images

Sous DC1 (en tout cas dans ma configuration), les images étaient dans /images/. Sous DC2, il semble que ce doive être sous /public/. Evidemment, on pourrait changer la configuration pour conserver une comptabilité ascendante, mais ce genre de truc m'a toujours donné de l'urticaire : le passé est le passé, important certes, mais s'il faut toujours trimbaler les valises d'hier on n'arrivera jamais à demain. Donc, mes images seront sous /public/.

Le transfert per se ne pose pas de problème, un coup de tar jcf / scp / tar jxf et le répertoire /public/ est correctement rempli. Reste à modifier les liens dans les billets, liens qui font référence à /images/. Apache permet de faire ça sans difficulté, par une redirection (dans le fichier httpd.conf[3], pour moi dans la section VirtualHost adéquate) :

RedirectPermanent   /images/    http://www.nuitsdechine.org/public/

et c'est plié.

Fils RSS et autres

(ajout suite au commentaire d'Eulalie)

Dans la même idée que les images, les fils RSS (commentaires et autres) ne sont plus aux mêmes URLs. Quelques redirections plus tard, c'est invisible pour le visiteur :

RedirectPermanent   /rss.php   http://www.nuitsdechine.org/index.php/feed/rss2
RedirectPermanent   /atom.php   http://www.nuitsdechine.org/index.php/feed/atom

Mise en place des liens internes

Je n'aime pas que les liens vers mes billets contiennent le titre : c'est trop long, nous sommes dans un monde en crise, il faut économiser les caractères et les électrons. La configuration de DC2 est donc modifiée pour que les URLs des nouveaux billets soient sous la forme AAAA/MM/JJ/NN, où NN est le numéro du billet. Ca, ça marche pour les nouveaux billets mais pas pour les anciens, qui sont identifiés sous DC2 par une URL de la forme AAAA/MM/JJ/NN-titre.

Je n'ai pas trouvé, dans DC2, de moyen d'obtenir directement le résultat que je veux. Ca doit se situer entre flatExport et l'importation, mais je n'ai aucune envie d'aller tripatouiller le code, d'autant plus que j'ai une solution facile : ayant accès au système, je peux écrire un minuscule bout de code qui va aller corriger les URLs des billets existants. Quelques lignes en Perl :

use DBI;

$dsn = "DBI:mysql:database=ma_base_de_données" ;
$dbh = DBI->connect($dsn, 'le_compte', 'Le mot de passe')
or die "Probleme connexion";

$sth = $dbh->prepare("SELECT post_id, blog_id, post_url
FROM dc_post");
$sth->execute;
$modif = $dbh->prepare ("UPDATE dc_post set post_url = ?
where post_id = ?")
or die "Probleme préparation modif\n";

while (my $ref = $sth->fetchrow_hashref()) {
$modif->execute($1, $ref->{'post_id'})
if $ref->{'post_url'} =~
m/(\d{4}\/\d\d\/\d\d\/\d+)-.*$/ ;
}

$dbh->disconnect;

et c'est aussi plié.

Sauf qu'il demeure encore un problème : les URLs DC2 sont en réalité de la forme /index.php/post/AAAA/..., alors que sous DC1 (et sous DC2 si je m'arrête à la modification ci-dessus) on a /index.php/AAAA/... Il faut insérer un post entre le index.hp et l'année. De même, plein d'autres URLs ''à la DC1'' doivent être réécrites pour DC2 (elles ont été indexées par des moteurs de recherche).
De nouveau, Apache (mod_rewrite) vient à la rescousse. Toujours dans la section VirtualHost adéquate :

RewriteEngine On
RewriteRule ^/index.php/(\d{4}/\d\d)(/\d\d)?$             /index.php/archive/$1 [R,L]
RewriteRule ^/index.php/(\d{4}/\d\d/\d\d/\d+)(-.*)?$  /index.php/post/$1 [R,L]
RewriteRule ^/index.php/(.*-.*)/(\d{4}/\d\d)(/\d\d)?$  /index.php/archive/$2 [R,L]
RewriteRule ^/index.php/([A-Z][^/]*)$                          /index.php/category/$1  [R,L]
RewriteRule ^/index.php/(\d{4}/\d\d)/p\d+$               /index.php/archive/$1   [R,L]

Et, enfin, c'est réellement plié. Il me reste à chrooter tout ça, mais ça ne concerne plus Dotclear, comme je l'ai dit en introduction.

Notes

[1] Sans être certain que c'est utile, je le concède.

[2] Je ne mets pas de lien vers ce plugin, au cas où une nouvelle version sorte; tout est dans la doc de migration DC1 vers DC2.

[3] Ca pourrait être placé dans un .htaccess si vous n'avez pas la possibilité d'agir sur le httpd.conf

Commentaires

1. Le mercredi 26 novembre 2008, 21:37 par Eulalie

Et c'est là que je comprends pourquoi mes tentatives ont lamentablement échoué : je cause pas Perl ! :)
Joli travail, tu as même conservé les mêmes flux RSS !

2. Le mercredi 26 novembre 2008, 21:56 par Nuits de Chine

Eulalie : si ce n'est que ça, le code Perl ci-dessus doit être facile à convertir en PHP pour une exécution "à travers" le serveur Web. Quant à la conservation des flux RSS, c'est bien de me le rappeller, j'ai oublié quelques règles de réécriture.

3. Le mercredi 26 novembre 2008, 22:12 par samantdi

Il semble qu'il y ait un pbl de fil rss : moi j'ai maintenant le fil des commentaires et pas celui des billets alors que j'étais abonnée au fil des billets et pas à celui des commentaires !

(je vois d'ailleurs de cette façon que ce sont essentiellement de gentes dames qui te causent dans le biniou!)

4. Le mercredi 26 novembre 2008, 22:20 par Nuits de Chine

Samantdi : oui et non. Il y a eu un problème de fil RSS qui allait sur les commentaires au lieu des billets, que j'ai corrigé depuis. Mais ton navigateur est passé avant ma correction, et a mémorisé automagiquement la nouvelle URL (erronée, car pointant vers les commentaires) que j'avais mise.
Temporairement, je redirige (rien que pour toi, sauf erreur de ma part) le fil des commentaires sur le fil des billets, et dès que ton navigateur se sera auto-corrigé je remettrai la configuration normale.

5. Le lundi 8 décembre 2008, 02:43 par brol

N'est-ce pas un peu curieux de proposer rss plutôt qu'atom ?

6. Le lundi 8 décembre 2008, 11:20 par Nuits de Chine

Brol : c'est plus une habitude qu'autre chose...