Problema para mesclar dois fóruns

Olá,

Estou unindo dois fóruns através do tutorial presente aqui.

Estou travado no comando gunzip \u003c /path/to/data/other-2018-08-02-134227-v2018xxx.tar.gz | psql -d copyme
Ele me retorna muitas linhas com erros de importação em caracteres ininteligíveis.

Aqui estão os passos realizados:

  • Instalação do Discourse via método oficial em VPS.
  • Importação via GUI do backup a ser mesclado (forumother)
  • Backup deste último (para ter um backup com a versão mais recente do discourse)
  • Importação do backup do fórum de destino (forumdest)
  • Importação do backup do forumother via SFTP na pasta /var/discourse/shared/standalone/backups/default.

Em seguida, vou para a pasta acima e executo o comando tar xvzf forumother.tar.gz (com o nome real do backup).

Direção cd /var/discourse então ./launcher enter app

sudo -u postgres psql e CREATE DATABASE "copyme" ENCODING = 'utf8'; e saio com ``q`

É agora que estou travado.
O comando gunzip \u003c public/backups/default/forumother.tar.gz | psql -d copyme não funciona como está.
O erro é psql: error: connection to server on socket \"/var/run/postgresql/.s.PGSQL.5432\" failed: FATAL: role \"root\" does not exist

Consigo ver que é um problema de conexão, mas não vejo como resolvê-lo.

Tentei fazer login como o usuário postgres su - postgres e então executar o comando gunzip ... mas foi aí que a saída do comando ficou completamente inconsistente.

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

Tentei procurar no fórum, mas não encontrei nada sobre isso.

Então, conto com sua ajuda e agradeço desde já.

PS: Meu inglês é ruim, então é possível que eu não esteja usando as palavras certas para uma boa busca no fórum ou que eu esteja interpretando mal o tutorial citado no início deste post.

Provavelmente, o psql está tentando usar seu usuário atual do sistema (root), que não existe no Postgres. Talvez você precise especificar o usuário ao executar o psql: psql -U postgres

E então verifique esta etapa:

6 curtidas

Obrigado pela resposta, vou tentar hoje à noite e volto para te dizer.

1 curtida

Olá novamente,

Permita-me começar agradecendo sua ajuda. Minha resposta é um pouco longa, mas detalha as etapas realizadas.

Ben, após várias tentativas desde a última mensagem, ainda tenho a impossibilidade de executar o comando gunzip < blabla com sempre um erro de autenticação.

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"

Apresento as etapas realizadas:

  • Comecei com uma instalação oficial limpa.

  • Meus dois backups são feitos com a versão mais recente do Discourse.

  • Importo e restauro meu backup “forumDest”.

  • Faço o upload do backup “ForumOther” para /var/discourse/shared/standalone/backups/default.

  • Conecto via SSH

  • Vou para cd /var/discourse

  • Entro no contêiner com o comando ./launcher enter app.
    Descompacto o arquivo “ForumOther.tar.gz” localizado em /var/discourse/shared/standalone/backups/default

  • Redefino a senha

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

Aqui está o resultado do comando ls, sendo forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz o ForumOther e home-assistant-communaute-francophone-2022-04-24-111032-v20220304162250.tar.gz o ForumDest

Redefino a senha do postgres com os seguintes comandos:

sudo -u postgres psql
\password postgres
(digite a nova senha)
\q

Isso resulta em:

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
  • Criação do banco de dados “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$
  • Executo o 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
    ou gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz | psql -U postgres -d copyme
    como mencionado.

Não consigo ver o início do processo, mas no final ele sempre me retorna:

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$

Então entendo que há um problema com a codificação?

O que tentei:
Dissociando os comandos:

  • Descompactando o backup ForumOther gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz que parece extrair algo em linguagem incompreensível
  • Entrando no 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=#

Mas uma vez conectado à base “copyme”, não vejo o que fazer.

Olhei o seguinte para os comandos de IMPORT, mas o mesmo, onde eles devem ser executados? Como fazer? Com qual usuário?

Vamos tentar passo a passo.

Se eu conseguir, colocarei com mais precisão meu procedimento detalhando um pouco mais que o tutorial original (que tem o mérito de explicar os princípios básicos e de existir).

Obrigado novamente pelo seu tempo e ajuda.

Olá a todos,

Fiz um bom progresso no meu problema.

Agora estou preso pouco antes da execução do script de importação.

Eu rodo bundle install e depois IMPORT=1 bundle install e neste ponto recebo este erro

Um erro ocorreu ao instalar tiny_tds(2.1.5, e o Bundler não pode continuar

Ainda executo o 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

Desta vez, é este erro

A origem git https://github.com/nlalonde/ruby-bbcode-to-md ainda não foi verificada.
Por favor, execute `bundle install` antes de tentar iniciar sua aplicação

Você tem alguma ideia?
Obrigado

Olá,

Mais um passo à frente, no objetivo de mesclar dois fóruns.

Não tenho mais nenhum problema de dependência, mas parece que tenho um problema de permissão ao executar o script.

Executo o script com uma base local em uma instalação oficial do discourse.

O comando do script que executo e o retorno:

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

Obrigado

Também anexo os comandos executados (que podem ser úteis para outros).

Faça o upload de other.forum.backup em /var/discourse/shared/standalone/backups/default e extraia 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

Instale as dependências nano, sqlite3 e mysql2
Com o usuário 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
Você precisa do FreeTDS para instalar o 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

Executar 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 curtida

Parece que você teve azar com o momento em que está fazendo isso. 11 dias atrás, houve um commit atualizando o Discourse para usar o Rails 7. Os scripts de importação usam o método ActiveRecord::Base.connection_config, que foi removido com o Rails 7.0.0rc1.

@loic Parece que os scripts de importação podem ter sido esquecidos durante a atualização.

1 curtida

Ah, obrigado por esta resposta,

É uma ótima notícia, porque eu não via de onde poderia vir.

Vou esperar pela atualização, a menos que eu possa atualizar o script de mesclagem eu mesmo?

Obrigado

1 curtida

Acabei de abrir um PR, ele deve ser mesclado em breve :slight_smile:

3 curtidas

Olá,

Muito obrigado pelo acompanhamento e pela reatividade.

Como a migração de dois fóruns é um caminho longo e cheio de armadilhas, estou novamente confrontado com um problema.
Acabei de fazer a modificação no arquivo discourse_merge.rb e depois executei o comando novamente.

Agora tenho um problema com um HASH existente.

Entendo que é um problema de duplicidade, mas de que natureza?

Já excluí um usuário duplicado, depois de tentar renomeá-lo para o meu teste, mas agora é este problema de token (ainda acho que duplicatas no nível do usuário são tratadas?)

Obrigado novamente pela sua ajuda.

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

Olá.

Cheguei ao fim desta migração, apesar de vários problemas.

Os últimos problemas vieram de usuários registrados com endereços primários diferentes nos dois fóruns, mas também de tabelas ausentes em um fórum.

Voltarei para colocar o procedimento completo aqui assim que tiver tempo.

Obrigado novamente a @Constanza_Abarca pela ajuda.

1 curtida

Isso implica que as duas instâncias estavam em versões diferentes e/ou tinham plugins diferentes instalados? Acho que minha expectativa, se eu estivesse fazendo uma mesclagem como essa, seria que, antes de qualquer outra coisa, eu deveria:

  • Fazer backups de ambos
  • Garantir que ambos estejam executando a mesma versão do Discourse
  • Garantir que o destino tenha todos os plugins instalados que a origem tem
  • (Opcional?) Garantir que a origem tenha todos os plugins instalados que o destino tem
  • Fazer backups novamente
3 curtidas

Olá,

Os dois fóruns estão na mesma versão, mas talvez não nos mesmos plugins.

Estas são apenas pequenas modificações que fiz manualmente.

Para a fusão real, tentarei com os plugins instalados para ver.