Problema per unire due forum

Ciao,

Sto unendo due forum seguendo il tutorial presente qui.

Mi blocco sul comando gunzip < /path/to/data/other-2018-08-02-134227-v2018xxx.tar.gz | psql -d copyme
Mi restituisce molte righe con errori di importazione in caratteri incomprensibili.

Ecco i passaggi eseguiti:

  • Installazione di Discourse tramite metodo ufficiale su VPS.
  • Import tramite GUI del backup da unire (forumother)
  • Backup di quest’ultimo (per avere un backup con l’ultima versione di discourse)
  • Import del backup del forum di destinazione (forumdest)
  • Import del backup di forumother tramite SFTP nella cartella /var/discourse/shared/standalone/backups/default.

Quindi vado nella cartella sopra e eseguo il comando tar xvzf forumother.tar.gz (con il nome reale del backup).

Direzione cd /var/discourse poi ./launcher enter app

sudo -u postgres psql e CREATE DATABASE "copyme" ENCODING = 'utf8'; e esco con q

È qui che mi blocco.
Il comando gunzip < public/backups/default/forumother.tar.gz | psql -d copyme non funziona come dovrebbe.
L’errore è psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: role "root" does not exist

Vedo che si tratta di un problema di connessione, ma non riesco a capire come risolverlo.

Ho provato ad accedere come utente postgres su - postgres e poi ad eseguire il comando gunzip ... ma è allora che l’output del comando diventa completamente incoerente.

postgres@testforum-app:~$ gunzip < /var/www/discourse/public/backups/default/forum-francophon
e-home-assistant-2022-04-24-120337-v20220407195246.tar.gz | psql -d copyme3
invalid command \W
invalid command \?IeY┴WPC\u0018\u003cP%£6؜\u001f◆BP␌U@Q█5
␋┼┴▒┌␋␍ ␌└└▒┼␍ \
␋┼┴▒┌␋␍ ␌└└▒┼␍ \];*░Һ
␋┼┴▒┌␋␍ ␌└└▒┼␍ \FMݤ!\u0011≥"≠\u0014±↓\u001cQʏC\u001dMHȽ◆)\u0026E„/M6\u0010\u000b!◆┐
␋┼┴▒┌␋␍ ␌└└▒┼␍ \u0018↑
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│␊° █│37 █│49
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│␉␉
␋┼┴▒┌␋␍ ␌└└▒┼␍ \лT4٩3┼←
␋┼┴▒┌␋␍ ␌└└▒┼␍ \\\u0016^E\u001aC◆≥]B2Ɣ?8[\u0012N→^G9←\u001f@  ±\u001d4?W\u001fY\u0013°O͖↓\u0014HY┬4
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│␉2
...
invalid command \UWXJ\u0026qkW*S\u0019Qy2漆\u0026\u0015%\u003e\u0004N≤OI2·^;├
␋┼┴▒┌␋␍ ␌└└▒┼␍ \2d\u001d-ɸjrR*֬\u0016\u0014\u001e\u0026\u0013^_'\u0013\u0005Ƶ褚N2H\u0012hIu
S3
invalid command \VI
invalid command \}Jݐ
invalid command \BQNr|΅tU~#_k#D,WHfqtC
invalid command \\\u0002syJ\u0006\u0016x%
invalid command \E\u0016q
invalid command \-KmJ
invalid command \
invalid command \/ly=}E~ԚYj\u003enO
invalid command \SM!{Co\u0001~UH^x)*O}9vUǙ\u001ek}LQ
invalid command \eH\u003c=\u0019g\u0006TR\u0003P\u0002R\u00061}{~/t!wiw\u0011hӒC\u0010ґJmCĥ=;O^p*-
invalid command \\\u001cgq{cr}N;.
invalid command \2p3a\u0013-.\u0010C:m\u001f_Y\u0016\u0017@c\u003c4/mvΩߵj]SޙU"O}$[
invalid command \)
invalid command \
invalid command \V\u0006OtDIM2+͆Yq4\u0014ŠR\u0014
invalid command \WHElnHBDm%?PBFrOڙ}d"
invalid command \P\u0004jsחPm\u0006q\u0013\u0019J[B\u0001@$Wt*\u0003!\u0026|Zz))Q6AJ\u0012\u0005Y%!/6=JRJBPþA)YTZ┘=!M^␉CO)→└␋9\u0004\u001f┤E▒5█E≤Pі
T│ȐOȾ\u001cB)W┌Ad\u0004\u001c:\u0004\u001e}1,kNDoO\u001c\u001e')G^W5\u000b:B␊I│7!N;─À\u001f@#┘\u0017
┼┴▒┌␋␍ ␌└└▒┼␍ \u00026◆3
␋┼┴▒┌␋␍ ␌└└▒┼␍ \2�Ψ)VD4π]
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│89
├±␊@├␊├°┤└↑▒:·$

Ho provato a cercare sul forum, ma non ho trovato nulla a riguardo.

Quindi conto sul tuo aiuto e ti ringrazio in anticipo.

PS: Il mio inglese è scarso, quindi è possibile che non stia usando le parole giuste per una buona ricerca sul forum o che stia interpretando male il tutorial citato all’inizio di questo post.

Probabilmente, psql sta cercando di usare il tuo attuale utente di sistema (root) che non esiste in Postgres. Potrebbe essere necessario specificare l’utente durante l’esecuzione di psql: psql -U postgres

E quindi controlla questo passaggio:

6 Mi Piace

Grazie per la risposta, ci proverò stasera e ti farò sapere.

1 Mi Piace

Ciao di nuovo,

Permettimi di iniziare ringraziandoti per il tuo aiuto. La mia risposta è un po’ lunga, ma dettaglia i passaggi eseguiti.

Ben dopo diversi tentativi dall’ultimo messaggio, ho ancora l’impossibilità di eseguire il comando gunzip < blabla con sempre un errore di autenticazione.

discourse@testforum-app:/var/www/discourse$ gunzip < public/backups/default/forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz | psql -U postgres -d copyme
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "postgres"

Ti fornisco i passaggi eseguiti:

  • Sono partito da un’installazione ufficiale fresca.

  • I miei due backup sono realizzati con l’ultima versione di Discourse.

  • Importo e ripristino il mio backup “forumDest”.

  • Carico il backup “ForumOther” in /var/discourse/shared/standalone/backups/default.

  • Mi connetto con SSH

  • Vado in cd /var/discourse

  • Entro nel container con il comando ./launcher enter app.
    Scompatto l’archivio “ForumOther.tar.gz” situato in /var/discourse/shared/standalone/backups/default

  • Reimposto la password

root@testforum-app:/var/www/discourse/public/backups/default# ls
dump.sql.gz
forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz
home-assistant-communaute-francophone-2022-04-24-111032-v20220304162250.tar.gz
uploads

Ecco il risultato del comando ls forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz essendo ForumOther e home-assistant-communaute-francophone-2022-04-24-111032-v20220304162250.tar.gz essendo ForumDest

Reimposto la password di postgres con i seguenti comandi:

sudo -u postgres psql
\password postgres
(inserisci la nuova password)
\q

Questo dà:

root@testforum-app:/var/www/discourse/public/backups/default# sudo -u postgres psql
psql (13.6 (Debian 13.6-1.pgdg110+1))
Type "help" for help.

postgres=# \password postgres
Enter new password for user "postgres":
Enter it again:
postgres=# \q
  • Creazione del database “copyme”
root@testforum-app:/var/www/discourse/public/backups/default# su postgres
postgres@testforum-app:/var/www/discourse/public/backups/default$ psql
psql (13.6 (Debian 13.6-1.pgdg110+1))
Type "help" for help.
postgres=# CREATE DATABASE "copyme2" ENCODING = 'utf8';
CREATE DATABASE
postgres=# \q
postgres@testforum-app:/var/www/discourse/public/backups/default$
  • Eseguo il comando postgres@testforum-app:/var/www/discourse/public/backups/default$ gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz | psql -d copyme
    o gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz | psql -U postgres -d copyme
    come menzionato.

Non riesco a vedere l’inizio del processo, ma alla fine mi rimette sempre

invalid command \P�jvsחP�m���q��J[B���@$��W�t*����!&|Zz)��)��Q�6�AJ�Y��%!/6=�JR��J��BPþ�A�)�YTZ�j��=! M��^bCO)+mi9���u�p�E��a��50��E�y��P���і��TxȐ��OȾ����B�)Wl��Ad�������:���}1���,kNDo�O�')G��^W����5��
                                                                                                                                                                                                        :��B�eIx7!N��;q�À@�#j���*
invalid command \�6���`�3�
invalid command \�2��󟯹�Ψ�)��V��D��4{]�
ERROR: invalid byte sequence for encoding "UTF8": 0x89
postgres@testforum-app:/var/www/discourse/public/backups/default$

Quindi capisco che c’è un problema con la codifica?

Cosa ho provato:
Dissociando i comandi:

  • Scompattando il backup ForumOther gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz che sembra estrarre qualcosa in linguaggio incomprensibile
  • Entrando nel DB psql -d copyme
postgres@testforum-app:/var/www/discourse/public/backups/default$ psql -d copyme
psql (13.6 (Debian 13.6-1.pgdg110+1))
Type "help" for help.

copyme=#

Ma una volta connesso alla base “copyme” non vedo cosa fare.

Ho guardato quanto segue per i comandi di IMPORT, ma stessa cosa, dove dovrebbero essere eseguiti? Come fare? Con quale utente?

Proviamo passo dopo passo.

Se ci riesco, metterò più precisamente la mia procedura dettagliando un po’ di più del tutorial originale (che ha il merito di spiegare i principi principali e di esistere).

Grazie ancora per il tuo tempo e aiuto.

Ciao a tutti,

Ho fatto buoni progressi sul mio problema.

Ora sono bloccato poco prima che venga eseguito lo script di importazione.

Eseguo bundle install e poi IMPORT=1 bundle install e a questo punto ricevo questo errore

Si è verificato un errore durante l'installazione di tiny_tds(2.1.5, e Bundler non può continuare

Eseguo ancora il comando completo IMPORT=1 DB_NAME=copyme DB_PASS=password SOURCE_BASE_URL= UPLOADS_PATH=/var/www/discourse/public/uploads/default bundle exec ruby script/bulk_import/discourse_merger.rb

Questa volta, è questo errore

La sorgente git https://github.com/nlalonde/ruby-bbcode-to-md non è ancora stata scaricata.
Si prega di eseguire `bundle install` prima di tentare di avviare la tua applicazione

Hai qualche idea?
Grazie

Ciao,

Un altro passo avanti, nell’obiettivo di unire due forum.

Non ho più problemi di dipendenza, ma sembra che abbia un problema di permessi quando avvio lo script.

Avvio lo script con una base locale su un’installazione ufficiale di discourse.

Il comando dello script che eseguo e il suo output:

discourse@testforum-app:/var/www/discourse$ IMPORT=1 DB_NAME=copyme DB_PASS=hacf2022 SOURCE_B
exec ruby script/bulk_import/discourse_merger.rb
Caricamento dell'applicazione...
Traceback (most recent call last):
        3: from script/bulk_import/discourse_merger.rb:817:in `<main>'
        2: from script/bulk_import/discourse_merger.rb:817:in `new'
        1: from script/bulk_import/discourse_merger.rb:21:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activerecord-7.0.2.4/lib/active_record/dynam
e:Class (NoMethodError)
Did you mean?  connection_db_config
               connection_pool
               connection_class
               connection_class?
               connection_class=

Grazie

Allego anche i comandi eseguiti (che potrebbero essere utili ad altri).

Carica other.forum.backup in /var/discourse/shared/standalone/backups/default ed estrai tar xvzf other.forum.backup.tar.gz

cd `/var/discourse
./laucher enter app
su postgres
psql
CREATE DATABASE "copyme" ENCODING = 'utf8';
\password postgres
\q
exit
su discourse
gunzip < public/backups/default/dump.sql.gz | psql -d copyme
exit

Installa le dipendenze nano, sqlite3 e mysql2
Con utente root

apt update && apt upgrade
apt-get install -y nano sqlite3 libsqlite3-dev mariadb-server libmariadb-dev
gem install sqlite3 mysql2

ruby bbcode to md

git clone https://github.com/nlalonde/ruby-bbcode-to-md.git
cd ruby-bbcode-to-md
gem build ruby-bbcode-to-md.gemspec
gem install ruby-bbcode-to-md-*.gem

Installa Tiny_tds
Hai bisogno di FreeTDS per installare Tiny_tds.

wget http://www.freetds.org/files/stable/freetds-1.3.10.tar.gz
tar -xzf freetds-1.3.10.tar.gz
cd freetds-1.3.10
./configure --prefix=/usr/local --with-tdsver=7.3
make
make install

Per tiny_tds

gem install tiny_tds
gem install ruby-bbcode-to-md

Esegui lo script

su discourse
bundle config unset deployment
IMPORT=1 bundle install
IMPORT=1 DB_NAME=copyme DB_PASS=passpostgres SOURCE_BASE_URL=http://other.forum.fr UPLOADS_PATH=/var/www/discourse/public/uploads/default bundle exec ruby script/bulk_import/discourse_merger.rb
1 Mi Piace

Sembra che tu abbia avuto sfortuna con i tempi in cui stai facendo questo. 11 giorni fa c’è stato un commit che ha aggiornato Discourse per utilizzare Rails 7. Gli script di importazione utilizzano il metodo ActiveRecord::Base.connection_config che è stato rimosso con Rails 7.0.0rc1.
@loic Sembra che gli script di importazione possano essere stati trascurati durante l’aggiornamento.

1 Mi Piace

Oh grazie per questa risposta,

È un’ottima notizia, perché non avevo visto da dove potesse provenire.

Aspetterò l’aggiornamento, tranne se posso aggiornare io stesso lo script di merge?

Grazie

1 Mi Piace

Ho appena aperto una PR, dovrebbe essere unita presto :slight_smile:

3 Mi Piace

Ciao,

Grazie mille per il follow-up e per la reattività.

Poiché la migrazione di due forum è un percorso lungo e pieno di insidie, mi ritrovo di nuovo di fronte a un problema.
Ho appena apportato la modifica al file discourse_merge.rb e quindi rieseguito il comando.

Ora ho un problema con un HASH esistente.

Capisco che si tratta di un problema di duplicati, ma di che natura?

Ho già eliminato un utente duplicato, dopo aver tentato di rinominarlo per la mia prova, ma ora è questo problema del token (anche se penso che i duplicati a livello di utente vengano gestiti?)

Grazie ancora per il tuo aiuto.

discourse@testforum-app:/var/www/discourse$ IMPORT=1 DB_NAME=copyme DB_PASS=password SOURCE_BASE_URL=http://other.forum.fr UPLOADS_PATH=/var/www/discourse/public/uploads/default bundle exec ruby script/bulk_import/discourse_merger.rb
Loading application...
Starting...
Preloading I18n...
Fixing highest post numbers...
Loading imported group ids...
Loading imported user ids...
Loading imported category ids...
Loading imported topic ids...
Loading imported post ids...
Loading groups indexes...
Loading users indexes...
Loading categories indexes...
Loading topics indexes...
Loading posts indexes...
Loading post actions indexes...

merging users...
copying email_tokens...
Traceback (most recent call last):
    7: from script/bulk_import/discourse_merger.rb:817:in `<main>'
    6: from script/bulk_import/discourse_merger.rb:71:in `start'
    5: from /var/www/discourse/script/bulk_import/base.rb:100:in `run'
    4: from script/bulk_import/discourse_merger.rb:82:in `execute'
    3: from script/bulk_import/discourse_merger.rb:145:in `copy_user_stuff'
    2: from script/bulk_import/discourse_merger.rb:445:in `copy_model'
    1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.3.5/lib/pg/connection.rb:262:in `copy_data'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.3.5/lib/pg/connection.rb:262:in `get_last_result': ERROR:  duplicate key value violates unique constraint "index_email_tokens_on_token_hash" (PG::UniqueViolation)
DETAIL:  Key (token_hash)=(07165399523fcdce0679e45950f0260b61386a5c886e3e68fa6cf047d84d1caf) already exists.
CONTEXT:  COPY email_tokens, line 1

Ciao.

Sono arrivato alla fine di questa migrazione nonostante diversi problemi.

Gli ultimi problemi sono derivati da utenti registrati con indirizzi primari diversi sui due forum, ma anche da tabelle mancanti su un forum.

Tornerò a inserire qui la procedura completa non appena avrò un po’ di tempo.

Grazie ancora a @Constanza_Abarca per il suo aiuto.

1 Mi Piace

Ciò implica che le due istanze erano su versioni diverse e/o avevano plugin diversi installati? Penso che la mia aspettativa, se dovessi fare un’unione simile, sarebbe che prima di ogni altra cosa dovrei:

  • Eseguire backup da entrambi
  • Assicurarmi che entrambi eseguano la stessa versione di Discourse
  • Assicurarmi che la destinazione abbia tutti i plugin installati che ha la sorgente
  • (Opzionale?) Assicurarmi che la sorgente abbia tutti i plugin installati che ha la destinazione
  • Eseguire nuovamente i backup
3 Mi Piace

Ciao,

I due forum sono sulla stessa versione ma forse non sugli stessi plugin.

Queste sono solo piccole modifiche che ho apportato manualmente.

Per il merge vero e proprio proverò con i plugin installati per vedere.