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

Смягчённо удалённые сообщения импортируются как обычные (и остаются видимыми). Это явная проблема, поскольку, как мне кажется, пользователи по умолчанию используют смягчённое удаление, а удалённые сообщения могут содержать конфиденциальную информацию.

Релевантные столбцы включают: post_delete_user, post_delete_time, post_visibility, post_delete_reason.

Похоже, что единственный релевантный столбец — это post_visibility; значения других столбцов не очищаются, если сообщение было смягчённо удалено, а затем восстановлено. normal = 1, invisible = 2.

Мое решение — просто отбрасывать смягчённо удалённые сообщения, потому что это неважно.

Выполните это в вашей исходной базе данных перед миграцией:

DELETE FROM phpbb_posts WHERE post_visibility = 2;

У меня есть свой, так сказать, «бюджетный» пайплайн непрерывной миграции. Это набор shell-скриптов для выполнения таких задач, как:

  • выгрузка базы данных phpBB, вложений и прочего с удалённого сервера
  • создание и управление экземплярами Discourse
  • применение конкретных настроек сайта при создании экземпляра Discourse из шаблонного экземпляра
  • резервное копирование и восстановление
  • запуск миграции с использованием определённого набора скриптов импорта из репозитория Git
  • выполнение задач после миграции

По сути, это позволяет мне работать на предварительно мигрированном экземпляре Discourse dctemplate, с которым я могу экспериментировать. Я продолжаю настраивать параметры Discourse по своему усмотрению.

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

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

Таким образом, дневной рабочий процесс тестирования выглядит примерно так:

Сделал изменения в шаблоне, результат меня устраивает:

./dc_template_create.sh dctemplate

Ой, я ошибся в шаблоне. Восстанавливаю его до предыдущего состояния:

./dc_template_restore.sh dctemplate

Выполняю быструю миграцию для проверки каких-то вещей:

# создаём новый экземпляр dcdev из dctemplate (и применяем конкретные настройки сайта к dcdev)
./dc_template_restore.sh dcdev dctemplate
./dc_migrate.sh dcdev # запускается с репозиторием скриптов миграции, специфичным для этого экземпляра

Выполняю длительную миграцию ночью с реального, действующего phpBB:

./dc_template_create.sh dctemplate
./dc_template_restore.sh dcstaging dctemplate

./phpbb_pull.sh
./dc_migrate.sh dcstaging
sleep 300
./dc_rake.sh dcstaging # дополнительные задачи после миграции, не обрабатываемые импортером (создание модераторов, детальная разметка тегов, перемещение некоторых тем и т. д.)

Если кому-то это достаточно интересно, я могу немного привести это в порядок и поделиться.

В Discourse есть теги, поэтому, возможно, стоит воспользоваться ими и отказаться от подкатегорий там, где это уместно.

Однако в каждой из моих подкатегорий было несколько закрепленных тем, и при объединении в одну большую категорию закрепленных тем становится слишком много. Это нарушает порядок.

Мое решение заключалось в переходе от структуры категорий, например:

Еда
- Американская
- Китайская
- ...

к такой:

Еда
- Избранное

Американская, китайская и т. д. становятся тегами, а все закрепленные темы перемещаются в «Избранное» и открепляются.

# Открепить все закрепленные темы в категории и переместить их в подкатегорию
def move_pinned_topics_to_subcategory(category, subcategory_name)
  subcategory = Category.where(name: subcategory_name).find_by(parent_category_id: category.id)
  topics = Topic.where(category_id: category.id).where.not(pinned_at: nil)
  topics.each do |topic|
    topic.update(pinned_at: nil, pinned_globally: false, pinned_until: nil,
      category_id: subcategory.id) if not topic.title[/About the .+ category/]
  end
  Category.update_stats
end

food_cat = Category.find_by(name: 'Food')
move_pinned_topics_to_subcategory(food_cat, 'Featured')

На моём форуме также есть предыдущая, уже неактивная версия (тоже на phpBB), для которой у нас есть полная копия сайта, полученная через wget. Поэтому я работаю над импортером для неё. Парсинг HTML-файлов с помощью Nokogiri, загрузка данных во временную базу данных, а затем использование базового класса импортера для переноса записей в Discourse.

Я видел это:

Думаю, это довольно редкая задача, но если кто-то ещё сталкивается с такой проблемой, возможно, я немного доработаю решение и поделюсь им. Дайте знать.

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