Перенесите темы с одного экземпляра Discourse на другой

Нужно перенести данные из одного экземпляра Discourse в другой?

Существует инструмент командной строки для экспорта темы, набора тем или целой категории, а также другой инструмент для их импорта на стороне получателя.

Экспорт/импорт тем

  • одна или несколько тем и их ответы
  • пользователи, публиковавшие сообщения в теме

Экспорт/импорт категорий

  • категория и все её подкатегории
  • настройки безопасности
  • пользовательские группы, указанные в настройках безопасности
    • :warning: если у какой-либо группы включены «запросы на вступление», процесс завершится ошибкой. Отключите эту функцию перед экспортом
  • все темы и сообщения в категории и подкатегориях
  • все пользователи, публиковавшие сообщения, и они будут назначены в соответствующие группы

Начало: Определите идентификаторы

Сначала определите ID(ы) =Экспорта=, который вы хотите экспортировать. Его можно найти в конце URL-адреса, используемого для доступа к нему.

  • https://meta.discourse.org/t/how-to-contribute-to-discourse/53797

  • https://meta.discourse.org/t/how-to-contribute-to-discourse/53797/12
    (в этом случае вы находитесь в середине темы — возьмите первое число)

  • https://meta.discourse.org/c/howto/faq/4

Идентификатор(ы) категории или темы

Несколько тем

Вы можете выбрать более одной темы, добавив идентификаторы через пробел; это работает в поле выше (хотя, я думаю, это не работает для категорий):

  • 53797 200943 124096

Запуск скрипта экспорта

Инструмент можно запускать от имени пользователя root внутри контейнера:

cd /var/discourse
./launcher enter app

Выполните эту команду:

discourse export_=Export= =ID=

Вывод должен выглядеть примерно так:

Starting export of =Export=…

Where are the new users all coming from?
Export saved to =Export=-export-2021-08-27-015437.json

Done

Перемещение экспортированного файла

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

Копирование его на «внешнюю» сторону

Выйдите из контейнера, если ещё не сделали этого

exit

Теперь у вас должен быть приглашение вида:

root@yourserver:/var/discourse

Используйте docker для копирования файла из контейнера (я думаю, переместить его нельзя)

docker cp app:/var/www/discourse/=FileName= .

Перемещение его на другой экземпляр

Это выходит за рамки данного руководства, но это может помочь вам в этом:

Копирование его в контейнер на экземпляре-получателе

Подключитесь по SSH к вашему экземпляру-получателю от имени root и перейдите в каталог Discourse:

cd /var/discourse

Ещё раз используйте docker для копирования файла в другой контейнер

docker cp =FileName= app:/var/www/discourse

Импорт контента

Войдите в контейнер на экземпляре-получателе:

./launcher enter app

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

discourse import_=Export= =FileName=

:cake: Готово!

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

Дополнительные советы

Отсутствующий Ruby Gem

При выполнении сложного импорта категории в моём экземпляре отсутствовал Ruby ‘Listen’.
Это было решено следующим образом: (используя пользователя discourse внутри контейнера)

./launcher enter app
su discourse
bundle config --delete without
bundle config --delete with
bundle install
exit
exit

Это привело к поломке rails console, что потребовало пересборки после этого

./launcher rebuild app

Мультисайт

В среде мультисайта используйте переменную окружения RAILS_DB.

RAILS_DB=xxxmoves discourse export_=Export= =ID=
RAILS_DB=dancerehab discourse import_=Export= =FileName=

Пожалуйста, сообщайте об ошибках в категории Contribute > Bug и запрашивайте улучшения в категории Contribute > Feature.


Связанные темы


Последний раз проверено @SaraDev 2022-07-13T00:00:00Z

45 лайков
UI: Topic and Category Export/Import
CLI command to migrate a single category
Moving topics between sites?
Category/Topic export fails with error "database "discourse_development" does not exist"
Easiest way to export a single topic?
Saving a Conversation
Migrate user custom fields to another instance
Error Importing Categories from a Discourse Instance to Another
How to export user data from a category on a hosted site
Import CSV User Activity from one Discourse to Another
How use API to convert topic in discourse1.com to discourse2.com
Can sub-forums of the same instance split up and move to new independent servers (or discourse instances)?
Help migrating category from one instance to another without admin on the source instance
I wonder how to add hundreds of users into a group? Is there any api?
Adding default sets of topics, categories and users to a new Discourse
Downloading Content
Can we combine 2 separate discourse sites?
Tracking and resolving a schema drift cause
Merge two Discourse forums into one
Moving topics from a forum on one website to a forum on another website
Transfer topics between forums?
Forum Aquisition
Transfering inbox group messages to another instance?
Transfering inbox group messages to another instance?
Imported categories are not in parent category
Copy categories / topics
How to download Comments and Topics
Selective backups skipping settings and config
Test driving admin/moderation features
Add backup to existing Discourse instance
Merging two Discourse forums
Migrating vBulletin onto existing and live Discourse instance
Migrate topics from one discourse instance to another?
A system where people have to start at lesson 1, and cannot see the other lessons?
How to divide my community into 2 parts

Я снова собираюсь взяться за это.

Есть ли простой способ перенести соответствующие загрузки вместе с темами?

Не совсем. В большинстве случаев работает следующий метод: если вы получите все эти загрузки и вставите URL оригинала в любой пост на сайте, куда переносите данные, то должно произойти следующее — эти загрузки будут созданы с тем же SHA, и всё заработает.

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

Хм, я всё ещё немного запутался. Вы имеете в виду, что это сработает?

  1. Загрузить все файлы с первого сайта
    • как именно?
  2. Разместить их в одной теме
  3. Они сгенерируют те же относительные ссылки, что и на старом сайте, и всё сработает как по волшебству!

Или вы имели в виду вот что?

  1. Извлечь все абсолютные URL из интересующих вас категорий на старом сайте
  2. Вставить их в тему
  3. Все они будут загружены на новый сайт с тем же хешем SHA, и существующие ссылки продолжат работать как по волшебству

Или речь идёт о чём-то совершенно другом?

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

Может быть, стоит попробовать что-то вроде:

cat_id = 123
Topic.where(category_id: cat_id).each do |t|
  Post.where(topic_id: t.id).each do |p|
    p.cooked.match(image_url)....
      puts(match)
  end
end

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

Сейчас глубокая ночь. Результаты могут отличаться.

1 лайк

Здравствуйте, я не уверен, что этот урок соответствует моим целям, но задам вопрос здесь.

Если я установлю Discourse на сервер, но из-за роста потребуется миграция на более мощный, будут ли это следующие шаги?

Что, например, происходит с опцией резервного копирования? Разве я не могу сделать резервную копию, установить Discourse на другом сервере, а затем восстановить резервную копию с другого экземпляра через эту опцию?

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

Нет. Для переноса на более мощный сервер достаточно простого резервного копирования и восстановления. Вы также можете перенести сайт Discourse на другой VPS с помощью rsync