Migrate a mailing list to Discourse (mbox, Listserv, Google Groups, etc)

Спасибо за это руководство и скрипт импорта! Я успешно использовал его с группой Google, применяя Google Takeout. Я просто поместил файл .mbox в нужную директорию и запустил скрипт.

У меня возник вопрос об импорте писем, у которых есть родительские сообщения, отсутствующие в .mbox. Например, во многих темах нашей группы обсуждения начинаются с пересланного письма, которое не было отправлено в группу, или группа добавляется в список получателей ответа в середине беседы, чтобы вовлечь её в обсуждение.

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

1 лайк

Вам потребуется найти способ сгенерировать эти сообщения из цитируемого текста и добавить их в файл mbox (вероятно, с заголовками Id), прежде чем запускать скрипт импорта.

1 лайк

Это действительно отлично. Однако у меня возникли проблемы с некоторыми письмами, поступающими в Discourse: в одном посте сначала идет исходное письмо, а затем ответы в формате mbox, которые не отформатированы. Не уверен, что именно вызывает это.

Вопрос в том, как удалить все импортированные письма (за 20 лет), не удаляя и не создавая заново целевой экземпляр Discourse?

Я знаю, что рекомендуемый объем оперативной памяти составляет 8 ГБ. Я пробовал импортировать 20 лет постов на виртуальную машину с 2 ГБ памяти: она работала какое-то время, а затем упала с сообщением «killed». Машины с 8 ГБ у хостинг-провайдеров, таких как DigitalOcean, дороги (для меня). Есть ли способ сделать это с меньшим объемом памяти? Например, импортировать меньшими порциями?

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

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

1 лайк

Я знаю, что активность в этой теме невелика, но мне не удаётся заставить всё работать правильно. Многие импортируемые письма в формате mbox не разделяются корректно. Строки From выглядят так:

From MAILER-DAEMON Tue Nov 01 05:57:09 2022

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

Я не понимаю, как действовать дальше. Нужно импортировать 20 лет переписки, поэтому вручную исправлять каждое импортированное сообщение невозможно. Короче говоря, этот скрипт для меня не работает. Почему это происходит только со мной?

Вы не одиноки. Моя первая оплачиваемая работа в Discourse заключалась в том, чтобы месяцами чистить старые файлы mbox, которые каким-то образом редактировались вручную, хотя я уже не помню зачем.

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

Кстати, я написал несколько скриптов импорта ещё до того, как выучил Ruby.

Каждый импорт уникален. При наличии 20 лет данных вполне вероятно, что у вас возникнет несколько разных проблем, так как в различных используемых системах со временем всё менялось.

2 лайка

Безусловно. Это точно.

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

Могу ли я импортировать их все под одним идентификатором пользователя (например, ‘archive’)?

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

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

Вы не сэкономите много места.

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

1 лайк

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

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

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

3 лайка

Это справедливое замечание, Джей.

Я не могу найти файл import_mbox.sh, а при попытке запустить скрипт mbox.rb напрямую получаю множество ошибок Ruby:

root@lists-import:/var/www/discourse/script/import_scripts# ruby mbox.rb mbox
fatal: обнаружена сомнительная принадлежность репозитория в ‘/var/www/discourse’
Чтобы добавить исключение для этой директории, выполните:

    git config --global --add safe.directory /var/www/discourse

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/zeitwerk-2.6.7/lib/zeitwerk/loader/callbacks.rb:25:in `on_file_autoloaded’: ожидалось, что файл /var/www/discourse/lib/freedom_patches/pluck_first.rb определит константу FreedomPatches::PluckFirst, но этого не произошло (Zeitwerk::NameError)

  raise Zeitwerk::NameError.new(msg, cref.last)

Приветствую, друзья. Какая замечательная инструкция. Спасибо Герхарду и другим за вклад.

Кто-нибудь из вас адаптировал это для Lyris? Я планирую миграцию исторической установки и хотел бы понять, столкнулись ли они с какими-либо особыми проблемами в аналогичном проекте.

Мне нужно было импортировать сообщения из рассылки в Discourse, и я столкнулся с двумя проблемами.

  • Не был найден sqlite3.
  • Я не мог найти import_mbox.sh.

Вот мои решения:

Установка sqlite3

Я добавил в Gemfile:

 gem "sqlite3", "~> 1.3", ">= 1.3.13"

затем выполнил:

cd discourse
bundle config set frozen false
bundler install

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

cd discourse
RAILS_ENV=production bundle exec rails runner script/import_scripts/mbox.rb script/import_scripts/mbox/settings.yml
1 лайк

Вы, вероятно, пропустили следующий шаг, который скрыт за пунктом «Обычный импорт» в разделе 1.2. Подготовка Docker-контейнера.

1 лайк

Я получаю ошибку can't modify frozen String. Может, кто-нибудь подскажет, как это исправить, или поймёт, что я делаю не так?

root@sajcf:~# /var/discourse/launcher stop app
x86_64 arch detected.
+ /usr/bin/docker stop -t 600 app
app
root@sajcf:~# /var/discourse/launcher enter import
x86_64 arch detected.
root@sajcf-import:/var/www/discourse# import_mbox.sh
The mbox import is starting...

Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...

creating index
indexing files in /shared/import/data/jjcf
indexing /shared/import/data/jjcf/SAJCF.mbox

indexing replies and users

creating categories
/var/www/discourse/script/import_scripts/base.rb:447:in `strip!': can't modify frozen String: "jjcf" (FrozenError)
        from /var/www/discourse/script/import_scripts/base.rb:447:in `block in create_categories'
        from /var/www/discourse/script/import_scripts/base.rb:438:in `each'
        from /var/www/discourse/script/import_scripts/base.rb:438:in `create_categories'
        from /var/www/discourse/script/import_scripts/mbox/importer.rb:50:in `import_categories'
        from /var/www/discourse/script/import_scripts/mbox/importer.rb:34:in `execute'
        from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        from script/import_scripts/mbox.rb:13:in `<module:Mbox>'
        from script/import_scripts/mbox.rb:11:in `<module:ImportScripts>'
        from script/import_scripts/mbox.rb:10:in `<main>'

Вы можете поискать в Google, как это решить. Я думаю, что .dup может быть простым способом.

1 лайк

Чтобы быть более конкретным, я успешно модифицировал код, который позволил импорт, добавив .dup в строке 447 файла /var/www/discourse/script/import_scripts/base.rb:

params[:name].dup.strip!

Один момент остаётся неясным: как я могу импортировать данные в один из сайтов мульти-сайта?

У кого-нибудь возникала ошибка «can’t modify frozen String»? Мой файл index.db создается без проблем, но процесс падает при создании категорий.

root@xxxxxxxxxx:/var/www/discourse# import_mbox.sh

Начинается импорт mbox...

Загрузка существующих групп...

Загрузка существующих пользователей...

Загрузка существующих категорий...

Загрузка существующих сообщений...

Загрузка существующих тем...

создание индекса

индексирование файлов в /shared/import/data/xxxxx-xxxxxxx@xxxxxxx.com

индексирование /shared/import/data/xxxxx-xxxxxxx@xxxxxxx.com/export.mbox

индексирование ответов и пользователей

создание категорий

/var/www/discourse/script/import_scripts/base.rb:447:in `strip!': **can't modify frozen String: "xxxxx-xxxxxxx@xxxxxxx.com" (****FrozenError****)**

из /var/www/discourse/script/import_scripts/base.rb:447:in `block in create_categories'

из /var/www/discourse/script/import_scripts/base.rb:438:in `each'

из /var/www/discourse/script/import_scripts/base.rb:438:in `create_categories'

из /var/www/discourse/script/import_scripts/mbox/importer.rb:50:in `import_categories'

из /var/www/discourse/script/import_scripts/mbox/importer.rb:34:in `execute'

из /var/www/discourse/script/import_scripts/base.rb:47:in `perform'

из script/import_scripts/mbox.rb:13:in `\u003cmodule:Mbox\u003e'

из script/import_scripts/mbox.rb:11:in `\u003cmodule:ImportScripts\u003e'

из script/import_scripts/mbox.rb:10:in `\u003cmain\u003e'