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.
6 réactions
1 De Eulalie - 26/11/2008, 21:37
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 De Nuits de Chine - 26/11/2008, 21:56
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 De samantdi - 26/11/2008, 22:12
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 De Nuits de Chine - 26/11/2008, 22:20
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 De brol - 08/12/2008, 02:43
N'est-ce pas un peu curieux de proposer rss plutôt qu'atom ?
6 De Nuits de Chine - 08/12/2008, 11:20
Brol : c'est plus une habitude qu'autre chose...