Мой путь миграции на phpBB (postgresql)

Я делюсь своими выводами по ходу миграции с phpBB3 на Discourse.

Решения включают:

  • исходная база данных PostgreSQL
  • эмодзи
  • доработки импортера (исправление бага с цитатами, улучшенная поддержка BBCode (включая YouTube), комментарии к вложениям)
  • мягко удалённые посты импортируются как обычные

Я очень придирчив, поэтому, если вы будете следовать за мной, вы сможете получить довольно хороший результат.


Я рассматриваю возможность перехода с phpBB на Discourse (история установленных версий: 3.2.1 – 3.2.8).
Проблема в том, что я использую PostgreSQL для базы данных. Есть предложения? Я ещё не пробовал, но предполагаю, что это пока не поддерживается, исходя из первого поста темы.

Всё-таки вышел ли новый скрипт импорта? Я вижу, что это было чуть больше года назад.

Скрипт массовой импорта должен сработать для вас… discourse/script/bulk_import/phpbb_postgresql.rb at 52d4de7b45eb1b7c7997da2ba8bff83a3c22a3a5 · discourse/discourse · GitHub

Спасибо, @gerhard

Правильно ли я понимаю?

  • script/import_scripts/phpbb3 и script/bulk_import — это совершенно разные инструменты импорта.
  • инструмент пакетного импорта менее совершенен (хотя и быстрее), и, например, он не импортирует вложения?

Если так, то использование пакетного импорта, похоже, имеет недостатки…

Нет ли другого решения? Было бы разумно рассмотреть возможность миграции базы данных с PostgreSQL на MySQL или что-то подобное?

Да, есть и недостатки. Если вы комфортно работаете с Ruby, я бы предложил изменить файлы в discourse/script/import_scripts/phpbb3/database at main · discourse/discourse · GitHub, чтобы они работали с гемом pg вместо mysql2.

Возможно? Я не знаю, насколько это будет легко и сработает ли это на самом деле. Вы можете попробовать…

Обидно. Ладно, я попробую. Если что-то придумает, напишу.

Этот импортер — тот самый, который будет устаревшим? Каков статус «нового» импортера? Я пытаюсь решить, сколько усилий стоит вложить в это — будет ли это полезно для основного проекта?

Я сам не сталкивался с проблемой миграции с PostgreSQL на MySQL, но чисто с точки зрения перехода с phpBB на Discourse я считаю: сделайте всё необходимое, чтобы завершить миграцию.

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

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

Как только у вас будет база данных MySQL, вы сможете использовать обычный скрипт миграции phpBB и сохранить все вложения.

Это того стоит!

Это звучит как рецепт катастрофы, если не быть осторожным с кодировками и правилами сортировки базы данных.

Несколько лет назад я начал работать над этим, но проект незавершён и устарел. В любом случае, возможно, это будет полезно.

Я не хотел намекать, что это легко, просто хотел сказать, что усилия того стоят. Это даже можно сделать вручную, и, похоже, в сети достаточно ресурсов для этого — как с помощью автоматизированных инструментов, так и вручную. :grinning:

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

Я продвигаюсь с помощью мастера миграции в MySQL Workbench. Если всё получится, я напишу небольшое руководство, но пока всё выглядит многообещающе.

Пока я застрял на этой проблеме:

https://bugs.mysql.com/bug.php?id=89048

В основном, MySQL Workbench не справляется с импортом Unicode. Завтра попробую с MariaDB и посмотрю, можно ли установить кодировку базы данных по умолчанию или что-то подобное перед импортом.

Было бы здорово, если бы MySQL Workbench заработал. Я видел множество сообщений об ошибках, связанных с ним, когда изучал варианты, поэтому не стал его рекомендовать.

Я уже упоминал метод дампа схемы и импорта/экспорта через CSV, и теперь упомяну его ещё раз с небольшим уточнением, чтобы всё стало намного проще, а затем замолчу.

Если вы предпочитаете графический интерфейс:

  1. Получите экспорт только структуры всех таблиц из рабочей копии той же версии phpBB3, которую вы используете, работающей с MySQL/MariaDB. Это буквально займёт у кого-то две минуты в phpMyAdmin, который доступен на большинстве веб-хостингов с поддержкой MySQL/MariaDB. (Альтернативный вариант: если вы не можете попросить кого-то сделать экспорт только структуры, вы можете найти необходимые операторы CREATE TABLE в установочных скриптах phpBB3 или даже использовать недорогой веб-хостинг для чистой установки вашей версии phpBB3 в окружение MySQL/MariaDB, а затем удалить данные в созданных таблицах, чтобы получить пустую базу данных MySQL/MariaDB.)
  2. Найдите доступ к веб-хостингу с поддержкой MySQL/MariaDB и phpMyAdmin, создайте базу данных и импортируйте структуру из файла экспорта только структуры, созданного на шаге 1, используя phpMyAdmin.
  3. Сделайте 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.

phpbb_smilies.zip (87.2 КБ)

(сравнить со стандартными смайликами)

Кстати, вот моё решение с эмодзи.

У вас есть два варианта:

  1. Нативные
    • Если вы не хотите сохранять оригинальные phpBB-эмодзи, вы можете сопоставить их с уже существующими в Discourse нативными эмодзи.

:grin: :smile: :wink: :slightly_frowning_face: :astonished: :exploding_head: :confounded: :sunglasses: :joy: :rage:
:stuck_out_tongue: :person_facepalming: :sob: :imp: :smiling_imp: :roll_eyes: :exclamation: :question: :bulb: :arrow_forward:
:neutral_face: :smiley_cat: :nerd_face: :nerd_face:

  1. Импортированные
    • Если вы хотите сохранить оригинальные phpBB-эмодзи и оставить их доступными в виде коротких кодов для дальнейшего использования:
      • Перед запуском импортера перейдите в раздел эмодзи панели управления Discourse (admin/customize/emojis).
      • При желании сначала создайте группу эмодзи с названием phpbb или любым другим.
      • Перетащите файлы эмодзи (по 5 за раз) из папки new_files в браузер, чтобы импортировать их как пользовательские эмодзи.

У меня есть ZIP-архив с конфигурацией для обоих вариантов, включенный в файл import.yml внутри архива.

Также в архиве включена электронная таблица, которая поможет вам принять решение или создать собственную карту сопоставления:

phpbb_smilies
├── phpbb_smilies.xlsx # основной справочник для принятия решения
├── import.yml # файл конфигурации с обоими вариантами
├── orig_phpbb_smilies.csv # исходные данные phpBB
├── orig_files # исходные файлы эмодзи phpBB
│   ├── icon_arrow.gif
│   └── ...
└── new_files # файлы эмодзи, переименованные в соответствии со столбцом `new_shortcode` в таблице
    ├── phpbb_arrow.gif
    └── ...

У кого-нибудь цитирование с указанием автора работает корректно?

Вот пример оригинального сообщения из phpBB, содержащего цитату (имя пользователя и содержимое изменены, ID и прочее остались прежними):

[quote=someuser post_id=46649 time=1677556325 user_id=48]
foo
[/quote]

bar

А вот как это выглядит в Discourse:

Вот исходный текст сообщения, перенесённый в Discourse:

[quote=", post:37, topic:1893"]
foo
[/quote]

bar

Перенесённые post_id и topic_id верны, но имя пользователя отсутствует. Из-за этого цитата не интерактивна. Когда имя пользователя — пустая строка, цитата не раскрывается, и вы не можете нажать на неё, чтобы перейти к исходному сообщению.

Можно ли рассчитывать на лучший опыт без доработок импортера? Или я просто что-то делаю не так?

Я вполне уверен, что они корректно работали при импорте в phpBB3, который я делал в прошлом месяце.

Я ещё не разобрался с последней проблемой, но у меня есть ещё один вопрос.

Я заметил, что после завершения импорта и запуска контейнера приложения мой всё ещё работающий сервер 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, но я не знаю, какая практика считается лучшей.

Действительно, что-то не так с парсингом цитат.

Я только что попробовал импортировать свежую установку phpBB 3.2.8 (установленную на MariaDB).

Атрибуция цитат сломана — поле имени пользователя в импортированных цитатах пустое, но всё остальное в порядке.

Скриншот из Discourse импортированного поста:

Импортированный пост в Discourse:

[quote=", post:4, topic:12"]
[quote=", post:3, topic:12"]
[quote=", post:2, topic:12"]
msg 1
[/quote]

second
[/quote]

third
[/quote]

fourth

Оригинальный пост phpBB:

MariaDB [phpbb]> select post_text from phpbb_posts where post_id=5;
...
| <r><QUOTE author="admin" post_id="4" time="1678400691" user_id="2"><s>[quote=admin post_id=4 time=1678400691 user_id=2]</s>
<QUOTE author="admin" post_id="3" time="1678400685" user_id="2"><s>[quote=admin post_id=3 time=1678400685 user_id=2]</s>
<QUOTE author="admin" post_id="2" time="1678400675" user_id="2"><s>[quote=admin post_id=2 time=1678400675 user_id=2]</s>msg 1<e>[/quote]</e></QUOTE>

second
<e>[/quote]</e></QUOTE>

third
<e>[/quote]</e></QUOTE>

fourth</r> |

Возможно, мне всё-таки придётся заняться улучшением импортера…

Исправлено


Я довольно придирчив к миграции своего форума, поэтому продолжаю улучшать импортер. Не уверен, стоит ли мне создавать 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:

docker_args:
  - '-v /path/to/discourse_dev/script/import_scripts:/var/www/discourse/script/import_scripts'

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

cd /path/to/discourse_dev
git reset --hard HEAD
chown -R 1000:1000 .