Migrate an SMF2 forum to Discourse

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

Проблемы с правами доступа Unix в папке вложений

Импортер SMF2 работал нормально, но возникла небольшая сложность, связанная с правами доступа Unix для вложений. При запуске скрипта импорта он выполняется от имени пользователя discourse, который не обязательно имеет одновременно права на чтение и запись для тома с вложениями.

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

Отладка неудачных загрузок затруднена

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

Причины могут включать:

  • Вложения находятся не в том месте файловой системы.
  • Недостаточные права доступа к вложениям (требуется rw).
  • Неправильно настроена точка монтирования Docker-тома.
  • База данных SMF2 сообщает, что должно существовать вложение, которого больше нет в папке с вложениями (в нашем форуме SMF2, которому около 20 лет, было довольно много «потерянных» вложений — с ними мало что можно сделать…)
  • Объект загрузки не сохраняется корректно в базе данных Discourse или на диске в /shared/standalone/uploads.
  • Не создаётся разметка Markdown для ссылки на загрузку.

Я отладил это, протестировав каждый шаг процесса работы с вложениями от начала до конца и добавив огромное количество дополнительных отладочных операторов puts в код smf2.rb, чтобы выяснить, какая часть процесса создания загрузки не работает. В моём случае было множество мелких проблем, которые в итоге были устранены по одной.

Не будь ленивым, Маркус

И в самом конце я проявил лень и не полностью очистил базу данных до нуля, поэтому возникла проблема: всё успешно выполнялось — но импортер не перезаписывает тему или пост, которые уже были импортированы. Поэтому разметка Markdown, ссылающаяся на загрузку, которая должна выглядеть так:

---

![file-name.jpg|357x268](upload://oK9TCvNVoojGyr357Amh19Cz.jpeg)

не вставлялась в посты.

Чтобы исправить это, я сбросил базу данных экземпляра Discourse до состояния до импорта. Рекомендуется делать это, просто удалив всё в shared/standalone, но это лишило бы меня всех настроек, брендинга, тем, конфигурации, начальной настройки и довольно большого количества тем, импортированных вручную из ещё одного форума, который у них тоже есть. Поэтому вместо этого я восстановил очень раннюю резервную копию, сделанную до начала импорта, что сработало. Это немного более рискованный подход, поскольку старые резервные копии не всегда гарантированно совместимы, если вы также не откатите установленную версию Discourse. Это сработало, и я смог снова запустить импорт: все доступные вложения были успешно загружены, и ссылки на загрузку в формате Markdown были корректно вставлены.

Проверка работоспособности

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

Post.where("raw LIKE ?", "%upload://%").count

в консоли Rails. Она возвращает количество постов, в которых действительно есть корректная ссылка на загрузку, и это число постепенно увеличивается в процессе импорта, что успокаивает.

2 лайка