Я делюсь своими выводами по ходу миграции с phpBB3 на Discourse.
Решения включают:
исходная база данных PostgreSQL
эмодзи
доработки импортера (исправление бага с цитатами, улучшенная поддержка BBCode (включая YouTube), комментарии к вложениям)
мягко удалённые посты импортируются как обычные
Я очень придирчив, поэтому, если вы будете следовать за мной, вы сможете получить довольно хороший результат.
Я рассматриваю возможность перехода с phpBB на Discourse (история установленных версий: 3.2.1 – 3.2.8).
Проблема в том, что я использую PostgreSQL для базы данных. Есть предложения? Я ещё не пробовал, но предполагаю, что это пока не поддерживается, исходя из первого поста темы.
Всё-таки вышел ли новый скрипт импорта? Я вижу, что это было чуть больше года назад.
Этот импортер — тот самый, который будет устаревшим? Каков статус «нового» импортера? Я пытаюсь решить, сколько усилий стоит вложить в это — будет ли это полезно для основного проекта?
Я сам не сталкивался с проблемой миграции с PostgreSQL на MySQL, но чисто с точки зрения перехода с phpBB на Discourse я считаю: сделайте всё необходимое, чтобы завершить миграцию.
Я уже мигрировал два форума с phpBB на Discourse. Хотя, как и при любых изменениях, некоторые пользователи выражали недовольство, преимущества Discourse того стоят! Discourse не только проще поддерживать и администрировать, но и такие встроенные функции, как вовлечение пользователей, работа с изображениями, кастомизация интерфейса и читаемость, настолько опережают phpBB, что сравнивать их просто бессмысленно. Кроме того, поддержка в Discourse значительно лучше.
Я не эксперт, но быстрый поиск показывает, что миграцию с PostgreSQL на MySQL можно выполнить, сделав дамп схемы, изменив типы данных в операторах схемы на соответствующие MySQL, используя модифицированную схему для создания таблиц в базе данных MySQL, а затем выполнив экспорт и импорт данных по таблицам в формате CSV.
Как только у вас будет база данных MySQL, вы сможете использовать обычный скрипт миграции phpBB и сохранить все вложения.
Я не хотел намекать, что это легко, просто хотел сказать, что усилия того стоят. Это даже можно сделать вручную, и, похоже, в сети достаточно ресурсов для этого — как с помощью автоматизированных инструментов, так и вручную.
Учитывая, что я ненавижу Ruby, а существующий импортер будет устаревать в пользу массового импортера (который пока не подходит для моих задач), я перехожу к стратегии миграции из PostgreSQL в MySQL.
Я продвигаюсь с помощью мастера миграции в MySQL Workbench. Если всё получится, я напишу небольшое руководство, но пока всё выглядит многообещающе.
В основном, MySQL Workbench не справляется с импортом Unicode. Завтра попробую с MariaDB и посмотрю, можно ли установить кодировку базы данных по умолчанию или что-то подобное перед импортом.
Было бы здорово, если бы MySQL Workbench заработал. Я видел множество сообщений об ошибках, связанных с ним, когда изучал варианты, поэтому не стал его рекомендовать.
Я уже упоминал метод дампа схемы и импорта/экспорта через CSV, и теперь упомяну его ещё раз с небольшим уточнением, чтобы всё стало намного проще, а затем замолчу.
Если вы предпочитаете графический интерфейс:
Получите экспорт только структуры всех таблиц из рабочей копии той же версии phpBB3, которую вы используете, работающей с MySQL/MariaDB. Это буквально займёт у кого-то две минуты в phpMyAdmin, который доступен на большинстве веб-хостингов с поддержкой MySQL/MariaDB. (Альтернативный вариант: если вы не можете попросить кого-то сделать экспорт только структуры, вы можете найти необходимые операторы CREATE TABLE в установочных скриптах phpBB3 или даже использовать недорогой веб-хостинг для чистой установки вашей версии phpBB3 в окружение MySQL/MariaDB, а затем удалить данные в созданных таблицах, чтобы получить пустую базу данных MySQL/MariaDB.)
Найдите доступ к веб-хостингу с поддержкой MySQL/MariaDB и phpMyAdmin, создайте базу данных и импортируйте структуру из файла экспорта только структуры, созданного на шаге 1, используя phpMyAdmin.
Сделайте CSV-экспорт для каждой таблицы из вашей базы данных PostgreSQL и выполните CSV-импорт в соответствующие таблицы с помощью phpMyAdmin в вашей новой базе данных MySQL/MariaDB.
Я думаю, это позволит избежать проблем с набором символов и кодировкой, и вам не придётся вручную подбирать соответствующие типы данных и размеры полей, как это потребовалось бы при попытке конвертировать дамп схемы из PostgreSQL вручную.
Я могу предоставить вам SQL-запрос только со структурой, но единственная база данных, которая у меня осталась, — это версия phpBB3 3.3.8, поэтому, если вы используете версию 3.2.x, это может создать дополнительные проблемы.
Ха-ха, да. Пришлось использовать несколько неочевидных трюков, чтобы даже добиться того, что у меня получилось. Думаю, он всё ещё может работать, но спасибо, что указали мне ещё одно направление для исследования.
Отлично, ура! Вот моё решение для импорта в PostgreSQL.
Это позволит вам перейти из дампа PostgreSQL к работающему серверу MariaDB, к которому можно подключить импортер. Требуется Docker Compose.
Это работает для phpBB 3.2. Насчёт 3.3 не знаю. Если вам критически важна поддержка 3.3, я могу попробовать исправить это, если вы предоставите дамп pg_dumpall от phpBB 3.3.
Вот исходный текст сообщения, перенесённый в Discourse:
[quote=", post:37, topic:1893"]
foo
[/quote]
bar
Перенесённые post_id и topic_id верны, но имя пользователя отсутствует. Из-за этого цитата не интерактивна. Когда имя пользователя — пустая строка, цитата не раскрывается, и вы не можете нажать на неё, чтобы перейти к исходному сообщению.
Можно ли рассчитывать на лучший опыт без доработок импортера? Или я просто что-то делаю не так?
Я ещё не разобрался с последней проблемой, но у меня есть ещё один вопрос.
Я заметил, что после завершения импорта и запуска контейнера приложения мой всё ещё работающий сервер phpBB начинает сильно нагружаться. Думаю, это происходит на этапе постобработки Sidekiq.
phpBB всё ещё доступен по адресу www.example.com, а Discourse — по адресу dc.example.com.
Я пытаюсь понять, что именно происходит, какие настройки имеют смысл на этапе тестовой миграции, а какие подойдут для финальной миграции. И нужно ли мне держать phpBB запущенным во время постобработки Sidekiq. Спрашиваю, потому что не знаю, что именно происходит на этапе постобработки.
Вот некоторые настройки из моего текущего файла settings.yml, которые могут быть relevant:
import:
# Установите это, если вы импортируете несколько форумов phpBB в один форум Discourse.
site_name:
site_prefix:
# Это необходимо для переписывания внутренних ссылок в сообщениях
original: example.com # без http(s)://
new: https://dc.example.com # с http:// или https://
Если нужно посмотреть что-то ещё, дайте знать.
Ещё один момент, который мне не до конца ясен — поддомен www. Сейчас я перенаправляю на www через nginx для phpBB. Так что в приведённом выше примере имеет ли значение, если я укажу original: example.com вместо original: www.example.com? Аналогичный вопрос по параметру new при финальной миграции. Мои пользователи будут обращаться к Discourse через www.example.com, но я не знаю, какая практика считается лучшей.
Я довольно придирчив к миграции своего форума, поэтому продолжаю улучшать импортер. Не уверен, стоит ли мне создавать PR, так как импортер устарел, а некоторые мои исправления частично специфичны для моего форума, но в этой ветке собраны все мои правки на случай, если они кому-то пригодятся:
Я исправил проблему с цитатами, добавил поддержку некоторых часто используемых BBCode-тегов, улучшил парсинг ссылок YouTube и добавил поддержку расширения для упоминаний (mentions/simplymentions). У меня ещё есть что улучшить, например, поддержка нескольких префиксов сайтов (основной случай использования — когда на форуме есть ссылки на example.com и www.example.com).
Хотя я поддерживаю некоторые нестандартные расширения, это не должно мешать запуску на обычном форуме phpBB без расширений. В любом случае рекомендую использовать мой вариант.
Самый простой способ его использовать — загрузить мою ветку куда-нибудь и заменить директорию скрипта импорта внутри контейнера с помощью bind mount.
То есть, сначала загрузите мои изменения:
git clone --filter=blob:none --no-checkout https://github.com/ftc2/discourse.git discourse_dev
cd discourse_dev
git sparse-checkout set --cone
git switch phpbb_import
git sparse-checkout set script/import_scripts
Затем добавьте это в конфигурацию контейнера import.yml:
После этого пересоберите контейнер импорта. После пересборки, вероятно, стоит выполнить сброс в репозитории, откуда вы загрузили мои изменения, так как процесс сборки перезапишет мои файлы, ха-ха.
cd /path/to/discourse_dev
git reset --hard HEAD
chown -R 1000:1000 .