Migrare un forum vBulletin 4 a Discourse

Ciao. Voglio solo condividere la mia soluzione.
Per quanto riguarda i problemi con le citazioni. Come ho detto prima, stavo affrontando problemi: l’espressione regolare non catturava le virgolette quando:

  • il nome utente e l’ID del post potevano essere racchiusi tra virgolette doppie
  • citazioni annidate

Ho deciso di fare una ricerca e sostituzione usando una logica diversa. Invece di cercare i tag e il loro contenuto, ho usato un’espressione regolare che cerca solo i tag:

era:
raw.gsub!(%r{\\[quote=\"?([^;]+);(\\d+)\"?\\](.+?)\\[\\/quote\\]}im) do

diventa:
raw.gsub!(%r{(\\[QUOTE(=\"?([^;]+);(\\d+)\"?)?\\])|(\\[\\/QUOTE\\])}im) do

e poi ho modificato leggermente la determinazione della fonte di una citazione:

      if $3 && $4
        if topic_lookup = topic_lookup_from_imported_post_id(post_id)
          post_number = topic_lookup[:post_number]
          topic_id = topic_lookup[:topic_id]
          "\n[quote=\"#{new_username},post:#{post_number},topic:#{topic_id}\"]\n"
        else
          "\n[quote=\"#{new_username}\"]\n"
        end
      elsif $5
        "\n[/quote]\n"
      end

Inoltre, ho modificato il codice dello spoiler. Invece di:

    # [spoiler=Some hidden stuff]SPOILER HERE!![/spoiler]
    raw.gsub!(%r{\\[spoiler=\"?(.+?)\"?\\](.+?)\\[/spoiler\\]}im) do
      "\n#{$1}\n[spoiler]#{$2}[/spoiler]\n"
    end

che sfoca il testo, lo converto in un tag details:

    raw.gsub!(%r{(\\[spoiler(=\"?(.*?)\"?)?\\])|(\\[\\/spoiler\\])}im) do
      if $3
        "\n[details=#{$3}]\n"
      elsif $1
        "\n[details]\n"
      elsif $4
        "\n[/details]\n"
      end
    end

Poiché si dà il caso che nel mondo vbulletin - spoiler non sia il contenuto sfocato, ma piuttosto il contenuto collassato. Quindi penso che sia molto più appropriato per lo script di importazione vbulletin convertire gli spoiler in dettagli invece dello spoiler sfocato.

Ho anche notato il tag di menzione. Nel mio caso, in vbulletin, le menzioni apparivano così:
[mention=XXX]username[/mention]

L’espressione regolare utilizzata nello script non tiene conto del fatto che il tag possa contenere l’ID utente.

    # [MENTION]<username>[/MENTION]
    raw.gsub!(%r{\\[mention\\](.+?)\\[/mention\\]}i) do
      new_username = get_username_for_old_username($1)
      "@#{new_username}"
    end

L’ho corretto anche a modo mio:

    # [MENTION]<username>[/MENTION]
    raw.gsub!(%r{\\[mention(=\\d+)?\\](.+?)\\[/mention\\]}i) do
      new_username = get_username_for_old_username($2)
      "@#{new_username}"
    end
1 Mi Piace

Questo non è vero quando ho iniziato a migrare il mio forum vBulletin di 24 anni in esecuzione su vB 3. C’erano molteplici incompatibilità e altri problemi con lo script. Tuttavia, ho dedicato molto impegno alla creazione di un importer per vBulletin 3 basato sullo script per vB4.

Lo script migliorato è incluso con Discourse, si chiama vbulletin3.rb. L’utilizzo dello script di importazione vB3 è lo stesso descritto in questa guida. Esegui semplicemente bundle exec ruby script/import_scripts/vbulletin3.rb invece.

vBulletin3 ha alcune modifiche/miglioramenti significativi:

  1. Le autorizzazioni del forum vengono copiate
  2. Vengono creati i gruppi di moderatori del forum
  3. Vengono creati gruppi di utenti unibili con la corretta configurazione
  4. Annidamento del forum importato fino a 3 livelli di profondità (massimo di Discourse)
  5. Vengono registrati i permalink per tutti i thread e i post, prevenendo il link rot
  6. Alcune impostazioni di base del forum vengono copiate (ad es. titolo, email di notifica, nome dell’azienda)
  7. Vengono importati i sondaggi
  8. Miglioramenti significativi alla conversione da bbcode a markdown
  9. I collegamenti diretti URL a thread, post, allegati vengono convertiti in riferimenti discourse, ciò richiede l’impostazione della variabile d’ambiente FORUM_URL su forum.hostname/path (senza protocollo).

Invece di tentare di convertire i messaggi privati di vBulletin in messaggi privati di Discourse, gli utenti riceveranno invece un messaggio privato di sistema contenente un archivio dei messaggi privati che avevano. La costruzione dei PM di vBulletin non è realmente compatibile con Discourse. Tentare di convertirla esporrebbe anche alcune privacy a seconda di come le persone usavano i PM in vBulletin.

Come probabilmente accade anche con altri importer, la conversione può richiedere molto tempo. Lo script di conversione ha richiesto 5,5 ore sulla mia postazione di lavoro per 7k utenti, 16k thread, 415k post. Non ho idea di quanto tempo abbia impiegato l’elaborazione dei post, l’ho lasciata in esecuzione durante la notte. Dall’inizio alla fine il forum è stato offline per 30 ore. Alla fine sono soddisfatto del risultato.

2 Mi Piace

Ora questo è un tuffo nel passato :slight_smile:

Il tuo forum è molto bello. Mi piacciono i colori alternati nelle righe degli argomenti.

Sembra che sia questo thread che l’importatore siano ormai molto datati. Ho risolto alcuni problemi con l’aiuto di questo thread, ma ora sono bloccato sul seguente passaggio dell’importazione utente, qualcuno sa come risolverlo?

in at’: can’t convert NilClass into an exact number (TypeError)`

O la query è sbagliata oppure in qualche modo manca un valore nella tabella

È piuttosto bizzarro rispondere a questo dopo tanti anni, ma sto facendo un’importazione VB ora con l’importatore di massa e una serie di immagini mancavano e il motivo è che hanno spostato il nome del file allegato in un campo diverso.

 SELECT a.filedataid attachment_id, a.userid user_id, a.filename filename
             FROM attachment a
            WHERE a.attachmentid = 383075;

il file NUMBER.attach è ora il campo filedataid, non il campo attachment_id. Quindi quella query deve essere aggiornata nello script.

Mi è stato chiesto di migrare un forum vbulletin 4.25 a discourse….leggere questo thread mi dà sentimenti contrastanti…sembra possibile, ma potenzialmente un enorme grattacapo e una perdita di tempo (entrambi i quali potrei evitare al momento)….\n\nc’è uno script aggiornato per vbulletin 4.25 da qualche parte? Vedo solo 3 e 5 sulla pagina ufficiale?

Beh, ci sono script vbulletin e vbulletin5 nella directory bulk imports che hanno solo un paio di mesi. Eseguire questi bulk import è piuttosto complicato e non ben documentato.

Ho eseguito oltre 100 importazioni e sono abbastanza sicuro di non averne mai fatta una che non richiedesse di modificare lo script per un motivo o per l’altro.

Ho scritto diversi script di importazione prima ancora di imparare veramente Ruby (Ma un professore a metà degli anni '80 mi assicurò che dopo il suo corso di Linguaggi di Programmazione avrei potuto dire di conoscere qualsiasi linguaggio se avessi avuto un fine settimana e un libro; aveva in gran parte ragione.)

Ma sì, è probabile che sia almeno tanto una seccatura e una perdita di tempo quanto immagini.

Sospetto che lo script vbulletin farà un lavoro decente; probabilmente non consiglierei lo script di bulk import a meno che tu non abbia oltre un milione di post + utenti.

1 Mi Piace

grazie mille :slight_smile:

immagino di dover decidere cosa fare nel fine settimana :smiley:

1 Mi Piace

Apprezzerei molto un aiuto con questo :face_with_spiral_eyes:

Ho letto la discussione e ho seguito alcuni passaggi che ho visto qui, ma mi sono bloccato.

  1. Mi connetto via ssh al mio vps
  2. Entro nell’immagine docker
  3. Installo mariadb-server
  4. Provo a eseguire il comando mysql per creare un db, ma ottengo ‘impossibile connettersi al server locale tramite socket’

le istruzioni qui sono di qualche anno fa - vedo che un paio di persone hanno avuto lo stesso errore, ma non vedo alcuna risoluzione

qualcuno ha fatto questo processo di recente e può indicarmi la giusta direzione - non penso ci sia una guida passo passo che mi manca, vero?

modifica: aggiungo solo che ho provato ogni tipo di trucco e ho finito per installare un’immagine docker di mariadb sull’host locale (non docker) ed esporre la porta - ora posso connettermi al db dall’immagine docker… ma l’esecuzione dello script dà: Gemfile: Variabile locale o metodo non definito ‘mysql2’ Ho provato a installare il gemfile, ma fallisce… e prima di risolvere ulteriormente, ho la sensazione di usare informazioni obsolete e potenzialmente pacchetti vecchi… Sono solo molto confuso e avrei bisogno di una guida!

qualsiasi aiuto è apprezzato!

…ho persistito e finalmente sono arrivato all’esecuzione dello script! Tuttavia, dopo aver iniziato l’esecuzione, fallisce con:

"root@vps-xxxxxxxx-app:/var/www/discourse/script/import_scripts# bundle exec ruby vbulletin.rb
/var/www/discourse/config/initializers/013-excon_defaults.rb:4:in `<main>': can't modify frozen Hash: {:chunk_size=>1048576,                                                             :ciphers=>"ECDHE-ECDSA- [................]"

…e penso di aver raggiunto il limite delle mie capacità di risoluzione dei problemi.

Non so se avviarlo da /var/www/discourse faccia differenza, ma io lo faccio sempre. Ecco cosa è raccomandato nell’OP.

Non riconosco quell’errore.

1 Mi Piace

A quando ho rinunciato ieri sera, dopo ore di “ricerca”, avevo armeggiato con così tante cose al di fuori della mia zona di comfort che temevo di causare più danni che benefici. Ero anche ansioso di sentire se qualcuno l’aveva fatto di recente e c’era qualche passaggio magico che mi stavo perdendo, piuttosto che scendere in spirali in buchi di coniglio ricorrenti :winking_face_with_tongue:

È possibile che ci sia un nuovo problema. L’altro giorno ho eseguito un’importazione mbox e immagino che chiami lo stesso codice che ti ha dato l’errore.

Oh. L’ho fatto in un container e queste istruzioni sono per un ambiente di sviluppo. Hai configurato un ambiente di sviluppo? Ci sei riuscito? È complicato su una VPN.

Domani farò un ripristino e riproverò, stasera ho l’emicrania.

Ti farò sapere come va :slightly_smiling_face:

1 Mi Piace

Hai configurato un ambiente di sviluppo? È stato il tuo primo passo?

Ho provato a farlo tramite il VPS host e a improvvisarlo tramite il container. Quando ho finito non ero sicuro di cosa avessi fatto e dove. È probabile che sia un problema di abilità… Domani ricomincerò da capo.

Se lo stai facendo su una VM, farlo in un container è probabilmente più facile. Cercherei altri esempi di importazione (includeranno il template mysql).

Entrerai nel container, magari modificherai il Gemfile e farai il bundle install.

Usare un container per mysql o mariadb ha probabilmente senso. (ma poi dovrai assicurarti che i container possano vedersi)

1 Mi Piace

Ho una notizia entusiasmante…

Ho fatto funzionare lo script (farò una guida una volta finito), ha importato i gruppi di utenti, ma è bloccato sull’importazione degli utenti, penso a causa della variabile del fuso orario?

importing users
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/tzinfo-2.0.6/lib/tzinfo/timestamp.rb:138:in `for': Integer values are not supported (ArgumentError)

            raise ArgumentError, "#{value.class} values are not supported" unless is_time_like?(value)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/tzinfo-2.0.6/lib/tzinfo/timezone.rb:575:in `utc_to_local'
        from script/import_scripts/vbulletin.rb:1019:in `parse_timestamp'
        from script/import_scripts/vbulletin.rb:166:in `block (2 levels) in import_users'
        from /var/www/discourse/script/import_scripts/base.rb:267:in `block in create_users'
        from /var/www/discourse/script/import_scripts/base.rb:266:in `each'
        from /var/www/discourse/script/import_scripts/base.rb:266:in `create_users'
        from script/import_scripts/vbulletin.rb:148:in `block in import_users'
        from /var/www/discourse/script/import_scripts/base.rb:951:in `block in batches'
        from <internal:kernel>:187:in `loop'
        from /var/www/discourse/script/import_scripts/base.rb:950:in `batches'
        from script/import_scripts/vbulletin.rb:126:in `import_users'
        from script/import_scripts/vbulletin.rb:82:in `execute'
        from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        from /var/www/discourse/script/import_scripts/vbulletin.rb:1027:in `<main>'

L’impostazione predefinita nello script è “America/Los Angeles” - il forum vBulletin è impostato su (GMT) Europa occidentale, Londra, Lisbona, Casablanca) e l’istanza di Discourse in cui sto importando ha due voci: America/Los Angeles ed Europa/Parigi

Sai quale dovrei scegliere?

Non importa molto quale scegli.

Penso che potrebbe essere che la data non sia memorizzata nel modo in cui lo script si aspetta.

1 Mi Piace