Ciao alla Community di Discourse,
Voglio condividere la mia esperienza sull’importazione di un forum IPB 3.1 in Discourse 2.1, sperando che ciò sia utile per altri.
Una breve sintesi sulla Community:
- Argomento: Yii PHP Framework (discussioni e supporto relativi al codice)
- Membri: ~26k
- Argomenti: ~64k
- Post: ~293k
L’importazione ha richiesto 27 ore e 46 minuti su una macchina con 16 GB di RAM e 4 core CPU.
Requisiti per l’importazione:
- Mantenere i membri, ma pulire tutti gli account SPAM (~250k account, di cui ~26k rimangono dopo la pulizia)
- Implementare l’SSO dal sito web (gli account utente non sono gestiti da Discourse)
- Mantenere argomenti, post e categorie con i loro URL originali in modo che i risultati delle ricerche web funzionino ancora, così come altri link da piattaforme come Stackoverflow
Questo si basa su Migrating from Invision Power Board to Discourse - #23 by pfaffman, quindi grazie a @pfaffman per l’ottimo lavoro svolto sul programma di importazione.
Preparazione
Esportazione dei dati da IPB
mysqldump <nome_database> > /tmp/ipb.sql
cd /var/www/yiiframework.com/forum/ && tar czvf uploads.tgz uploads/
Copia il dump SQL e gli upload sul nuovo server e mettili in /var/discourse/shared/standalone/.
Qui assumo una configurazione Docker semplice di Discourse.
Quale script utilizzare?
Ci sono due script di importazione, ipboard.rb e ipboard3.rb. Lo script ipboard3.rb sembra molto grezzo e non si adatta allo schema delle tabelle che abbiamo, quindi ho scelto ipboard.rb.
La versione corrente dello script di importazione ipboard.rb non gestisce bene gli allegati e non converte i tag del codice, il che è molto importante per noi dato che parliamo spesso di codice PHP. Quindi ho apportato le seguenti modifiche allo script:
Rendere disponibili gli allegati caricati
Lo script di importazione sostituisce gli allegati dei post con URL al file caricato.
Se intendi mantenere la tua istanza IPB online all’URL in cui si trovava prima, puoi semplicemente specificare l’URL (UPLOADS è una configurazione dello script di importazione, vedi sotto) alla directory degli upload e sei a posto:
UPLOADS="https://www.yiiframework.com/forum/uploads"
Ma stiamo importando in Discourse per rimuovere completamente il vecchio forum, quindi dobbiamo mettere gli upload altrove. Se stai utilizzando un proxy nginx davanti a Discourse, puoi configurarlo per servire i file caricati da una directory sul server. Inserisci quanto segue nella parte server della configurazione di nginx:
location /ipb_uploads/ {
alias /var/www/ipb_uploads/;
}
E configura l’URL degli allegati (vedi sotto) in questo modo:
UPLOADS="https://forum.yiiframework.com/ipb_uploads"
Configurazione di MySQL nel container di Discourse
Avvia una shell bash nel container dell’app Discourse:
docker exec -it app bash
Nel container, installa MySQL e importa il database:
apt-get install mysql-server mysql-client libmysqlclient-dev
service mysql start
echo "create database ipb" | mysql -uroot -p
mysql -uroot -p ipb < /shared/ipb.sql
Quando ho provato la prima importazione per testare lo script, è durata diversi giorni per importare 200k utenti, di cui sapevamo che una grande quantità erano account SPAM, quindi abbiamo creato alcune query SQL per eliminare gli account che non avevano mai pubblicato nulla:
Nota che useremo SSO, quindi gli utenti eliminati verranno ricreati quando accederanno.
Se non userai SSO, i tuoi criteri per eliminare gli utenti potrebbero essere diversi.
Puoi importare i tuoi dati senza pulirli.
mysql -uroot -p
# poi applica le query di pulizia
Successivamente dobbiamo installare le dipendenze per lo script di importazione:
cd /var/www/discourse
echo "gem 'mysql2'" >> Gemfile
echo "gem 'reverse_markdown'" >> Gemfile
bundle install --no-deployment
Per consentire l’accesso al database Postgres di Discourse, sostituisci peer con trust in /etc/postgresql/10/main/pg_hba.conf. Nota che 10 rappresenta la versione di postgres; se il file non esiste nella tua configurazione, sostituisci 10 con la versione di postgres che stai eseguendo attualmente.
Riavvia Postgres per caricare le modifiche: service postgresql restart
Importazione
Prepara gli avatar e i file caricati:
mkdir /shared/imports
mv /shared/uploads.tgz /shared/imports
cd /shared/imports && tar xzvf uploads.tgz
Esegui lo script di importazione:
cd /var/www/discourse
DB_HOST="localhost" DB_NAME="yiisite" DB_USER="root" DB_PW="root" TABLE_PREFIX="ipb_" IMPORT_AFTER="1970-01-01" UPLOADS="https://www.forum.yiiframework.com/ipb_uploads" AVATARS_DIR="/shared/imports/uploads/" USERDIR="user" bundle exec ruby script/import_scripts/ipboard.rb | tee import.log
Assicurati di regolare l’URL UPLOADS come discusso sopra, poiché gli upload saranno inclusi nei post come link al file di upload originale.
Pulizia
Se tutto è andato bene, esegui la pulizia con service mysql stop, apt-get purge mysql-server, rm -rf /var/lib/mysql
Configurazione della reindirizzazione degli URL
Per mantenere intatti gli URL esistenti al forum, lo script di importazione crea permalink per ogni argomento che riflettono l’URL di argomenti e categorie in IPB.
Tuttavia, questi permalink non coprono i link a post specifici in un argomento o pagine diverse.
Affinché questi URL funzionino correttamente, devi configurare alcune regole di riscrittura degli URL; ci sono 3 opzioni:
- Utilizzare l’impostazione
permalink normalizationsin Discourse per rimuovere parti non necessarie dagli URL - Regole di riscrittura in nginx, se hai un proxy nginx davanti a Discourse
- Se il vecchio forum era su un URL/Host diverso rispetto a Discourse, puoi utilizzare uno script personalizzato per riscrivere gli URL (questo è ciò che ho fatto)
Ecco il codice PHP che usiamo per la reindirizzazione degli URL:
Risorse correlate
- Migrate a XenForo forum to Discourse
- Migrating from Invision Power Board to Discourse - #23 by pfaffman
- Feature: Invision Power Board Importer by pfaffman · Pull Request #5543 · discourse/discourse · GitHub
- Distribuzione di Discourse utilizzando SaltStack:
server-salt/states/discourse at master · yiisoft-contrib/server-salt · GitHub