Migrate an SMF2 forum to Discourse

Может, стоит открыть тикет в Duffield Ocean по поводу неверных символов?

Вы можете использовать SSH-клиент, например PuTTY, или новую оболочку, которая, как я полагаю, входит в состав подсистемы Linux для Windows (в последней версии Windows, которую я использовал, в качестве дескриптора версии был указан год, так что я не смогу помочь). Если у вас Mac, просто откройте терминал и используйте ssh.

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

2 лайка

Спасибо, @pfaffman. Думаю, я свяжусь с ними по этому поводу.

Могу попробовать другой SSH-клиент и посмотреть, будет ли он работать лучше.

База данных не такая уж большая. Она уже час висит в том же состоянии. Я проверил загрузку процессора на сервере — она практически нулевая.

1 лайк

Да, это была проблема! Ещё раз спасибо @pfaffman. Снова двигаемся вперёд…

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

Если прошло уже час, скорее всего, процесс не запущен. Вы можете попробовать выполнить команду, например:

 cat database.sql | mysql
1 лайк

Шаг вперёд, шаг назад.

Pups::ExecError: if [ -z "$LETSENCRYPT_ACCOUNT_EMAIL" ]; then echo "LETSENCRYPT_ACCOUNT_EMAIL ENV variable is required and has not been set."; exit 1; fi failed with return #<Process::Status: pid 1187 exit 1>

У меня не был установлен letsencrypt, поэтому я его установил.

В разделе «Подготовка хоста и контейнера Discourse для импорта» не указано, что нужно раскомментировать строку env для LETSENCRYPT_ACCOUNT_EMAIL и ввести свой адрес электронной почты. Это позволило мне преодолеть эту ошибку.

Продолжая, сейчас я нахожусь на финальном этапе импорта. Я захожу в контейнер для импорта и запускаю скрипт импорта. Он сразу же завершается с ошибкой:

Traceback (most recent call last):
        1: from script/import_scripts/smf2.rb:4:in `<main>'
script/import_scripts/smf2.rb:4:in `require': cannot load such file -- mysql2 (LoadError)

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

РЕДАКТИРОВАНИЕ: Думаю, это может быть связано с тем, что mysql не установлена в контейнере. Я попробовал выполнить ‘gem install mysql2’, но получил ответ:

mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or 'yum install mysql-devel', and try again.

РЕДАКТИРОВАНИЕ 2:
Мне удалось установить mysql2. Сначала пришлось установить инструменты разработки, но предложенный источник был недоступен. Поэтому я выполнил

sudo apt-get install default-libmysqlclient-dev

После этого я смог выполнить

gem install mysql2

Но ошибка осталась прежней. Тогда я попробовал закомментировать эту директиву require в скрипте, чтобы посмотреть, что произойдет. Появилась новая ошибка:

Traceback (most recent call last):
        6: from script/import_scripts/smf2.rb:627:in `<main>'
        5: from script/import_scripts/smf2.rb:19:in `run'
        4: from script/import_scripts/smf2.rb:447:in `parse!'
        3: from script/import_scripts/smf2.rb:502:in `parser'
        2: from script/import_scripts/smf2.rb:502:in `new'
        1: from /usr/local/lib/ruby/2.6.0/optparse.rb:1089:in `initialize'
script/import_scripts/smf2.rb:504:in `block in parser': can't modify frozen String (FrozenError)

Поиск информации об этой ошибке возвращает старый баг Ruby, но он был исправлен уже давно, поэтому я снова в тупике.

Откройте файл smf2.rb и измените значение Frozen string с true на false или наоборот — это на первой или второй строке. После этого всё заработает.

2 лайка

Спасибо @Paracelsus! Это помогло. Я изменил значение с true на false.

Ещё один шаг вперёд!

РЕДАКТИРОВАНИЕ:
У меня была странная ошибка, которая, казалось, указывала на неверный IP-адрес. Проблема оказалась в том, что в файле Settings.php был указан неверный пароль. Это исправлено.

Теперь разбираюсь со следующим:

Traceback (most recent call last):
        7: from script/import_scripts/smf2.rb:627: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.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect': Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory (Mysql2::Error::ConnectionError)

Предполагаю, что эта строка в файле настроек скрипта предназначена для решения данной проблемы:

ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';

Следует ли добавить её куда-то внутри контейнера импорта?

Хорошо, я разобрался с вышеуказанной проблемой. Это ошибка в последней версии MySQL. Она больше не поддерживает старые нативные пароли. Самый простой способ решить это — выполнить процесс с помощью MySQL 5.7. Просто измените шаг 3 с:

docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v ~/smf2:/backup --name=mysql mysql

на

docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v ~/smf2:/backup --name=mysql mysql:5.7

и у вас всё получится. Мой импорт наконец-то запустился.

2 лайка

Новый вопрос: мне не удаётся импортировать аватары пользователей. Так и должно быть?

Я сохранил те, которые нужно изменить размер, в специальную папку вместо стандартной в SMF. Может ли это быть причиной?

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

2 лайка

Наши перенеслись без каких-либо дополнительных шагов. Я не знаю точно, где SMF хранит аватары. Вы перенесли свои вложения? Я импортировал только нашу SQL-базу данных и вложения, поэтому, думаю, они там.

Да, они были там, но я переместил аватары в другую папку и забыл скопировать их в папку аватаров, которую импортер использует для сопоставления с пользователем. Проблема решена (хоть и пришлось заново выполнить импорт).

Теперь новая проблема… Заблокированные пользователи при импорте отображаются не как приостановленные, а просто как неактивные. Есть идеи, как сделать так, чтобы они отображались как приостановленные?

1 лайк

Я использую последнюю версию v2.50 beta2 SMF v2.0.17, и из-за текущего файла:

templates/import/mysql-dep.template.yml

генерируется другой файл smf2.rb. Как объясняется на шаге 4, замена “quote =” в текущей итерации выглядит так:

quote = +“\n[quote="#{params[‘author’]}”

Далее отсутствует следующее:

Тем не менее, я всё же выполнил импорт, но он завершается ошибкой: “IGNORE_BBCODE, вы имеете в виду IgnoreUser.”
Извините, я должен был сделать скриншот Traceback, но не сделал. В любом случае, это моё воспоминание.
Есть какие-либо идеи?
Спасибо.

Я недавно обновил этот скрипт. Я посмотрю.

1 лайк

Спасибо большое! Вопрос: если я начну заново, это перезапишет уже импортированные данные? То есть пользователей, категории.
Спасибо!
Г.

Обычно нет. Скрипты импорта достаточно умны, чтобы продолжить с того места, на котором вы остановились!

1 лайк

@tradenet должно быть исправлено сейчас здесь:

Извините за это!

Доступно в tests-passed, как только все проверки завершатся.

3 лайка

Благодарим вас за ваше внимание.
Г.

2 лайка

Сломаются ли старые URL-адреса SMF после конвертации в Discourse?

Не совсем. Импортёр создаст постоянные ссылки, которые соответствуют старым URL-адресам (и перенаправляют их) на их новые пути.