Migrate a XenForo forum to Discourse

Всего 5 тысяч постов и около 1 тысячи участников

3 лайка

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

3 лайка

Для XenForo? У нас есть и другие массовые импорты, но правда, для 18 миллионов сообщений это было бы очень медленно!

4 лайка

Мы разрабатываем собственный внутренний инструмент для массового импорта 27 миллионов постов. Время выполнения сократилось с чуть более недели (без учёта вложений) до менее чем суток с учётом всего. Вчера мы успешно завершили первый тестовый импорт без каких-либо ошибок. Это действительно захватывающе.

4 лайка

Спасибо, Джастин, я тоже быстро посмотрел — всё ли выглядит нормально? (Не стесняйся добавить это в официальный импортер, если хочешь)

  XENFORO_DB = "xenforo_db_3"
  TABLE_PREFIX = "xf_"
  BATCH_SIZE = 1000
  ATTACHMENT_DIR = '/ПОЛНЫЙ/ПУТЬ/К/attachments'
  AVATAR_DIR = '/ПОЛНЫЙ/ПУТЬ/К/avatars'

(Добавлена последняя строка^^ — значит, вам нужно скопировать аватары туда)

  def execute
    import_users
    import_categories
    import_posts
    import_avatars
  end

(Добавлена последняя строка^^)

  def import_avatars
    if AVATAR_DIR
      users = User.all
      users.each do |u|
        unless u.custom_fields["import_id"].nil?
          import_id = u.custom_fields["import_id"]
          if import_id.to_i < 1000
            dir_num = "0"
          elsif import_id.to_i > 1000
            dir_num = import_id.first
          end
        
          avatar_filename = "#{import_id}.jpg"
          file_path = "#{AVATAR_DIR}/l/#{dir_num}"
          file_path_and_name = "#{file_path}/#{avatar_filename}"

          if File.exists?(file_path_and_name)
            upload = create_upload(u.id, file_path_and_name, avatar_filename)
            if upload.persisted?
              u.import_mode = false
              u.create_user_avatar
              u.import_mode = true
              u.user_avatar.update(custom_upload_id: upload.id)
              u.update(uploaded_avatar_id: upload.id)
            else
              puts "Ошибка: загрузка не была сохранена для #{u.username} #{avatar_filename}!"
            end
          end
        end
      end
    end
  end

У меня сейчас очень поздно, поэтому я мог допустить ошибки или что-то упустить. Здесь предполагается, что все аватары в формате .jpg (кажется, у меня все именно такие). Я не был уверен насчет переключателей u.import_mode, поэтому просто закомментировал их.

Совершенно не протестировано (уже почти 5 утра :zzz:)

Я провёл тест на своей dev-машине на форуме с 100 тысячами сообщений, и это заняло 90 минут. На форуме, который я хочу импортировать, несколько миллионов сообщений, так что, возможно, в 10 раз дольше?

Отлично! Будете ли вы делиться им с нами? Есть ли какие-то сроки?

4 лайка

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

5 лайков

Пошаговое руководство также было бы очень полезно, пожалуйста :).

1 лайк

Для 5 тысяч постов и примерно 600 вложений на старом процессоре Xeon и SSD-диске это заняло около 10 минут. Я бы взял достаточно мощный сервер, выполнил импорт в офлайн-режиме и дал ему поработать.

5 лайков

Отлично! С нетерпением ждем этого.

1 лайк

Хорошо, я провёл очень быстрый тест, и изменения в скрипте, похоже, сработали. Сейчас делаю полноценный тест с несколькими тысячами участников и 100 тысячами постов. Сообщу, если всё сработает…

1 лайк

Привет, что нового? Если нужна помощь с тестированием, буду рад помочь.

При запуске скрипта XenForo возникает ошибка, что таблица users не существует. Буду очень благодарен за помощь!

Читаю об этом уже час, но так и не разобрался.

В верхней части скрипта есть несколько переменных, которые необходимо заполнить, чтобы он мог подключиться к вашей базе данных MySQL XenForo и выполнить запрос к данным. Скорее всего, «import_db» — это значение-заполнитель; убедитесь, что эти значения указаны правильно.

3 лайка

@Ghan Я думал, что импортирую в import_db с помощью этой команды: mysql -u root -p import_db < /shared/db.sql

Мой файл xenforo.rb выглядит так:

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

4 лайка

@Ghan Спасибо!

Сейчас я всё ещё застрял на скрипте импорта.
Он проходит по пользователям и категориям — всё хорошо. Однако в функции import_posts процесс просто зависает, и через несколько часов происходит тайм-аут.

Начинаю отладку, просто выводя значения внутри import_posts:

Все сообщения после присваивания переменной results никогда не выводятся.

На всякий случай, если кто-то ищет способ импортировать форум vb3, это руководство может помочь, если у вас также есть лицензия XenForo:

2 лайка

Импортирует ли этот импортирующий модуль теги из XenForo вместе с темами, к которым они прикреплены?

Всегда полезно посмотреть исходный код.

Думаю, ответ — да (хотя я не очень хорошо знаком со структурами данных XenForo):

3 лайка

Итак, похоже, что хотя бы один раз при определенных условиях тег был импортирован для кого-то. Если вам повезет, это сработает и для вас!

3 лайка