Migrare un forum Phorum a Discourse

Se hai un vecchio forum Phorum e stai pensando di migrare a Discourse, questo tutorial è per te. Il processo è semplice e utilizzeremo lo script ufficiale Phorum Importer. Iniziamo.

A un livello generale, faremo quanto segue:

  • Preparazione dell’ambiente di sviluppo locale.
  • Esportazione del database dall’ambiente di produzione.
  • Importazione del database di produzione in un’istanza locale di Discourse.
  • Esecuzione dello script Phorum importer.

Cosa può essere migrato

  • Categorie
    • Ogni forum e cartella =\u003e Categoria radice
  • Topic e Messaggi
  • Utenti (con i seguenti attributi)
    • stato di sospensione (banned)
    • nome utente
    • nome reale =\u003e nome
    • email
    • stato di amministratore
    • data di aggiunta
    • ultima attività

Preparazione dell’ambiente di sviluppo locale

Segui una di queste guide per installare Discourse e consulta questa guida se riscontri problemi.

Installa il server MySQL DB;

Ubuntu 18.04:

$ sudo apt update
$ sudo apt install mysql-server -y

Dopo aver completato l’installazione di MySQL, verifica il suo stato:

$ systemctl status mysql.service

Se non è in esecuzione, esegui il seguente comando:

$ sudo systemctl start mysql

MacOS:

$ brew install mysql@5.7
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' \u003e\u003e ~/.bash_profile
$ source ~/.bash_profile

Verifica lo stato dei servizi:

$ brew services list

Dovresti vedere qualcosa di simile a questo:

...
mysql@5.7         started
...

In caso contrario, esegui il comando seguente e verifica di nuovo:

$ brew services start mysql@5.7

Per Windows, puoi seguire la guida ufficiale all’installazione.

Questo ambiente sarà il nostro server Discourse.

Esportazione del database dall’ambiente di produzione

Esporta il database di produzione (dal server Phorum di produzione):

$ mysqldump -u USER_NAME -p DATABASE_NAME \u003e phorum_dump.sql

Copia il dump del database sul server Discourse.

:bulb: Usa scp o rsync per copiare il database. E naturalmente, puoi comprimerlo con gzip prima.

Importazione del database di produzione nel server Discourse

Sul server Discourse, crea un database:

$ mysql -u root

:bulb: Se il tuo utente del database ha una password, dovresti usare: mysql -u root -p e poi inserire la password.

mysql\u003e CREATE DATABASE phorum;

Assicurati che il database sia stato creato:

mysql\u003e SHOW DATABASES;

Dovresti vedere qualcosa di simile a questo:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| phorum             |
| sys                |
+--------------------+
5 rows in set (0.04 sec)

Questo è un database vuoto. Il nostro prossimo passo è importare il database di produzione al suo interno.

$ mysql -u root phorum \u003c phorum_dump.sql

Mentre siamo qui, otteniamo il prefisso delle tabelle. Ne avremo bisogno più tardi:

$ mysql -u root
mysql\u003e USE phorum;
mysql\u003e SHOW TABLES;

Vedrai qualcosa di simile a questo:

+---------------------------+
| Tables_in_phorum          |
+---------------------------+
| pw_banlists           |
| pw_files              |
| pw_forum_group_xref   |
| pw_forums             |
| pw_groups             |
| pw_messages           |
| pw_messages_edittrack |
| pw_pm_buddies         |
| pw_pm_folders         |
| pw_pm_messages        |
| pw_pm_xref            |
| pw_search             |
| pw_settings           |
| pw_subscribers        |
| pw_user_custom_fields |
| pw_user_group_xref    |
| pw_user_newflags      |
| pw_user_permissions   |
| pw_users              |
+---------------------------+
19 rows in set (0.00 sec)

Dall’output sopra puoi vedere che il prefisso è pw_.

Esecuzione dello script Phorum Importer

Per prima cosa, installa le dipendenze dell’importer:

$ cd ~/discourse
$ echo "gem 'mysql2', require: false" \u003e\u003e Gemfile
$ bundle install

Ora configuriamo lo script in modo che soddisfi le nostre esigenze. Nel nostro esempio, questo basterà:

PHORUM_DB = "phorum"
TABLE_PREFIX = "pw_"
BATCH_SIZE = 1000

# ...

host: "localhost",
username: "root",
password: "", # Cambia questo se hai una password per il database MySQL
database: PHORUM_DB

Se vuoi creare un reindirizzamento URL, dovrai decommentare quanto segue:

# categories.each do |category|
#   Permalink.create(url: "list.php?#{category['id']}", category_id: category_id_from_imported_category_id(category['id'].to_i))
# end

#...

# results.each do |post|
#   if post['parent_id'] == 0
#     topic = topic_lookup_from_imported_post_id(post['id'].to_i)
#     Permalink.create(url: "read.php?#{post['category_id']},#{post['id']}", topic_id: topic[:topic_id].to_i)
#   end
# end

Dovrebbe apparire così:

categories.each do |category|
  Permalink.create(url: "list.php?#{category['id']}", category_id: category_id_from_imported_category_id(category['id'].to_i))
end

#...

results.each do |post|
  if post['parent_id'] == 0
    topic = topic_lookup_from_imported_post_id(post['id'].to_i)
    Permalink.create(url: "read.php?#{post['category_id']},#{post['id']}", topic_id: topic[:topic_id].to_i)
  end
end

Esegui l’importer con un’istanza pulita di Discourse:

bundle exec rake db:drop db:create db:migrate
bundle exec ruby script/import_scripts/phorum.rb

L’importer si connetterà al server MySQL e migrerà il nostro database Phorum nel database di Discourse.

Avvia il server Discourse dopo che l’importer ha completato l’importazione:

$ bundle exec rails server

Avvia Sidekiq per elaborare i dati migrati:

$ bundle exec sidekiq

:bulb: Puoi monitorare lo stato di avanzamento di Sidekiq all’indirizzo http://localhost:3000/sidekiq/queues.

Configura il tuo server di produzione Discourse seguendo questa guida.

Esegui un backup del database di Discourse e caricalo sul tuo server di produzione Discourse seguendo questa guida.

È fatto :tada:

7 Mi Piace

I’m about to start work on migrating a Phorum forum to Discourse. I would like to preserve files attached to posts (mostly pictures). Looks like this is not supported in the current migration script. Has anyone noodled on that already?

1 Mi Piace

I’ve made a couple tweaks to the migration script for “phorum” including migrating attachments/files/uploads. The pull request is here:

1 Mi Piace

Grazie per gli script!

Tuttavia, ritengo che il manuale sia piuttosto grezzo e poco chiaro. Ho dovuto fare riferimento, ad esempio, alla guida alla migrazione di Xenforo per capire effettivamente cosa suggerisci qui. Lascia che aggiunga alcuni passaggi mancanti:

  • Avere Discourse attivo e funzionante
  • Creare mysqldump dal Phorum originale - tutto chiaro, tutto a posto.
  • Copiare il dump del database nella cartella di Discourse docker cp/path/to/backup/phorum_db.sql.gz app:/shared/phorum_db.sql.gz (assumendo app come nome contenitore standard)
    E qui le parti mancanti:
  • Accedere effettivamente al container Docker di Discourse e installare MySQL lì:
docker exec -it app bash
apt-get update && apt-get upgrade
# pv solo per comodità per visualizzare l'avanzamento, lsb-release è richiesto da qualcosa
apt-get install -y lsb-release pv mariadb-server mariadb-client libmariadb-dev
service mariadb start

Nota che l’installazione di MySQL è un po’ più complicata, ma Mariadb dovrebbe funzionare ugualmente bene.

Quindi creare un database: mysqlCREATE database phorum.

Quindi riempirlo dal backup: pv phorum_db.sql.gz | gunzip | mysql phorum (non è necessario gunzip se il tuo dump è sql puro)

Aggiungere il supporto MySql a Ruby:

cd /var/www/discourse/
echo "gem 'mysql2'" >>Gemfile
bundle config unset deployment
bundle install --no-deployment

Modificare i dati nello script di migrazione (credenziali del database, prefisso, permalink):

nano /var/www/discourse/script/import_scripts/phorum.rb

E poi tornare alla guida del post originale, tutto a posto lì:

Eseguire l’importatore con un’istanza Discourse pulita:

git config --global --add safe.directory /var/www/discourse
bundle exec ruby script/import_scripts/phorum.rb

Se il tuo database Discourse non è veramente pulito, è meglio pulirlo prima con bundle exec rake db:drop db:create db:migrate.

Se fallisce con “PG::ConnectionBad: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "discourse" (PG::ConnectionBad)”:

  1. Se ricevi l’errore 'Peer authentication failed for user \"discourse\"':
  2. Modifica il file /etc/postgresql/13/main/pg_hba.conf
  3. cambia tutti i ‘peer’ in ‘trust’ e salva il file
  4. ricarica il server postgres: /etc/init.d/postgresql reload (o forse psql -U postgres -c \"SELECT pg_reload_conf();\", ma a volte questo mi dava errore)

Prima esegue le migrazioni degli utenti che potrebbero essere relativamente lente (~1.2k utenti/minuto secondo l’output dello script. Avevo 100k utenti, quindi…). Poi crea le categorie e inizia a migrare messaggi e argomenti (stessa velocità, ~1.2k/minuto), ma a questo punto puoi già accedere al sito web e vedere come appare.

Sembra molto più fluido di quanto mi aspetterei per un motore così antico come Phorum. Sembra che non ci sia migrazione di messaggi privati (PM), ma almeno per me non dovrebbe essere un blocco.

Grazie ancora per lo script e per gli sforzi!

È difficile scrivere una guida per qualcosa di così complicato che copra tutti i passaggi. Capire esattamente quali pezzi un particolare utente potrebbe aver bisogno che gli vengano detti è complesso. Buon lavoro nel trovare un’altra guida con i pezzi mancanti.

Potresti essere stato in grado di includere il template mysql per installare mysql, o forse avresti avuto accesso a un server mysql già installato in qualche modo (cosa che faccio di solito).

Se volessi, potresti guardare alcuni altri script che importano i PM per usarli come esempio.