Migrate an SMF2 forum to Discourse

Извините, что отвечаю снова. Я не могу понять, почему не создаются постоянные ссылки. :frowning:

Кратко:
Я использую стандартные «некрасивые» URL в SMF2 на корневом домене верхнего уровня. Discourse установлен на поддомене этого корневого домена. Я использовал импортер smf2.rb из последней версии репозитория Discourse для конвертации SMF2 в Discourse (следуя вашему руководству), но после завершения импорта постоянных ссылок в Discourse нет.

Нужны ли какие-либо дополнительные шаги, например, определённые настройки или работающие плагины в SMF2 или Discourse?

Похоже, эта функция предназначена для красивых URL? Значит, её нужно соответствующим образом изменить (если только я не упустил что-то в коде).

1 лайк

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

Вот функция красивых URL в скрипте импорта: discourse/script/import_scripts/smf2.rb at main · discourse/discourse · GitHub

Надеюсь на помощь, чтобы это заработало для стандартных «некрасивых» URL в SMF… буду очень признателен за любые подсказки. :pray: Спасибо, ребята.

Я не знаю. Но мой лучший бесплатный ответ — я думаю, что вам стоит обратить внимание на строку 222, в которой написано:

           Permalink.find_or_create_by(url: "forums/index.php/board,#{c["id_board"]}.0.html", category_id: category.id)

Вам нужно изменить эту постоянную ссылку (или, возможно, несколько других?) на то, как выглядят ваши «уродливые» ссылки? Хотя, на мой взгляд, это уже выглядит довольно уродливо. Возможно, вам также стоит настроить permalink_normalizations в верхней части файла.

Извини, Джей, что отвечаю тебе снова, но где строка 222? В строке 222 файла smf2.rb только:

if parent

Что ж, значит, мы с вами смотрим на разные версии. Не уверен, почему так вышло. Но на что стоит обратить внимание, так это на строки, касающиеся Permalink.

Я запутался, потому что версия, на которую я дал ссылку, кажется самой последней «официальной» версией… но вы уже второй человек, который упомянул другую версию. Что я упускаю? Где я могу получить вашу версию?

Ага! Извините. Похоже, я нажал на скрипт smf1. Посмотрите на smf1.rb1, который находится рядом со скриптом smf2.rb, на который вы смотрите.

Вы можете либо изучить скрипт smf1, либо использовать make_prettyurl_permalinks в качестве образца для создания make_uglyurl_permalinks. Однако это чтение из таблицы красивых URL, поэтому, возможно, будет проще использовать smf1.rb в качестве образца, но мне пришлось бы посмотреть на базу данных, чтобы сказать наверняка. Нет. Это тоже не сильно поможет, если вы не измените функции create_xxx.

Извините. Я не вижу решения, которое можно было бы объяснить здесь.

1 лайк

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

su discourse -c "bundle exec ruby script/import_scripts/smf2.rb /shared/smf2 -t UTC"
Загрузка существующих групп...
Загрузка существующих пользователей...
Загрузка существующих категорий...
Загрузка существующих постов...
Загрузка существующих тем...
Traceback (most recent call last):
        7: from script/import_scripts/smf2.rb:701:in `<main>'
        6: from script/import_scripts/smf2.rb:28:in `run'
        5: from script/import_scripts/smf2.rb:28:in `new'
        4: from script/import_scripts/smf2.rb:62:in `initialize'
        3: from script/import_scripts/smf2.rb:274:in `create_db_connection'
        2: from script/import_scripts/smf2.rb:274:in `new'
        1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect': RSA Encryption not supported - caching_sha2_password plugin was built with GnuTLS support (Mysql2::Error)

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

Контейнер Docker с MySQL имеет версию 8, и по какой-то причине библиотека mariadb, которую использует шаблон MySQL, не работает.

Я не включил файл шаблона MySQL в конфигурационный файл импорта контейнера Docker — это было первое изменение.

Я собрал контейнер импорта, зашёл в него с помощью команды ./launcher enter import.

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

echo "gem 'mysql2'" >> Gemfile
wget https://dev.mysql.com/get/mysql-apt-config_0.8.17-1_all.deb
dpkg -i mysql-apt-config_0.8.17-1_all.deb

Это запускает интерактивный запрос, где можно выбрать настройки по умолчанию (MySQL 8 с инструментами).

Затем я установил стандартную библиотеку MySQL 8 и продолжил сборку:

apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y libmysqlclient-dev
su discourse -c 'bundle config unset deployment'
su discourse -c 'bundle install --no-deployment --path vendor/bundle --jobs 4 --without test development'

После завершения всех этих шагов остальная часть процесса осталась прежней, и импорт теперь работает.

Разработчикам Discourse, возможно, стоит адаптировать скрипты импорта с учётом этой проблемы. По крайней мере, теперь это опубликовано на форуме, чтобы другие могли увидеть решение, если столкнутся с той же проблемой.

3 лайка
  1. Удалить согласно этим инструкциям? how-to-migrate-import-from-smf2-to-discourse/90129#cleanup-5

  2. Я вручную перенёс директорию вложений из smf2 в Discourse перед импортом, затем запустил импортер один раз, но загрузки не отображаются в постах в Discourse. Есть какие-то идеи, почему?

  3. Я уже запускал импортер один раз без включения S3, но хочу использовать S3. Что мне делать?

  1. Да
  2. Хм… Я бы попробовал включить S3 и импортировать заново.
  3. Включите S3 перед началом импорта.
1 лайк

Я уже запускал импортер один раз, но без S3. Будут ли загружены в S3 файлы из тем, которые уже были импортированы, во время дельта-импорта?

Лучше всего начать заново и включить S3 перед импортом.

При создании пользователей возникает следующая ошибка:

oxipng worker: oxipngне найден; пожалуйста, предоставьте правильный бинарный файл или отключите этого воркера (аргумент --no-oxipng или опция:oxipng => false`)

После этого начинается создание постов.

  • Может ли это быть причиной того, что вложения не отображаются в Discourse?
  • Где должен быть установлен oxipng?

Обновление: Я не понимаю, почему возникает эта ошибка oxipng. Я не могу найти ничего об этом нигде в Discourse, и эта проблема возникает только при запуске скрипта импорта smf2. Возможно, это как-то связано с этим? https://meta.discourse.org/t/faster-and-smaller-uploads-in-discourse-with-rust-webassembly-and-mozjpeg-blog

Это просто предупреждение от библиотеки оптимизации изображений, которую мы используем на стороне сервера; оно не должно блокировать ничего.

2 лайка

Я думал, что проблемы с импортом могут быть связаны с S3, но оказывается, что S3 работает вполне нормально. Проблема в том, что после запуска скрипта импорта (с включённым S3) и пересборки контейнера импорта все темы в Discourse лишаются вложений, которые в темах smf2 являются вложениями. Другими словами, нет никакого визуального сигнала о том, что в теме Discourse есть вложение, хотя в соответствующей теме smf2 оно явно видно как вложение. Тот же результат получается и при импорте с отключённым S3. Чуть-чуть зашёл в тупик. :confused: Есть какие-то идеи?

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

Вы имеете в виду, что нужно отредактировать пост в SMF2, добавив ссылки на вложенные файлы, прежде чем импортировать их в Discourse?

Ну, это может быть одним из способов.

Но я имею в виду модифицировать скрипт импорта так, чтобы он добавлял вложение к исходному сообщению. Что-то вроде