# Migrate an SMF2 forum to Discourse

**URL:** https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314
**Category:** Sysadmins
**Tags:** how-to
**Created:** [20.Июнь.2018 14:26:51 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314 "2018-06-20T14:26:51Z")
**Posts on this page:** 2
**Page:** 6

<div class="post-metadata">

### Author: ![pacharanero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pacharanero/32/500583_2.png) [@pacharanero](https://meta.discourse.org/u/pacharanero)
#### Post date: [26.Июнь.2025 14:03:57 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/104 "2025-06-26T14:03:57Z")

</div>

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

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

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

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

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

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

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

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

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

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

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

```plaintext
---

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

```

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

Чтобы исправить это, я сбросил базу данных экземпляра Discourse до состояния до импорта. Рекомендуется делать это, просто [удалив всё в `shared/standalone`](https://meta.discourse.org/t/resetting-discourse-instance/128593/2), но это лишило бы меня всех настроек, брендинга, тем, конфигурации, начальной настройки и довольно большого количества тем, импортированных вручную из **ещё одного** форума, который у них тоже есть. Поэтому вместо этого я восстановил очень раннюю резервную копию, сделанную до начала импорта, что сработало. Это немного более рискованный подход, поскольку старые резервные копии не всегда гарантированно совместимы, если вы **также** не откатите установленную версию Discourse. Это сработало, и я смог снова запустить импорт: все доступные вложения были успешно загружены, и ссылки на загрузку в формате Markdown были корректно вставлены.

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

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

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

```

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

---

<div class="post-metadata">

### Author: ![marcozambi](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/marcozambi/32/119505_2.png) [@marcozambi](https://meta.discourse.org/u/marcozambi)
#### Post date: [03.Июль.2025 13:32:13 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/105 "2025-07-03T13:32:13Z")

</div>

Приношу извинения за поздний ответ.  
Если вы откроете историю первого сообщения и просмотрите старые версии, то увидите, что шаг 4 был отредактирован и сокращён в ревизии 10. Изменения, которые я внёс в smf2.rb, были удалены, возможно, потому что теперь они исправлены в скрипте миграции Ruby. Я не проверял это дважды, но вполне вероятно, что копирование smf2.rb теперь полностью избыточно.

[Предыдущая страница](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314.md?page=5)
