Abbiamo provato e stiamo riscontrando questi problemi: ha importato tutti i post, ma i titoli degli argomenti non appaiono e le immagini esterne non vengono visualizzate. L’attuale forum SMF2 è: https://forum.mundofotografico.com.br stiamo cercando di migrare a Discourse qui: https://discourse.fotografos.online - Tutti gli argomenti e le relative descrizioni non sono arrivati, le immagini non vengono caricate… per favore aiutateci! @marcozambi @miligraf @FireAllianceNX @pfaffman
Sto appena iniziando il processo di migrazione SMF e attualmente sto importando post in un’istanza di test a circa 1000/ora, quindi finora tutto procede bene, a parte lo script di prestazioni MySQL in cui MySQL non ha gradito il comando ‘ALTER USER’ per qualche motivo. Ho eseguito manualmente un ‘CREATE USER’ e dopo tutto è andato bene.
Ho letto il commento sugli utenti eliminati, ma non posso facilmente creare nuovi utenti/email fittizie per coprire tutti i miei utenti eliminati (il mio forum è attivo da oltre 20 anni e probabilmente ho più utenti eliminati che utenti reali ora). Sospetto di avere 4-5000 utenti eliminati. Non tutti avranno postato, ma molti lo avranno fatto, quindi probabilmente ho molte centinaia di utenti ‘mancanti’.
I post vengono importati come appartenenti a ‘system’, il che non è molto ideale. Mi sono chiesto se quanto segue funzionerebbe.
- Prima di importare, crea un utente fittizio, ad esempio ‘Utente Eliminato’.
- Scopri il numero utente per ‘Utente Eliminato’
- Modifica la riga “user_id: user_id_from_imported_user_id(message[:id_member]) || -1,” in smf2.rb e sostituisci il ‘-1’ con il numero utente di ‘Utente Eliminato’ (penso che l’utente di sistema sia -1?)
Funzionerebbe? Inoltre, ci sono altri posti in smf2.rb dove dovrei apportare una modifica simile?
Ciao, per “cancellati” intendi che sono effettivamente cancellati dal database di SMF, o sono ancora nel database con il loro nome utente e indirizzo email e contrassegnati come sospesi? Come vengono visualizzati i post di quegli utenti “cancellati” in SMF?
Sono nel bel mezzo di una massiccia migrazione da Drupal a Discourse, anche da un forum di lunga data con tonnellate di utenti sospesi. Volevo assolutamente mantenere gli stessi nomi utente sospesi e i loro indirizzi email associati in Discourse, quindi ho dovuto aggiungere quella funzione allo script di importazione di Drupal per Discourse. In sostanza, lo script importa tutti gli utenti come normali utenti attivi, e se avevano post visibili pubblicamente, anche quelli verranno importati proprio come sul forum originale. Poi, alla fine del processo, ho aggiunto una funzione che ho preso da un altro script di importazione per esaminare il database di Drupal e, se l’utente era contrassegnato come sospeso, sospendere anche l’account Discourse. Puoi vedere il codice per questo nella cronologia dei miei post qui.
Ciao. Gli utenti vengono effettivamente eliminati, ovvero non esiste più un record per loro nella tabella smf_member. SMF non ha una funzione per sospendere gli utenti. Puoi bannare gli utenti, ma non sembra giusto farlo per un account in cui l’utente è deceduto o ha perso interesse per l’hobby/forum. Non è nemmeno corretto dal punto di vista della protezione dei dati.
I post di SMF hanno due campi memorizzati per ogni record… il numero del membro dell’utente, che è impostato a zero per gli utenti eliminati, e il nome del poster, che contiene il nome utente del poster. In questo modo puoi vedere quale utente ha pubblicato il messaggio, ma non ci sono più dettagli (email, nome completo, ecc.) disponibili per l’utente. I loro post hanno un indicatore ‘Guest’ quando vengono visualizzati.
Suppongo che potrei creare un nuovo account utente per ogni utente che ha pubblicato un messaggio con un ID membro pari a zero e assegnare un indirizzo email fittizio per l’account, quindi contrassegnare l’utente come sospeso in seguito. Potrei contrassegnare gli account come sospesi in base al formato dell’indirizzo email fittizio se ne utilizzassi uno unico ma identificabile. Tuttavia, in alcuni casi sembra un po’ strano… creare account per persone che so essere decedute 10-15 anni fa!
Ho tempo per pensarci, però… la migrazione ha funzionato parzialmente, ma ora devo capire perché gli allegati non sono stati allegati, i collegamenti nel forum non sono stati modificati e perché le password per gli utenti migrati non funzionano. Potrebbero esserci anche altri problemi, ma prima lavorerò per risolvere quelli e poi vedrò cos’altro emerge.
Intendi Postgres? Non sono sicuro di cosa si tratti.
Quello che farei è, se l’ID utente è 0, usare il nome utente per l’ID. Quindi, se find_username_by_import_id non riesce a trovare l’utente, crea l’utente, impostando l’indirizzo email su fake_email (è una funzione in base.rb che genera un indirizzo email fittizio) e il nome utente con il nome utente che hai. Quindi, se sei ambizioso, potresti alla fine dello script sospendere tutti gli utenti che hanno @email.invalid nella loro email. Non saranno attivi, quindi non credo che importi molto se non li sospendi.
Un altro modo sarebbe eseguire una query che in qualche modo generi un elenco di tutti gli utenti eliminati e quindi crearli prima di iniziare a fare i post, ma questo sembra più difficile.
Se vuoi creare un utente deleted user e far sì che tutti quei post siano di proprietà di quell’utente invece di system, potresti farlo e sostituire semplicemente il -1 con il numero utente di deleted user. Potresti crearlo come un utente normale o fare qualcosa di speciale e dargli un ID utente di -2 o qualcosa del genere.
In alcuni sistemi questo accade perché a volte gli allegati sono nel corpo del post e altre volte il record dell’allegato è nel database.
Hai installato il plugin Migrated password hashes support dopo aver eseguito l’importazione (può interferire con l’esecuzione delle importazioni in almeno alcune circostanze). SMF2 esegue l’hashing delle password nello stesso modo in cui lo fa smf?
Scusa, nome sbagliato per lo script. È lo script MySQL a cui si fa riferimento nel primo post
– file: ~/smf2/script_for_mysql_tuning.sql
ALTER USER ‘user’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘pass’;
Grazie per i suggerimenti sugli utenti e in particolare su fake_email. Il mio primo compito è imparare abbastanza Ruby per poter apportare modifiche allo script di importazione!
Gli allegati SMF2 sono record nel database. Avendo scavato un po’ più a fondo, sembra che alcuni siano stati importati, ma solo poche centinaia su decine di migliaia. Continuerò a scavare per vedere se riesco a capire perché.
Ahhh, è probabilmente quello che mi manca! Sono abbastanza sicuro che SMF2 utilizzi lo stesso hashing (MD5 salato, se ricordo bene) di SMF1, quindi il plugin sperabilmente risolverà il problema. Devo fare altre esecuzioni di importazione prima di preoccuparmi troppo degli utenti che accedono.
Mi viene in mente un’altra domanda. C’è un modo per resettare il sistema per permettermi di fare un’altra importazione. Avrei dovuto fare un backup prima di iniziare, ma ho dimenticato ![]()
Oh. Intendi solo configurare MySQL. Capisco.
Se conosci altre lingue, probabilmente puoi cavartela.
Ho scritto diversi importatori prima di fare qualsiasi cosa simile all’apprendimento di Ruby. ![]()
Ecco un modo per eliminare e creare un nuovo database Discourse.
sv stop unicorn;DISABLE_DATABASE_ENVIRONMENT_CHECK=1 IMPORT=1 rake db:drop db:create db:migrate; sv start unicorn
Se riesci a ricordare di fare un backup, può essere un po’ più veloce. Forse.
Un altro trucco, una volta che hai capito gli utenti, è fermare lo script dopo che gli utenti sono stati importati ed effettuare un backup in quel momento. Ciò ti consentirà di eseguire il debug dell’importazione dei post senza dover importare nuovamente tutti gli utenti.
Ne conosco alcune. Ho scritto il mio primo programma nel 1976 in codice macchina binario su un Intel 4004. Sto iniziando a capire smf2.rb con un po’ di DuckDuckGoing per comprendere alcune delle strutture di codice che mi sono nuove.
Grazie per il metodo di eliminazione/creazione del database. È ora di ricominciare e vedere se riesco a apportare alcune modifiche incrementali all’importatore per i miei dati.
Sono riuscito a modificare l’importatore per creare account fittizi con un indirizzo email fittizio per gli utenti eliminati e gli account fittizi possiedono i loro post corretti, quindi questo è un buon inizio.
Sto cercando di capire gli allegati ora perché non ne vedo nessuno nei post che ho importato finora (e dovrebbero essercene).
Se creo un messaggio normalmente tramite la pagina web di Discourse, ottengo un record nella tabella posts (id=4346), due record nella tabella uploads (id=403 e 404), quattro record in upload_references (403/Draft/4, 403/Post/4346, 404/Draft/4, 404/Post/4346). Vedo anche 403 nel campo image_upload_id per il post 4346 e HTML che fa riferimento ai due upload nel campo posts/cooked.
Per i post importati, ottengo un record nella tabella posts per ogni messaggio SMF importato e un record nella tabella uploads per ogni allegato associato a un messaggio SMF importato. I record della tabella uploads fanno riferimento a file su disco che contengono le immagini corrette, quindi quella parte funziona bene. Tuttavia, non ottengo alcun record upload_references per le immagini caricate o nessuno degli ID di upload nel campo image_upload_id nella tabella posts.
Presumo che dovrò provare a creare i record upload_references e popolare i campi posts-image_upload_id e cooked, ma volevo prima verificare che non ci sia un altro modo di associare gli upload ai post che viene utilizzato (o che si tenta di utilizzare) dall’importatore?
Sembra che tu debba aggiungere un riferimento all’host/caricamento in raw. Esiste una funzione che genererà un link per te. Non ricordo come si chiama. Penso che sia nel modello di caricamento, ma potrebbe essere più facile trovarlo in qualche altro script di importazione se non sai cos’è un modello.
Stavo facendo progressi modificando lo script di importazione per adattarlo alle particolarità del mio forum, ma mi sono bloccato un paio di giorni fa. Dopo l’ultimo aggiornamento a Discourse beta, non riesco più a creare il container di importazione. Ottengo…
> FAILED
> --------------------
> Pups::ExecError: cd /var/www/discourse && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y libmariadb-dev failed with return #<Process::Status: pid 439 exit 100>
> Location of failure: /usr/local/lib/ruby/gems/3.1.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
> exec failed with the params {"cd"=>"$home", "cmd"=>["echo \"gem 'mysql2'\" >> Gemfile", "apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y libmariadb-dev", "su discourse -c 'bundle config unset deployment'", "su discourse -c 'bundle install --no-deployment --path vendor/bundle --jobs 4 --without test development'"]}
> bootstrap failed with exit code 100
> ** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
Ho visto i post sulla scadenza della chiave yarn e li ho risolti. Questo impediva l’installazione del pacchetto libmariadb-dev, ma ho eseguito un’installazione manuale del pacchetto che ha funzionato correttamente. La ricostruzione dell’importazione non funziona ancora con il template di importazione mysql abilitato, anche dopo aver installato manualmente il pacchetto MariaDB.
Ho creato un nuovo server e ho iniziato con una nuova installazione di Discourse solo per evitare potenziali problemi con il server/installazione precedente. Il nuovo server restituisce lo stesso errore del vecchio.
Non ho idee su cosa provare dopo, quindi accoglierò con favore qualsiasi suggerimento!
Vedi Apt-get update fails inside container yarn repo not signed - #5 by pfaffman. Dovrai modificare il template di mysql.
Grazie per avermi indicato la giusta direzione. Ora capisco cosa ho sbagliato!
Stiamo iniziando con la migrazione di test di un forum SMF 2 (per la precisione v2.0.15) e uno dei primi problemi emersi è un problema quando le categorie hanno una e commerciale nel loro nome:
I titoli dei thread con lo stesso sembrano andare bene:

Finora, sembra che la e commerciale sia l’unico carattere problematico e, ad esempio, le umlaut tedesche vanno bene:
Probabilmente siamo colpiti anche dai problemi segnalati qui nella discussione (utenti cancellati, allegati, link all’interno del forum), ma l’importazione è ancora in corso, quindi aggiornerò una volta completata.
A questo proposito, mi chiedo se la velocità di importazione sia davvero così lenta. Attualmente stiamo importando a 1750 elementi/min (inizialmente era un po’ più vicino a 2000 elementi/min) su una macchina AMD Ryzen 5 3600 con 64 GB di RAM (Hetzner, Ubuntu 22.04), il che porta l’intera migrazione a circa 3 giorni.
Questa è una velocità piuttosto buona.
Immagino che i problemi segnalati esistano ancora, anche se un numero sorprendente di cose è unico per un forum. Se desideri che alcune cose vengano sistemate e hai un budget, sarò felice di aiutarti.
Grazie! Ti farò sapere non appena le cose diventeranno più concrete.
Al momento noi (una piccola organizzazione no-profit incentrata sui giochi di ruolo da tavolo e hobby correlati) siamo in fase di valutazione: c’è consenso sul fatto che vogliamo un nuovo software e Discourse, finora, è l’opzione preferita. Ma dovremo raccogliere tutte le cose da fare (migrazione, nuovo tema, nuovi plugin/componenti del tema se necessario) e vedere se riusciamo a far rientrare tutto nel nostro budget.
C’è un motivo particolare per questo passaggio?
Per quanto posso vedere da una rilettura attenta dell’OP, quel file smf2.rb non viene modificato/patchato?
E se smf2.rb si trova sull’host in (ad esempio) /var/discourse/smf2 e hai configurato il tuo montaggio del volume nel passaggio 2 di conseguenza, è comunque montato all’interno del guest in /shared/smf2.
Non capisco la necessità di copiarlo come passaggio separato. Ma capirlo potrebbe essere la chiave per capire perché il 95% degli allegati non viene trovato correttamente dallo script…
Sembra che tu abbia ragione riguardo al (mancato bisogno) di copiarlo. Forse l’autore lo ha modificato e le sue modifiche sono state successivamente incorporate nel core.
Se ottieni il 5% e non lo 0% degli allegati, allora sembra che ci sia qualcosa che non va nello script.
In alcuni sistemi ci sono due modi per allegare file, uno menzionandolo nel file (quindi è nel testo grezzo del post e viene gestito in quel modo) e un altro avendolo allegato al post in alcuni metadati/tabelle. La mia ipotesi è che tu abbia il 95% nel tuo database fatto in un modo e lo script faccia l’altro.
Ma in qualche modo sembra che stia provando entrambi i modi? Dovrai trovare un post che dovrebbe avere un allegato, guardare nel database e nel file system per vedere come è memorizzato e poi guardare nel codice per capire perché non lo sta ottenendo.
Grazie @pfaffman, questo mi rassicura! Pensavo che fosse così, ma dato che sto avendo così tanti problemi con questa importazione, ho dubitato delle mie conoscenze e abilità a tutti i livelli!
Grazie per i suggerimenti, tutto è apprezzato @pfaffman - questo è un tentativo ritentato e ritardato dello stesso forum su cui stavo lavorando l’anno scorso. È un lavoro pro-bono ma potrei coinvolgerti di nuovo se hai tempo.
È un forum SMF2 molto vecchio che ha allegati nelle due forme:
id_nome_file_NO_CLEAR-case_rules_jpg_32charprobablyMD5hash0fsom4thingid_40charprobablySHA1hash0fsom4thing
Sto ancora cercando di capire se c’è uno schema nei fallimenti.
La mia ipotesi (senza guardare il codice!) è che uno di questi sia ciò che fa lo script e l’altro no (probabilmente uno è il vecchio modo, quindi i nuovi post usano l’altro metodo, ma non è tornato indietro a correggere quelli che usavano l’altro metodo).
Quindi guarda convert_message_body e i campi nella tabella degli allegati. Forse sono passati da MD5 a SHA1 o viceversa per qualche motivo.
Come ho detto, potrebbe essere che una versione di questi abbia un riferimento all’upload invece di averlo collegato nella tabella, quindi faresti un gsub per cercare quel pattern, e poi se corrispondesse, otterresti la chiave, la cercheresti nella tabella e poi create_upload con quel file. .
Spero che questo sia sufficiente per iniziare, ma per favore contattami se desideri più aiuto di quanto posso darti qui.

