Импорт из phpBB

Здравствуйте, я пытаюсь импортировать старый форум phpBB2 в новый Discourse.

Я выполнил предварительный импорт из phpBB2 в phpBB3, как указано в вашей документации.

У меня возникли проблемы с импортом аватаров (они не импортировались) и с паролями. Очевидно, что Discourse использует другой метод шифрования, чем phpBB2, поэтому я подумал написать код, который при первом входе будет проверять, зашифрованы ли пароли способом phpBB2, сверять хеш с паролем, зашифрованным методом phpBB2 (md5?), а затем переписывать его с использованием шифрования Discourse.

Обычно в «старых добрых» PHP и MySQL это занимает около получаса, но с Discourse я даже не знаю, с чего начать внесение изменений в исходный код. Мой старый phpBB2 был сильно модифицирован (по этой причине я никогда не обновлял его до phpBB3), но я понимаю, что это плохая практика, и не хочу нарушать работу Discourse и терять возможность автоматических обновлений. Поэтому спрашиваю, как мне решить эту задачу. Стоит ли мне разработать плагин? Есть ли шанс, что эта функция появится в новой «бета»-версии?

Спасибо

Для импорта паролей вам понадобится плагин Поддержка перенесённых хешей паролей. Это может решить вашу проблему с паролями.

Сложно сказать, связана ли ваша проблема с аватарами с несовместимостью данных или же вы просто неправильно настроили скрипт.

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

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

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

Failed to upload avatar for user myuser: /shared/import/data/images/avatars/upload/phpbb_avatar_2.png
#<ActiveModel::Errors:0x00000055a4b3de78 @base=#<Upload id: nil, user_id: nil, original_filename: "avatar.png", filesize: 0, width: nil, height: nil, url: nil, created_at: nil, updated_at: nil, sha1: nil, origin: nil, retain_hours: nil, extension: nil, thumbnail_width: nil, thumbnail_height: nil, etag: nil, secure: false, access_control_post_id: nil, original_sha1: nil, animated: nil, verification_status: 1, security_last_changed_at: nil, security_last_changed_reason: nil>, @errors=[#<ActiveModel::Error attribute=base, type=Sorry, the image you are trying to upload is too large (maximum dimension is 80-megapixels), please resize it and try again., options={}]> 

Проблема, похоже, связана с форматом файла PNG. Есть ли способ импортировать файлы PNG, или они должны быть в формате GIF/JPG? oxipng уже установлен.

root@DietPi4-import:/var/www/discourse# which oxipng
/usr/local/bin/oxipng
root@DietPi4-import:/var/www/discourse#

Что касается плагина для паролей. Я активировал его как часть процесса сборки контейнера для импорта. Или его также нужно активировать в контейнере Discourse? Есть ли способ проверить, работает ли это, или пользователю нужно будет это попробовать?

Заранее большое спасибо.

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

Чтобы проверить, работает ли он, просто активируйте плагин и попробуйте войти, используя ваш старый пароль.

Спасибо за обратную связь, @Canapin.
В этом случае я пересоберу продакшн-контейнер перед его перезапуском после завершения импорта в контейнере импорта.

Кстати: не мог бы кто-нибудь из команды администраторов проверить мой первоначальный пост. Похоже, я слишком сильно его отредактировал, и он был помечен как СПАМ :smiley:

У кого-нибудь есть идея, почему не работает импорт файлов PNG?

Будет полезно получить больше информации. Какая версия phpBB? Есть ли сообщение об ошибке?
Можете подробнее рассказать, что именно «не работает»?

Уже было упомянуто выше. Похоже, скрипт импорта не может корректно читать PNG-файлы, так как практически все значения равны nil.

Ой, извините, я не заметил, что вы уже создали эту тему. К сожалению, я не смогу вам помочь, у меня нет необходимых навыков.

edit: (чтобы избежать моей маленькой «ошибки», вы могли бы ответить на своё собственное сообщение, чтобы я увидел ваше первое сообщение)

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

Вы уверены, что PNG-файлы, которые вы пытаетесь импортировать, являются действительными изображениями? Если да, то можете ли вы предоставить пример? Также, вы выполняете импорт внутри контейнера Docker или в среде разработки?

Кратко: Изображения повредились при переносе на Linux-машину.

@gerhard Я был на 100% уверен, что мои PNG-файлы валидны и корректны, так как мог открывать их на своём компьютере с Windows. Однако ваш намёк направил меня в верное русло, и я проверил, как PNG-файлы выглядят на Linux-машине. И вы оказались абсолютно правы: все PNG-файлы оказались повреждены. Коренная причина заключалась в способе их переноса. Я использовал SCP (WinSCP), и PNG-файлы были переданы как текстовые файлы, что привело к их порче. При следующей попытке я перенёс всё в виде архива 7z и просто распаковал его непосредственно на Linux-машине. На этот раз импорт прошёл без проблем.

Огромная благодарность за вашу поддержку и то, что вы указали мне правильное направление :+1:

Хотя мой импорт сейчас работает для 99,9% всех постов, у меня есть ещё один вопрос. Есть ли способ перенести статус для solved topics (решённых тем)? На новом продакшн-форуме я планирую использовать плагин discourse-solved. Вопрос: как перенести старые статусы в новую среду?

Ещё раз: огромная благодарность за вашу поддержку.

Я не знаю о статусе «решено» в phpBB. Это расширение или мод? Похоже, вам нужно будет настроить скрипт импорта, чтобы импортировать его.

Я посмотрел в базу данных phpBB и теперь знаю поле, в котором хранится информация о том, что тема/сообщение решено. Осталось только выяснить, как и где хранить это в базе данных Discourse. :roll_eyes:

Вы можете посмотреть другие скрипты импорта, которые это поддерживают (поиск по слову «решено», кажется). Вам нужно будет установить плагин в вашем экземпляре импорта.

Спасибо за ответ, но это, похоже, выходит за рамки моих навыков.

В исходной базе данных phpBB ID поста, решающего тему, хранится в:

  • phpbb_topics.topic_solved.

В Discourse эта информация хранится в трёх разных полях (если я не ошибаюсь):

  • post_custom_fields.is_accepted_answer
  • topic_custom_fields.accepted_answer_post_id
  • topic_custom_fields.solved_auto_close_topic_timer_id

Насколько я понял, при импорте выполняется某种 маппинг, так как ID для topic и post изменятся.

Но на этом мои знания заканчиваются.

Тогда объяснение того, как его модифицировать и отлаживать, вероятно, выходит за рамки того, что можно сделать здесь. Если у вас есть бюджет, вы можете опубликовать сообщение в Marketplace или связаться со мной.

Это хранится в пользовательском поле с названием “import_id”, и существуют функции, которые вы можете использовать для поиска; их можно увидеть в коде. Что-то вроде topic_id_from_import_id().

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

Ещё раз спасибо вам, ребята, которые помогли заставить это работать почти идеально.

Кстати, ребята, phpBB был мигрирован с версии 3.3.5. Он работал нормально, даже если не поддерживается.

Если вы смогли разобраться, какие таблицы участвуют в Discourse, вы вполне можете скопировать несколько строк кода из другого импортера.

Понятно. Происходит сопоставление идентификаторов постов/тем phpbb с идентификаторами постов/тем Discourse.

Вот хороший пример для импорта принятых ответов: discourse/script/import_scripts/lithium.rb at 44f7a61c2c5b6f248a62ab7f987ebbd3091c71ef · discourse/discourse · GitHub

Но, если я правильно понял, первым шагом мне нужно будет сохранить/импортировать значение phpbb_topics.topic_solved в postgres, верно?