Migrare un forum phpBB3 a Discourse

È possibile importare forum phpBB in un forum Discourse esistente, cioè fonderli? Presumo che si basi sulle impostazioni relative al mapping delle categorie.

Ci sono problemi di cui essere a conoscenza?

Gli utenti vengono uniti se hanno lo stesso indirizzo email?

1 Mi Piace

sì. se non fai il tuo mapping delle categorie nel file delle impostazioni, verranno create nuove categorie secondo necessità durante l’importazione. se esiste già una categoria in Discourse che corrisponde a un nome di categoria da phpbb, le categorie verranno fuse.

oh, sì. ecco una discussione che descrive ciò che ho riscontrato. ho alcuni suggerimenti e anche un repository con i miei aggiornamenti combinati all’importer.

non ricordo le condizioni esatte, ma sì, gli utenti vengono fusi automaticamente durante l’importazione.

2 Mi Piace

Sono curioso di sapere se è possibile unire un forum phpbb3 in Discourse mantenendo tutti gli argomenti importati di sola lettura. Ho cercato nel thread, ma non ho visto menzionato questo. Grazie.

Potresti modificare lo script di importazione per archiviare tutti gli argomenti creati, o potrebbe essere più facile farlo in blocco dopo l’esecuzione dello script. Vedi Administrative Bulk Operations per esempi.

2 Mi Piace

Ciao,

Sembra che stia riscontrando un problema all’avvio dell’importer. Sembra accadere durante l’importazione degli utenti o poco dopo. Ho incluso lo stack trace e un breve video di 20 secondi dell’output.

Per favore, fammi sapere.

0x00007fe87a88bb10 /var/www/discourse/script/import_scripts/phpbb3/importers/user_importer.rb:87>}
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/validations.rb:80:in `raise_validation_error': Validation failed: Name can't be blank (ActiveRecord::RecordInvalid)
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/validations.rb:53:in `save!'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:302:in `block in save!'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/database_statements.rb:314:in `transaction'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:350:in `with_transaction_returning_status'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:302:in `save!'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/suppressor.rb:54:in `save!'
        from /var/www/discourse/script/import_scripts/base.rb:361:in `block in create_user'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:209:in `transaction'
        from /var/www/discourse/script/import_scripts/base.rb:360:in `create_user'
        from /var/www/discourse/script/import_scripts/base.rb:278:in `block in create_users'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.1.1/lib/patches/db/mysql2/alias_method.rb:8:in `each'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.1.1/lib/patches/db/mysql2/alias_method.rb:8:in `each'
        from /var/www/discourse/script/import_scripts/base.rb:266:in `create_users'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:106:in `block in import_anonymous_users'
        from /var/www/discourse/script/import_scripts/base.rb:948:in `block in batches'
        from /var/www/discourse/script/import_scripts/base.rb:947:in `loop'
        from /var/www/discourse/script/import_scripts/base.rb:947:in `batches'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:293:in `batches'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:102:in `import_anonymous_users'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:33:in `execute'
        from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:22:in `perform'
        from script/import_scripts/phpbb3.rb:35:in `<module:PhpBB3>'
        from script/import_scripts/phpbb3.rb:16:in `<module:ImportScripts>'
        from script/import_scripts/phpbb3.rb:15:in `<main>'

EDIT:
Sembra che abbia a che fare con gli utenti anonimi, penso che darò un’occhiata al mio database.

 def map_anonymous_user(row)
      username = row[:post_username]

      {
        id: @settings.prefix(username),
        email: "anonymous_#{SecureRandom.hex}@no-email.invalid",
        username: username,
        name: @settings.username_as_name ? username : "",
        created_at: Time.zone.at(row[:first_post_time]),
        active: true,
        trust_level: TrustLevel[0],
        approved: true,
        approved_by_id: Discourse.system_user.id,
        approved_at: Time.now,
        post_create_action:
          proc do |user|
            row[:user_inactive_reason] = Constants::INACTIVE_MANUAL
            row[:ban_reason] = "Anonymous user from phpBB3" # TODO i18n
            suspend_user(user, row, true)
          end,
      }
    end

EDIT
Sono riuscito a superare l’errore cambiando questa riga nel metodo map_anonymous_user. A quanto pare, l’impostazione predefinita era quella di impostare il nome utente su una stringa vuota, quindi ci ho messo solo una parola.

cambiato questo

name: @settings.username_as_name ? username : "",

in questo

name: @settings.username_as_name ? username : "Anonymous ",
3 Mi Piace

Posso eliminare vecchi post prima di eseguire un’importazione incrementale? Ho eseguito con successo l’importazione localmente in un’installazione di sviluppo, l’ho ripristinata sul mio server che esegue un’installazione Docker e il mio piano è di eseguire un’importazione lì per i nuovi post. Ma anche ignorando i post già importati, l’esecuzione dell’importazione sul server richiede ore. Il mio forum è piuttosto grande (1,3 milioni di post) e il disco del mio server è lento, quindi il semplice caricamento del file .sql richiede ore.

Causerebbe problemi se facessi qualcosa come DELETE FROM phpbb_posts WHERE post_id < 2926807 localmente e poi lo esportassi, lo caricassi sul server ed eseguissi l’importazione normalmente?

Ho aggiunto un’impostazione IMPORT_AFTER ad alcuni script per estrarre solo i dati dopo una certa data. Quindi modificherei l’SQL che estrae i post per ottenere solo quelli successivi a un giorno prima dell’ultimo dump di dati.

Ma se hai un disco molto lento, probabilmente avrai problemi ad ospitare Discourse. Le prestazioni sono accettabili con i dati che hai?

1 Mi Piace

Sì, per l’uso normale utilizzerò un disco più veloce, ma non è abbastanza grande per ospitare più copie del database contemporaneamente, quindi sto instradando /shared/import a un disco più grande e più lento nella sezione dei volumi di import.yml. Il trucco ha funzionato bene per ripristinare il backup iniziale, ho reindirizzato /shared/tmp al disco lento dopo che il ripristino è fallito a causa dell’esaurimento dello spazio anche se avevo 18G liberi e un database da 6G (penso di averti visto menzionare altrove che il ripristino crea 3 copie del database mentre è in esecuzione). Ma a quel punto il downtime non era un problema.

Quindi, giorno per giorno, dimensioni e velocità non sono un problema, il mio forum è piuttosto tranquillo, è solo vecchio.

Darò un’occhiata alla modifica dell’SQL negli script. Grazie!

2 Mi Piace

Nel file settings.yml il contenuto per la connessione a mysql è questo:


Dove posso inserire il nome del database?

Il nome del database dovrebbe andare nel parametro schema. Il nome di quel parametro è un po’ confuso, sì. Puoi vedere qui nel codice, viene passato come nome del database.

2 Mi Piace

https://www.loom.com/share/1f66315779af4cf7b286c8541d4f3f09

Ciao! Ho realizzato un breve video in cui parlo del problema che stiamo riscontrando con l’importazione. Stiamo importando circa 650.000 post.

Grazie mille!

https://www.loom.com/share/1f66315779af4cf7b286c8541d4f3f09?sid=11a46d3c-8510-43a1-82e9-1a3524cbb365

Ciao. Esiste un modo per eseguire l’importazione riga per riga? Stiamo riscontrando problemi con il completamento dello script. Alcune cose funzionano, come utenti e avatar, altre no. Ho ripristinato la mia immagine del server circa 4 volte perché ho letto da qualche parte che dopo un errore di importazione è necessaria un’installazione pulita.

Altri dettagli sono nel video che ho pubblicato. Qualsiasi assistenza è apprezzata.

Ciao. Sono circa 18 ore che sto migrando e non sono più vicino a far funzionare la migrazione. Potresti per favore vedere il mio video e consigliarmi se hai suggerimenti o trucchi o se manca qualcosa nella configurazione. Abbiamo solo bisogno di post, argomenti, messaggi privati, categorie. Avatar e utenti funzionano. Il server è pulito UBUNTU 22.04.

Una soluzione più semplice è fare un backup dopo aver creato il sito in modo da poter ripristinare quello. Un altro modo per ottenere un database pulito è eseguire rake db:drop db:create db:migrate, ma devi fare alcune cose per renderlo possibile. Se non riesci a indovinare quelle cose dai messaggi di errore, allora la soluzione di backup/ripristino è la strada da percorrere, e potrebbe essere comunque più veloce.

Puoi aggiungere alcune istruzioni di debug puts lì, anche se la struttura dello script phpbb3 è un po’ confusa per chi non conosce bene Ruby.

Inoltre, puoi eseguire lo script più volte e salterà le cose che ha già fatto, quindi non è necessario cancellare il database finché non hai cambiato qualcosa che richiede un nuovo inizio (cioè, farà qualcosa di diverso con i dati già importati).

Questo va oltre ciò che posso fare gratuitamente. Se hai un budget, puoi contattarmi direttamente o pubblicare in Marketplace.

Lo script di importazione non sembra funzionare. Il problema è nel video. Se qualcuno del team di migrazione di Discourse potesse esaminarlo, sarebbe molto apprezzato.

Se il supporto è a pagamento, potreste indicare il costo della migrazione? La mia comprensione è che questo sia il posto dove porre domande su come far funzionare lo script. Sono d’accordo con le commissioni, pensavo solo che questo fosse un progetto open source e questo fosse il posto dove fare domande.

Sto dicendo che sono un volontario qui e non sono disposto a guardare un video gratuitamente, in gran parte a causa del mio irrazionale disprezzo per i video. Ma non sono l’unico qui. A molte persone piace guardare i video.

Quindi ogni volta che viene eseguito crea duplicati degli utenti creati nell’esecuzione precedente? Non riesco a immaginare come possa essere. Sei sicuro? Non dovrebbe funzionare così.

Sembrerà che importi di nuovo le cose, ma va molto più veloce poiché in realtà non sta facendo nulla poiché le cose già importate hanno un campo personalizzato import_id impostato che impedisce che vengano importate di nuovo. Se duplica i dati ad ogni esecuzione, allora c’è qualcosa di molto strano che non va.

Lo è. A volte le persone hanno bisogno o vogliono più aiuto di quanto si possa ottenere gratuitamente.

2 Mi Piace

Capito. Potresti pubblicare le tue tariffe per la migrazione? Capisco che lo script non sembra funzionare e richiede supporto a pagamento. Sono totalmente d’accordo.

1 Mi Piace

Le migrazioni sono piuttosto complesse. Ognuna di esse presenta sfide diverse, poiché i dati di ogni forum sono unici. Il debug di un problema di migrazione può richiedere ore e richiede un’analisi approfondita dei log, del database, del codice, ecc. È difficile farlo solo guardando questi post, mi dispiace di non poter essere di maggiore aiuto! Ecco le nostre FAQ sulle migrazioni: Migrating to Discourse | Discourse - Civilized Discussion

Grazie per il link. Penso di aver capito il problema e lo script di importazione è ora in esecuzione. Sono a circa 100000/666357 post in questo momento. Chat GPT è stato utile nell’identificare alcuni degli errori basati sui permessi e simili.

2 Mi Piace