Миграция MovableType -> Drupal. День 1: постановка задачи

Предуведомление

Я понимаю, что читать такой сугубо специфический текст может быть скучно, особенно на каникулах. В то же время, я не нашел разумных русскоязычных текстов на эту тему, поэтому мои записки могут оказаться полезными тем, кто столкнется с подобной задачей.

Короче, не нравится - не читайте :)

Статус этих записок

Записки пишутся по горячему, с небольшой задержкой относительно реальных действий. На момент написания первой части (которую вы сейчас читаете) есть ощущение, что все получится, но реальный перенос данных даже на тестовой машине сделан частично. Но уже есть ощущение успеха, минимально необходимая функциональность точно будет, а дальше будем посмотреть.

Зачем переезжать

Моя причина очень простая: мне надоело поддерживать две платформы (Drupal и Movable Type). При этом, по комплексу свойств Друпал побеждает, а значит с MT пора прощаться. А новогодние каникулы - хороший повод позаниматься чем-то полезным.

Постановка задачи

За три года на сайте наросло довольно много и это многое хочется сохранить:

  • 600+ постов
  • 10000+ комментариев
  • Картинки, файлы для скачивания
  • Синхронизация с ЖЖ (как постов, так и комментариев).
  • Кросспост

При этом, для постов необходимо сохранение URL, для всего остального - крайне желательно. Эти URL надо исчислить:

  • URL постов
  • URL комментариев
  • URL RSS-потоков
  • Разделы (рубрики) сайта
  • Теги
  • Архивы (месячные, дневные)
  • Картинки, всплывающие окна с картинками, прочие файлы для скачивания.

Кроме того, программирование хочется свести к минимуму. В крайнем случае - скрипты на перле, писать на PHP совсем не хочется.

Фтыкание

В документации на Drupal есть отдельный раздел, посвященный миграции с других CMS, однако он очень неровный. В частности раздел про миграцию с Movable Type написан 2.5 года назад, когда и MT был старый и Drupal - пятой версии.

В правильную сторону меня направила часовая презентация с Drupalcon-2009: рулят модули Table Wizard и Migrate:

  • Table Wizard позволяет представить любую таблицу в базе (даже не связанную с каким-то объектом Drupal) в виде View
  • Migrate позволяет перетащить данные из View в объекты Drupal с заполнением всех нужных полей (URL, теги) либо из таблиц, либо с какими-то defaults.

Фтыкание: чтение доков, рассмотрение имеющихся модулей и т.п. заняло примерно день (с перерывами на смотрение кино, гуляние с детьми и т.п.), что и отражено в заголовке данного текста.

План кампании

Исходя из описанных выше потребностей, план кампании получается таким:

  1. Переносим данные по постам и комментариям. При этом идентификаторы записей скорее всего не сохранятся, поэтому все существующие мэппинги (например, между ЖЖ и MovableType) придется аккуратно переделывать.
  2. URL постов сохраняем, благо есть метод (модуль Path Друпала).
  3. Картинки, файлы, HTML-ки с всплывающими окнами и т.п. - не импортируем, а оставляем лежать кучей, благо у меня все файлы и большие картинки сложены в /files/, а все мелкие картинки - в assets_c, спасибо за первое мне, а за второе - MovableType.
  4. URL разделов сайта сохраняем через тот же механизм Path.
  5. URL архивов - пытаемся сохранить механизмами Drupal, если не получится (есть шансы, увы...) - сделаем rewrite на уровне http-сервера (nginx), благо это кажется несложным. При изучении вопроса всплыли обстоятельства про архив по дням:
    • Есть календарь, сделанный на Date API (Calendar module), но предполагается, что в этом календаре живут события а не посты.
    • Есть Calendar Block, простой и незамысловатый, но это заготовка, для показа в нем ссылок на посты по дням придется программировать (а этого делать не хочется).
  6. URL тегов - плюем, старый mt-search.cgi?tag=.... ужасен, пусть уж будет /tag/tagname
  7. URL многстраничных списков (например /category/indexN.html) - совершенно точно придется делать средствами рерайта, все листалки Drupal передают номер страницы в CGI parameters.
  8. Синхронизация постов с ЖЖ: модулем LiveJournal CrossPost
  9. Синхронизация комментариев из ЖЖ: модулем LiveJournal Sync
  10. Облака тегов, списки разделов и т.п. никакой проблемы не представляют, готовых модулей - шляпой кушай.
  11. URL RSS-потоков остаются прежними, ибо были через FeedBurner. RSS-потоки комментариев к отдельной записи - выкидываем, вместо этого будет почтовая подписка.

По счастью, миграции списков пользователей, подписок на комментарии, каталога товаров, архива заказов и всего подобного, что бывает на настоящих сайтах - у меня нет, поэтому миграция имеет шансы завершиться за обозримое время, дня эдак за 3-4.

Отягчающие обстоятельства

У меня - PostgreSQL, а не MySQL, что вносит отдельный секс в процесс. В частности, у модуля Migrate при тестах обнаружились проблемы совместимости.

Как один из вариантов, можно рассматривать сначала миграцию в Drupal+MySQL, а затем - миграцию БД, благо по всем граблям уже походили

Comments

RSS-потоки комментариев к отдельной записи - выкидываем, вместо этого будет почтовая подписка.

Наконец-то, ура-ура.

Ну чтож удачи! Будем ждать новой реинкарнации "мыслей.." :)

Не, скучно читать определенно не будет - хоть передо мной и не стоит задача миграции на Друпал, такие заметки наверняка помогут узнать какие-то новые тонкости в работе с ним. Так что с нетерпением жду описания самого процесса, именно ради подобных вещей блоги и стоит мониторить.