Migrate an SMF2 forum to Discourse

Maybe open a ticket with Duffield ocean about the characters being wrong?

You might use an ssh client like putty or the new shell that I think is part of Linux subsystem for windows (the last version of windows that I used had a year as it’s version descriptor, so I’m no help). If you use a Mac just open a terminal and use ssh.

If your database is big it will take a while for the database to load and there will be no output except a new prompt when it’s done. My guess is that it was working properly.


Thanks @pfaffman. I think I will reach out to them about that.

I can try a different ssh client and see if that works better.

The database isn’t that large. It has been sitting for an hour now and still in the same spot. I checked the CPU on the server and it is essentially idling.

1 Like

Yep, that was the issue! Thanks again @pfaffman. Making progress again…

Another solution is to allow access to the database directly from the droplet doing the import,thereby skipping the step of having a local database.

If it’s been an hour then it’s likely its not happening. You might try something like

 cat database.sql | mysql
1 Like

One step forward, one step back.

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>

I did not have letsencrypt installed, so I installed it.

What’s missing from “Preparing the the Discourse Host and container for importing” is that you need to uncomment the env line for LETSENCRYPT_ACCOUNT_EMAIL and enter your email address. That got me past this error.

In a continuation, now I’m at the final import step. I enter the import container and run the import script. It immediately quits with:

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)

Lots of web searches, but coming up empty so far.

EDIT: I think this might be that mysql is not installed in the container. I’ve tried ‘gem install mysql2’, but that kicks back

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

So I managed to get mysql2 installed. First I had to get the dev tools installed, but the suggested source wasn’t available. So I ran

sudo apt-get install default-libmysqlclient-dev

From there I was able to

gem install mysql2

I still got the same error. So I tried commenting out that require in the script just to see what would happen. Got a new error:

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)

Researching that comes back with an old Ruby bug, but it was fixed a long while back so I’m stuck again.

Go to smf2.rb and change the Frozen string from true to false or the other way around, it’s on the first or second line. It will work after that.


Thank you @Paracelsus! That fixed it. I changed it from true to false.

One step closer!

I had an error that was odd and seemed to be pointing to the wrong IP. It was that I had the wrong password in the Settings.php. That’s fixed.

Now figuring out:

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)

I’m assuming this line in the script tuning file is to address this:

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

Should that be added somewhere inside the import container?

Alright, I figured out the above issue. This is a problem with the latest version of MySQL. It doesn’t support the older native passwords anymore. The easiest way to tackle this is to run this process using MySQL 5.7. Just change step 3 from:

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

and you should be golden. My import is finally running.


A new question: I can’t seem to get the user avatars imported. Is it supposed to be like this?

I have the ones that need redimension being saved on a custom folder instead of the standard one in SMF, could this be the reason?

Otherwise, so far so good. This guide is great and the incremental database imports work great too :+1:.


Ours came over without any extra steps. I’m not sure where SMF stores avatars off-hand. Have you brought over your attachments? I only imported our SQL DB and attachments, so my guess is they are in there.

Yes, they were there, but I had the avatars moved to another folder and forgot to copy it to the avatar folder that the import uses to match with the user. Problem solved (even if I had to remake the import).

A new issue now… banned users don’t appear as suspended when imported, just as inactivated. Any ideas on how to get them suspended instead?

1 Like

I am using v2.50 beta2 latest version of SMF v2.0.17 and there is a different smf2.rb generated because of the current:
As explained in Step 4. replacing “quote =” the current iteration is:

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

And further there is no:

However, I went ahead and performed the import unfortunately it dies with “IGNORE_BBCODE do you mean IgnoreUser.”
Sorry, I should of taken a screenshot of the Traceback but didn’t, anyway that’s my recollection.
Any ideas?

I recently updated this script. I’ll have a look.

1 Like

Thank-you very much! Question if I start over again will it overwrite what I imported already? ie. users, categories.

Generally no. The import scripts are smart enough to stay where you left off!

1 Like

@tradenet should be fixed now here:


Sorry about that!

Will be available in tests-passed as soon as all the checks complete.


Thank-you for your kind attention.


will old SMF urls be broken after converting to Discourse?

Not really. The importer will create permalinks that match (and redirect) the old URLs to their new paths.