Миграция форума NodeBB с Redis на Discourse

Этот учебник покажет вам, как использовать импортер NodeBB для миграции форума NodeBB на платформу Discourse. Если ваш форум NodeBB использует MongoDB в качестве бэкенда, следуйте этому руководству. Не волнуйтесь, это простой процесс. Давайте начнем.

План действий

  • Подготовка среды разработки.
  • Экспорт базы данных из производственной среды.
  • Импорт производственной БД в экземпляр Discourse.
  • Запуск скрипта импортера.

Какие данные могут быть перенесены?

  • Группы
  • Категории
    • Корневая категория => Корневая категория
    • Подкатегория и под-подкатегория => Подкатегория
  • Вложения
  • Темы и сообщения
    • закрепленная тема => закрепленная тема
    • просмотры темы
    • все стили будут перенесены корректно, включая упоминания, эмодзи и вложения.
  • Пользователи (со следующими атрибутами)
    • аватары (фото профиля)
    • фон профиля
    • статус блокировки
    • имя
    • имя пользователя
    • электронная почта
    • биография
    • статус администратора
    • веб-сайт
    • местоположение
    • дата вступления
    • группа

Подготовка локальной среды разработки

Настройте среду разработки, следуя одному из этих руководств:

В дальнейшем мы будем называть эту среду сервером Discourse.

:bulb: Пожалуйста, используйте это руководство, если у вас возникли проблемы с настройкой Discourse.

Экспорт дамп базы данных производства (с сервера NodeBB):

Остановите ваш форум. Это рекомендуется NodeBB.

$ cd /path_to_nodebb
$ ./nodebb stop

Также следует остановить Redis:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server is not running

Ваша БД форума находится в одном файле. Этот файл автоматически генерируется Redis периодически. Обычно он находится в /var/lib/redis/dump.rdb. Также вы можете получить путь через Redis CLI:

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"
127.0.0.1:6379> exit
$ ls -la /var/lib/redis
# -rw-rw-r-- 1 redis redis 2664346 Aug 4 16:24 dump.rdb

:bulb: Если ваш сервер Redis требует пароль, используйте AUTH ВАШ_ПАРОЛЬ.

:bulb: Если по какой-то причине вы не нашли файл БД в ожидаемом пути, вы можете сгенерировать его вручную, выполнив команду SAVE внутри Redis CLI.

Теперь вам нужно скопировать вложения форума:

$ cd /path_to_nodebb_root_folder/
$ tar -czf ./uploads.tar.gz ./public/uploads

Теперь, когда у вас есть БД и ресурсы форума, вам нужно скопировать их на сервер Discourse.

Импорт базы данных

Если вы следовали инструкциям по установке Discourse, у вас должен быть установлен сервер Redis на сервере Discourse:

$ redis-server -v
# Redis server v=5.0.2...

Теперь необходимо остановить сервер Redis (это важно).

Для систем на базе Linux:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server is not running

Для Mac OS:

$ brew services stop redis
$ brew services list
# redis stopped

Что нужно сделать дальше, так это скопировать БД форума в локальный путь Redis DB на вашем сервере. Импортеру необходимо подключиться к серверу Redis и перенести БД NodeBB в БД Discourse. Этот шаг предполагает, что в вашей Redis БД нет ничего важного; в противном случае следует сделать резервную копию.

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"

Проверьте наличие файлов и запишите текущего пользователя и права доступа для dump.rdb:

$ ls -la /var/lib/redis

Скопируйте БД NodeBB (замените, если она уже существует):

$ cp dump.rdb /var/lib/redis

Позже при попытке подключиться к серверу Redis вы можете получить ошибку Fatal error loading the DB: Permission denied, поэтому вам следует изменить права доступа к файлу dump.rdb:

# Замените пользователя на тот, который вы записали ранее.
$ sudo chown redis:redis /var/lib/redis/dump.rdb
$ sudo chmod 660 /var/lib/redis/dump.rdb

Теперь нужно распаковать uploads.tar.gz в любой выбранный вами путь:

$ tar xvzf uploads.tar.gz

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

Теперь, когда база данных на месте, мы готовы запустить скрипт импортера. Перед этим необходимо отредактировать некоторые настройки. Скорее всего, вам нужно изменить только следующие две строки.

Это путь к папке с вложениями NodeBB:

ATTACHMENT_DIR = '/absolute_path/uploads'

Это имя базы данных в Redis. По умолчанию это 0:

db: 0

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

$ cd ~/discourse
$ bundle exec rake db:drop db:create db:migrate
$ bundle exec ruby script/import_scripts/nodebb/nodebb.rb

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

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

$ bundle exec rails server

Запустите Sidekiq для обработки перенесенных данных:

$ bundle exec sidekiq

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

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

Таким образом, вы успешно выполнили полную миграцию с NodeBB на Discourse :tada:
Если у вас возникнут вопросы, я с радостью помогу :slight_smile:

9 лайков

Я постоянно напоминаю о своей миграции в разных темах :smiley:

У меня есть форум на NodeBB с Redis, и мне удалось завершить процесс без ошибок в версии для разработки, но у меня всё ещё есть несколько вопросов:

  • В скрипте миграции я правильно указал абсолютный путь к изображениям и файлам форума. После завершения миграции я заметил, что изображения не отображаются в темах. В Discourse они ссылаются на URL: assets/uploads, но там ничего нет.

    В версии для разработки я решил эту проблему, создав символическую ссылку:
    ln -s path/to/images public/assets

    Но в версии для производства что мне нужно сделать, чтобы создать ссылку из assets/upload внутри Docker на папку, где я разместил старые изображения?

  • Кажется, что все темы форума были успешно перенесены, но я не вижу прямых сообщений между пользователями… Они не включены в миграцию?

  • Скрипт не обнаружил ни одного аватара пользователя.

  • И наконец, на новом форуме я не вижу встраивания видео с YouTube или твитов. Нужно ли мне для этого установить плагин?

Большое спасибо за помощь.

Это не должно быть необходимо. Если у вас есть оригинальные изображения по пути, указанному в ATTACHMENT_DIR, Discourse создаст загрузку (фактически, копию файла) в path-to-your-install/discourse/public/uploads/default/. Если вы проверите таблицу Uploads, она должна выглядеть так:

[1] pry(main)> Upload.last
  Upload Load (1.5ms)  SELECT "uploads".* FROM "uploads" ORDER BY "uploads"."id" DESC LIMIT 1
=> #<Upload:0x0000000109a460a0
 id: 196,
 user_id: 251468,
 original_filename: "Screenshot 2023-11-17 at 11.52.39.png",
 filesize: 25174,
 width: 398,
 height: 248,
 url: "/uploads/default/original/1X/2e5f7a09ba3bcd3a3597285771c53c16f20b18dd.png",
 created_at: Fri, 17 Nov 2023 19:12:47.455954000 UTC +00:00,
 updated_at: Fri, 17 Nov 2023 19:12:47.484137000 UTC +00:00,
 sha1: "2e5f7a09ba3bcd3a3597285771c53c16f20b18dd",

Верно, похоже, что скрипт NodeBB не мигрирует личные сообщения. Вы можете проверить другие скрипты, чтобы узнать, как импортируются личные сообщения, например, посмотрите скрипт для Vanilla.

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

Плагин не нужен. Скорее всего, вам нужно перезаписать ваши сообщения. Вы можете подождать, пока Sidekiq сделает это автоматически, или запустить полную перезапись из консоли:

rake posts:rebake

Скрипт для NodeBB не обновлялся несколько лет, поэтому, скорее всего, некоторые его части устарели и требуют модификации, чтобы работать с вашими данными. Надеюсь, это поможет!

1 лайк