Problema para fusionar dos foros

Hola,

Estoy fusionando dos foros juntos a través del tutorial presente aquí.

Me estoy atascando en el comando gunzip < /path/to/data/other-2018-08-02-134227-v2018xxx.tar.gz | psql -d copyme
Me devuelve muchas líneas con errores de importación en caracteres ininteligibles.

Aquí están los pasos realizados:

  • Instalación de Discourse a través del método oficial en VPS.
  • Importación a través de la GUI de la copia de seguridad a fusionar (forumother).
  • Copia de seguridad de esta última (para tener una copia de seguridad con la última versión de discourse).
  • Importación de la copia de seguridad del foro de destino (forumdest).
  • Importación de la copia de seguridad de forumother a través de SFTP en la carpeta /var/discourse/shared/standalone/backups/default.

Luego voy a la carpeta anterior y ejecuto el comando tar xvzf forumother.tar.gz (con el nombre real de la copia de seguridad).

Dirección cd /var/discourse luego ./launcher enter app

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

Es aquí donde me atasco.
El comando gunzip < public/backups/default/forumother.tar.gz | psql -d copyme no funciona como está.
El error es psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: role "root" does not exist

Veo que es un problema de conexión, pero no veo cómo resolverlo.

Intenté iniciar sesión como el usuario postgres su - postgres y luego ejecutar el comando gunzip ... pero es entonces cuando la salida del comando es completamente inconsistente.

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
invalido command \B{W                                                                         
invalido 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                                      
...                                                           
invalido command \UWXJ\u0026qkW*S\u0019Qy2漆\u0026\u0015%\u003e\u0004N≤OI2·^;├                                               
␋┼┴▒┌␋␍ ␌└└▒┼␍ \2d\u001d-ɸjrR*֬\u0016\u0014\u001e\u0026\u0013^_'\u0013\u0005Ƶ褚N2H\u0012hIu                                               
                                              S3                                             
invalido command \VI                                                                          
invalido command \}Jݐ                                                                         
invalido command \BQNr|΅tU~#_k#D,WHfqtC                                                       
invalido command \\\u0002syJ\u0006\u0016x%                                                                    
invalido command \E\u0016q                                                                         
invalido command \-KmJ                                                                        
invalido command \                                                                            
invalido command \/ly=}E~ԚYj\u003enO                                                               
invalido command \SM!{Co\u0001~UH^x)*O}9vUǙ\u001ek}LQ                                                   
invalido command \eH\u003c=\u0019g\u0006TR\u0003P\u0002R\u00061}{~/t!wiw\u0011hӒC\u0010ґJmCĥ=;O^p*-                                   
invalido command \\\u001cgq{cr}N;.                                                                  
invalido command \2p3a\u0013-.\u0010C:m\u001f_Y\u0016\u0017@c\u003c4/mvΩߵj]SޙU"O}$[                                         
invalido command \)                                                                           
invalido command \                                                                            
invalido command \V\u0006OtDIM2+͆Yq4\u0014ŠR\u0014                                                           
invalido command \WHElnHBDm%?PBFrOڙ}d"                                                        
invalido 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і\nT│Ȑ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                                      
├±␊@├␊├°┤└↑▒:·$                                                                    

Intenté buscar en el foro, pero no encontré nada sobre esto.

Así que cuento con tu ayuda y te agradezco de antemano.

PD: Mi inglés es malo, así que es posible que no esté usando las palabras correctas para una buena búsqueda en el foro o que esté malinterpretando el tutorial citado al principio de esta publicación.

Probablemente, psql está intentando usar tu usuario actual del sistema (root), el cual no existe en Postgres. Es posible que necesites especificar el usuario al ejecutar psql: psql -U postgres

Y luego, revisa este paso:

6 Me gusta

Gracias por la respuesta, lo intentaré esta noche y te diré.

1 me gusta

Hola de nuevo,

Permíteme empezar agradeciéndote tu ayuda. Mi respuesta es un poco larga, pero detalla los pasos seguidos.

Ben, después de varios intentos desde el último mensaje, sigo sin poder ejecutar el comando gunzip < blabla con un error de autenticación siempre.

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"

Te doy los pasos realizados:

  • Empecé desde una instalación oficial nueva.

  • Mis dos copias de seguridad están hechas con la última versión de Discourse.

  • Importo y restauro mi copia de seguridad “forumDest”.

  • Subo la copia de seguridad “ForumOther” a /var/discourse/shared/standalone/backups/default.

  • Me conecto con SSH

  • Voy a cd /var/discourse

  • Entro en el contenedor con el comando ./launcher enter app.
    Descomprimo el archivo “ForumOther.tar.gz” ubicado en /var/discourse/shared/standalone/backups/default

  • Restablezco la contraseña

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

Aquí está el resultado del comando ls siendo forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz ForumOther y home-assistant-communaute-francophone-2022-04-24-111032-v20220304162250.tar.gz ForumDest

Restablezco la contraseña de postgres con los siguientes comandos:

sudo -u postgres psql
\password postgres
(introducir la nueva contraseña)
\q

Esto da:

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
  • Creación de la base de datos “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$
  • Ejecuto el 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
    como se menciona.

No puedo ver el principio del proceso, pero al final siempre me pone

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$

Así que entiendo que hay un problema con la codificación?

Lo que intenté:
Desasociar los comandos:

  • Descomprimir la copia de seguridad de ForumOther gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz que parece extraer algo en un idioma incomprensible
  • Entrar en la 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=#

Pero una vez conectado a la base “copyme” no veo qué hacer.

He mirado lo siguiente para los comandos de IMPORTACIÓN, pero lo mismo, ¿dónde deben ejecutarse? ¿Cómo hacerlo? ¿Con qué usuario?

Intentemos paso a paso.

Si tengo éxito, pondré mi procedimiento con más precisión, detallando un poco más que el tutorial original (que tiene el mérito de explicar los principios principales y de existir).

Gracias de nuevo por tu tiempo y ayuda.

Hola a todos,

He progresado bastante en mi problema.

Ahora estoy atascado justo antes de que se ejecute el script de importación.

Ejecuto bundle install y luego IMPORT=1 bundle install y en este punto obtengo este error

Se produjo un error al instalar tiny_tds(2.1.5, y Bundler no puede continuar

Todavía ejecuto el 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

Esta vez, es este error

La fuente git https://github.com/nlalonde/ruby-bbcode-to-md aún no está registrada.
Por favor, ejecuta `bundle install` antes de intentar iniciar tu aplicación

¿Tienes alguna idea?
Gracias

Hola,

Otro paso adelante, en el objetivo de fusionar dos foros.

Ya no tengo ningún problema de dependencia, pero parece que tengo un problema de permisos al lanzar el script.

Lanzó el script con una base local en una instalación oficial de Discourse.

El comando del script que ejecuto y el resultado:

discourse@testforum-app:/var/www/discourse$ IMPORT=1 DB_NAME=copyme DB_PASS=hacf2022 SOURCE_B
exec ruby script/bulk_import/discourse_merger.rb
Loading application...
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=

Gracias

También adjunto los comandos lanzados (que podrían ser útiles para otros).

Sube other.forum.backup a /var/discourse/shared/standalone/backups/default y extrae 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

Instala las dependencias nano, sqlite3 y mysql2
Con usuario 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

Instalar Tiny_tds
Necesitas FreeTDS para instalar 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

Para tiny_tds

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

Ejecuta el 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 me gusta

Parece que tuviste mala suerte con el momento en que estás haciendo esto. Hace 11 días hubo un commit actualizando Discourse para usar Rails 7. Los scripts de importación usan el método ActiveRecord::Base.connection_config que fue eliminado con Rails 7.0.0rc1.

@loic Parece que los scripts de importación se pasaron por alto al hacer la actualización.

1 me gusta

Oh, gracias por esta respuesta,

Es una gran noticia, porque no veía de dónde podía venir.

¿Esperaré la actualización, excepto si puedo actualizar el script de fusión yo mismo?

Gracias

1 me gusta

Acabo de abrir una PR, debería fusionarse pronto :slight_smile:

3 Me gusta

Hola,

Muchas gracias por el seguimiento y la reactividad.

Como la migración de dos foros es un camino largo y lleno de obstáculos, me vuelvo a enfrentar a un problema.
Acabo de hacer la modificación en el archivo discourse_merge.rb y luego volví a ejecutar el comando.

Ahora tengo un problema con un HASH existente.

Entiendo que es un problema de duplicados, ¿pero de qué naturaleza?

Ya eliminé un usuario duplicado, después de intentar renombrarlo para mi prueba, pero ahora es este problema del token (¿aunque creo que los duplicados a nivel de usuario se manejan?)

Gracias de nuevo por tu ayuda.

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

Hola.

Llego al final de esta migración a pesar de varios problemas.

Los últimos problemas provinieron de usuarios registrados con diferentes direcciones principales en los dos foros, pero también de tablas faltantes en un foro.

Volveré a poner el procedimiento completo aquí tan pronto como tenga tiempo.

Gracias de nuevo a @Constanza_Abarca por su ayuda.

1 me gusta

¿Esto implica que las dos instancias estaban en versiones diferentes y/o tenían diferentes plugins instalados? Creo que mi expectativa si estuviera haciendo una fusión como esta, sería que antes que nada debería:

  • Hacer copias de seguridad de ambos
  • Asegurarme de que ambos ejecutan la misma versión de Discourse
  • Asegurarme de que el destino tiene todos los plugins instalados que tiene la fuente
  • (Opcional) Asegurarme de que la fuente tiene todos los plugins instalados que tiene el destino
  • Hacer copias de seguridad de nuevo
3 Me gusta

Hola,

Los dos foros están en la misma versión, pero quizás no en los mismos plugins.

Estas son solo pequeñas modificaciones que hice a mano.

Para la fusión real, intentaré con los plugins instalados para ver.