Миграция форума MyBB на Discourse

В этом руководстве мы узнаем, как мигрировать форум MyBB на платформу :discourse:, используя официальный скрипт импорта MyBB.

Что можно мигрировать

  • Категории
    • Корневая категория => корневая категория
    • Дочерняя категория => подкатегория
    • Корневой форум => подкатегория
    • Дочерний форум => подкатегория
  • Темы и ответы => темы и сообщения
  • Пользователи
    • Имя пользователя
    • Электронная почта
    • Статус привилегий
    • Статус регистрации
  • Перенаправления

Наш план очень прост:

  • Настройка локальной среды разработки (DEV).
  • Экспорт базы данных продакшена.
  • Импорт базы данных продакшена в Discourse.
  • Запуск скрипта импорта MyBB.

Приступим :slightly_smiling_face:

Настройка локальной среды разработки (DEV)

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

Установите сервер базы данных MySQL;

MacOS:

$ brew install mysql@5.7
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

Проверьте статус службы:

$ brew services list

Вы должны увидеть что-то вроде этого:

mysql@5.7         started

В противном случае выполните следующую команду и попробуйте снова:

$ brew services start mysql@5.7

Ubuntu 18.04:

$ sudo apt update
$ sudo apt install mysql-server -y

После завершения установки MySQL проверьте её статус:

$ systemctl status mysql.service

Если она не запущена, выполните следующую команду:

$ sudo systemctl start mysql

Для Windows вы можете следовать официальному руководству по установке.

Мы будем называть эту среду: сервер Discourse.

Экспорт базы данных продакшена

Экспортируйте/сделайте резервную копию базы данных продакшена (с сервера MyBB продакшена), выполнив:

$ mysqldump -u USER_NAME -p DATABASE_NAME > mybb_dump.sql
  • Скопируйте этот дамп базы данных на сервер Discourse.

:bulb: Вы можете использовать scp или rsync для копирования базы данных.

Импорт базы данных продакшена в Discourse

На сервере Discourse создайте базу данных:

$ mysql -u root

:bulb: Если у вашего пользователя БД есть пароль, вы должны использовать: mysql -u root -p, затем ввести пароль.

mysql> CREATE DATABASE mybb;

Убедитесь, что база данных была успешно создана, выполнив:

mysql> SHOW DATABASES;

Вы должны увидеть что-то вроде:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| mybb               |
| sys                |
+--------------------+

База данных mybb пока пуста. Наш следующий шаг — импортировать в неё базу данных продакшена.

$ mysql -u root mybb < mybb_dump.sql

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

$ mysql -u root
mysql> USE mybb;
mysql> SHOW TABLES;

Вы увидите что-то вроде этого:

+--------------------------+
| Tables_in_mybb           |
+--------------------------+
| mybb_adminlog            |
| mybb_adminoptions        |
| mybb_adminsessions       |
| mybb_adminviews          |
| mybb_announcements       |
| mybb_attachments         |
| mybb_attachtypes         |
| ...Остальные таблицы....|
+--------------------------+

Наш префикс таблиц — mybb_, как показывает вывод.

Запуск скрипта импорта MyBB

  • Сначала установим зависимости импортера. На сервере Discourse:
$ cd ~/discourse
$ echo "gem 'mysql2', require: false" >> Gemfile
$ bundle install

Далее вы должны настроить скрипт для корректной работы. Скопируйте и вставьте следующее в ваш терминал (измените значения при необходимости):

export DB_HOST="localhost"
export DB_NAME="mybb"
export DB_PW=""
export DB_USER="root"
export TABLE_PREFIX="mybb_"

У вас есть другой вариант настройки скрипта. Откройте script/import_scripts/mybb.rb в любом удобном редакторе и измените значения внутри двойных кавычек в соответствии с вашими потребностями:

  DB_HOST ||= ENV['DB_HOST'] || "localhost"
  DB_NAME ||= ENV['DB_NAME'] || "mybb"
  DB_PW ||= ENV['DB_PW'] || ""
  DB_USER ||= ENV['DB_USER'] || "root"
  TABLE_PREFIX ||= ENV['TABLE_PREFIX'] || "mybb_"

Запустите импортер с чистой копией Discourse:

$ bundle exec rails db:drop
$ bundle exec rails db:create
$ bundle exec rails db:migrate
$ bundle exec ruby script/import_scripts/mybb.rb

Импортер подключится к серверу MySQL и мигрирует вашу базу данных MyBB в базу данных Discourse.

После завершения работы импортера запустите экземпляр Discourse, выполнив:

$ bundle exec rails server

Далее запустите Sidekiq (процессор фоновых задач) для обработки мигрированных данных:

$ bundle exec sidekiq

:bulb: Вы можете отслеживать прогресс работы Sidekiq по адресу http://localhost:3000/sidekiq/queues.

Настройте ваш продакшен-сервер Discourse, следуя этому руководству.

Сделайте резервную копию платформы Discourse (локальный сервер Discourse) и загрузите её на ваш продакшен-сервер Discourse, следуя этому руководству.

:tada:

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

Удачной миграции :grinning:

9 лайков

Привет! Это выглядит как отличное руководство, но, так как я использую CPanel, а не Linux, и переезжаю с общего хостинга, у меня нет доступа root или SSH к исходному хосту. Однако у меня есть доступ к phpMyAdmin в CPanel, откуда я могу экспортировать базу данных MyBB.
Подойдет ли это?
Нужны ли какие-либо специальные настройки экспорта? И в какую директорию на моем Droplet от DigitalOcean следует скопировать эту базу данных? (Я использую FileZilla)

Да.

Это не имеет значения, домашняя директория подойдёт.

3 лайка

Снова здравствуйте — я могу дойти до этого момента в руководстве:

bundle install

и у меня это завершается ошибкой:

«Не запускайте Bundler от имени root. Bundler может запросить sudo, если это необходимо, и
установка вашего bundle от имени root нарушит работу этого приложения для всех
не-root пользователей на этой машине.
Ваш файл Gemfile не содержит источников для gems. Если вам нужны gems, которых ещё нет на
вашей машине, добавьте в Gemfile строку вроде этой:
source ‘https://rubygems.org
Не удалось найти gem ‘mysql2’ ни в одном из источников gems, указанных в вашем Gemfile.»

Есть какие-либо предложения?

К сожалению, я ничего не знаю о Ruby, Linux или Gemfile, поэтому просто механически выполняю различные задачи настройки Discourse через CLI, следуя инструкциям в руководствах: копирую и вставляю команды через PuTTY, ничего не понимая.

Я работаю на Ubuntu и разворачиваю Discourse на Droplet от DigitalOcean, если это имеет значение?

Также я вижу последующую ссылку на вставку команд экспорта базы данных в «shell». С практической точки зрения, моё текущее соединение PuTTY с сервером = «shell», или требуется какой-то другой интерфейс/консоль?

Хорошо, частично отвечая на свой собственный вопрос, случайные блуждания по форумам подсказывают, что

$ sudo apt-get install libmysqlclient-dev

позволит установить гем mysql2 (что бы это ни было), игнорируя предупреждение о том, что этого не следует делать от имени root.

Преодолев этот этап и перейдя к следующему шагу — вводу команды

$ bundle exec rails db:drop

— я получаю другую ошибку::::

bundler: failed to load command: rails (/usr/local/bin/rails)
Gem::Exception: can’t find executable rails for gem railties. railties is not currently included in the bundle, perhaps you meant to add it to your Gemfile?

Проверив каталог /usr/local/bin/, я вижу, что файл с именем ‘rails’ там точно есть.

Ввод команд sudo gem, gem install rails или $ sudo gem install rails не помогает (согласно различным рекомендациям, которые я нашел по этой ошибке).

Даже вернулся и установил Ruby on Rails с нуля, чтобы убедиться, что все необходимые зависимости присутствуют: How To Install Ruby on Rails with rbenv on Ubuntu 18.04 | DigitalOcean — но улучшений нет, независимо от того, использую ли я версию 2.51 или 2.61.

Здесь я явно не в своей тарелке…

Можу категорически заявить, что следование этой инструкции в точности, как написано, НЕ работает ни для кого, кто выполняет официальные шаги по настройке локальной среды разработки в WSL2 с Ubuntu 18.04 под Windows 10 — почти на каждом шаге возникает ошибка отсутствующей зависимости или «connection refused» или что-то подобное.

С большими трудностями и благодаря поиску в интернете мне удалось дойти до команды:

$ bundle exec ruby script/import_scripts/mybb.rb

но она выдаёт ошибку:

mysql2/client.rb:90:in `connect’: Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2) (Mysql2::Error::ConnectionError)

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

Как мне решить эту проблему и перейти к следующему шагу? Любая помощь будет очень кстати!

1 лайк

Привет! Как загрузить базу данных на мой Droplet в DigitalOcean? Я использовал установку в один клик в DigitalOcean для установки Discourse (Ubuntu).
На моём ПК установлена Windows 10 Home, версия сборки 18362.

Затем я установил MySQL, но теперь не знаю, как «физически» загрузить базу данных Mybb на сервер. Разве нет phpMyAdmin, где можно легко импортировать базу данных? :frowning:

1 лайк

Вам нужно загрузить файл с помощью scp или аналогичного инструмента. Затем выполните команду, например:

  mysql -u user -p password database < filename..sql
3 лайка

Я застрял :frowning:

1 лайк

Это руководство следует обновить, чтобы оно было совместимо с запуском импорта внутри установки Docker, а не на локальной машине для разработки.

5 лайков

Очень жду, когда руководство можно будет запускать в среде на базе Docker :slight_smile:

2 лайка

В итоге я отказался от самостоятельной реализации и нанял разработчика — направил ему все отличные предложения с этого форума (что очень помогло!). Полагаю, он выполнил работу напрямую на моём рабочем сервере Digital Ocean, а не в отдельной тестовой среде (так что я мог легко следить за процессом по мере его работы — пользователи не пострадали, поскольку форум ещё официально не запущен). Иными словами, считаю, что это возможно.

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

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

4 лайка

На случай, если это кому-то поможет: разработчик @rahilqf, которого я нанял, завершил проект, включая перенос пользовательских полей MyBB в пользовательские поля Discourse (что требует установки плагина multi-select-user-field), перевод префиксов постов MyBB в теги Discourse, а также удаление почти всех избыточных тегов MyCode из текста постов MyBB.

Его версия модифицированного скрипта импорта доступна здесь — Скрипт импорта с MyBB в Discourse.

Он также успешно объединил архив Mbox из Yahoo Groups, используя стандартный скрипт импорта для Yahoo, хотя в этом случае вложения, похоже, не были перенесены. В моём случае это не стало серьёзной проблемой.

3 лайка

Я конвертирую пользователей, сообщения, темы и другие данные из базы данных MyBB!

Я следовал этому руководству: Install Discourse on Ubuntu or Debian for Development

но http://localhost:3000/ или http://forum.omaggieconcorsi.com:3000/ не работают.

В любом случае, программа что-то конвертирует, но я не знаю, где затем можно экспортировать данные.
Я не вижу Discourse по адресам http://forum.omaggieconcorsi.com:3000/ или http://localhost:3000/, так как же мне хотя бы экспортировать базу данных с сообщениями, пользователями и т.д. из старого форума MyBB, а затем импортировать её в новый экземпляр Discourse?

Спасибо!

Вы следовали этим инструкциям на том же компьютере, где запущен веб-браузер?

1 лайк

Да, всегда один и тот же компьютер

Хорошо, я следовал этой инструкции на Ubuntu 18.04 с настоящей ОС, установленной на ПК, и localhost:3000 работает!

Но теперь у меня проблема с базой данных MySQL :frowning: Извините…

Я ввожу:

debby@debby-MS-7721: mysql -u root
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

:frowning:

РЕДАКТИРОВАНИЕ: Я установил пароль для root с помощью команды ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';

И в DB_PW я указал пароль пользователя root.

… и теперь создаются пользователи!!

Надеюсь на лучшее, наконец-то это тот самый момент после недель тестирования??

1 лайк

Я пытаюсь импортировать базу данных из MyBB в Discourse. Как и @Paul_King, я не могу заставить это работать на моём сервере DigitalOcean. Следуя этому руководству, я постоянно получаю самые разные ошибки.

Я застрял на попытке выполнить команду:

$ bundle exec rails db:drop
bundler: команда не найдена: rails
Установите отсутствующие исполняемые файлы gem с помощью `bundle install`

Команда bundle install сообщает, что завершена:

$ bundle install
Ваш Gemfile содержит gem mysql2 (>= 0) более одного раза.
Вероятно, следует оставить только один из них.
Хотя сейчас это не проблема, это может вызвать ошибки, если позже вы измените версию одного из них.
Используем bundler 1.16.1
Используем mysql2 0.4.10
Bundle complete! 2 зависимости Gemfile, 2 gem теперь установлены.
Используйте `bundle info [имя_gem]`, чтобы увидеть, где установлен связанный gem.

Попытка вручную установить rails приводит к следующему:

$ gem install rails
Сборка нативных расширений. Это может занять некоторое время...
ОШИБКА: Ошибка при установке rails:
        ОШИБКА: Не удалось собрать нативное расширение gem.

    текущая директория: /var/lib/gems/2.5.0/gems/racc-1.5.2/ext/racc/cparse
/usr/bin/ruby2.5 -r ./siteconf20210110-8155-1ms05r3.rb extconf.rb
mkmf.rb не может найти заголовочные файлы ruby в /usr/lib/ruby/include/ruby.h

extconf завершился с ошибкой, код выхода 1

Файлы gem останутся установленными в /var/lib/gems/2.5.0/gems/racc-1.5.2 для проверки.
Результаты записаны в /var/lib/gems/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/gem_make.out

Это крайне раздражает.


Оставил этот пост открытым и смог установить rails. Затем столкнулся с тысячей других ошибок и сумел их исправить. Ошибки. На. Каждом. Шаге.

Никогда раньше я не испытывал такой чистой ненависти к программному обеспечению. Почему Ruby такой? Это кошмар. Сейчас я застрял на этой ошибке:

$ bundle exec rails db:drop
Traceback (most recent call last):
        1: from /usr/local/bin/bundle:23:in `<main>'
/usr/local/bin/bundle:23:in `load': не удалось загрузить файл -- /usr/share/rubygems-integration/all/gems/bundler-1.16.1/exe/bundle (LoadError)

Кто-нибудь может помочь?

1 лайк

Не очень полезно, но я столкнулся с теми же самыми тупиками — как при попытке настройки в локальной среде разработки (для создания файла базы данных/резервной копии Discourse), так и напрямую на моём сервере Digital Ocean Droplet. В конце концов, после потери десятков часов, я решил, что жизнь слишком коротка, и нанял разработчика на Fiverr (который потратил недели на то, чтобы разобраться, но в итоге справился).

Подозреваю, что у кого-либо просто нет стимулов упростить этот процесс.

Удачи! И надеюсь, что если вам всё-таки удастся это сделать, вы оставите здесь след из хлебных крошек для других, чтобы они могли последовать за вами!

1 лайк

Как вы установили Rails? Вы следовали одному из руководств по разработке? (например, Руководство для начинающих по установке Discourse на Ubuntu для разработки)

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