Problème pour fusionner deux forums

Bonjour,

Je fusionne deux forums en suivant le tutoriel présent ici.

Je suis bloqué sur la commande gunzip < /path/to/data/other-2018-08-02-134227-v2018xxx.tar.gz | psql -d copyme
Elle me retourne plein de lignes avec des erreurs d’importation en caractères incompréhensibles.

Voici les étapes effectuées :

  • Installation de Discourse via la méthode officielle sur VPS.
  • Import via l’interface graphique de la sauvegarde à fusionner (forumother)
  • Sauvegarde de cette dernière (pour avoir une sauvegarde avec la dernière version de discourse)
  • Import de la sauvegarde du forum de destination (forumdest)
  • Import de la sauvegarde de forumother via SFTP dans le dossier /var/discourse/shared/standalone/backups/default.

Puis je vais dans le dossier ci-dessus et j’exécute la commande tar xvzf forumother.tar.gz (avec le vrai nom de la sauvegarde).

Direction cd /var/discourse puis ./launcher enter app

sudo -u postgres psql et CREATE DATABASE "copyme" ENCODING = 'utf8'; et je quitte avec q

C’est là que je suis bloqué.
La commande gunzip < public/backups/default/forumother.tar.gz | psql -d copyme ne fonctionne pas telle quelle.
L’erreur est psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: role "root" does not exist

Je vois qu’il s’agit d’un problème de connexion, mais je ne vois pas comment le résoudre.

J’ai essayé de me connecter en tant qu’utilisateur postgres su - postgres puis d’exécuter la commande gunzip ... mais c’est là que la sortie de la commande est complètement incohérente.

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
invalide command \W
invalide command \IeY┴WPC<P%£6؜◆BP␌U@Q█5
␋┼┴▒┌␋␍ ␌└└▒┼␍ \
␋┼┴▒┌␋␍ ␌└└▒┼␍ \];*░Һ
␋┼┴▒┌␋␍ ␌└└▒┼␍ \FMݤ!"≥"≠±↓QʏC MHȽ◆)E„/M
␋┼┴▒┌␋␍ ␌└└▒┼␍ \
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│␊° █│37 █│49
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│␉␉
␋┼┴▒┌␋␍ ␌└└▒┼␍ \лT4٩3┼←
␋┼┴▒┌␋␍ ␌└└▒┼␍ \^E\C◆≥]B2Ɣ?8[N→^G9← @  ±4?W Y°O͖↓HY┬4
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│␉2
...
invalide command \UWXJ&qkW*S Qy2漆% > N≤OI2·^;├
␋┼┴▒┌␋␍ ␌└└▒┼␍ \2d-ɸjrR*֬
              S3
invalide command \VI
invalide command \}Jݐ
invalide command \BQNr|΅tU~#_k#D,WHfqtC
invalide command \ syJ x%
invalide command \E q
invalide command \-KmJ
invalide command \
invalide command \/ly=}E~ԚYj nO
invalide command \SM!{Co ~UH^x)*O}9vUǙ k}LQ
invalide command \eH<= g TR P R 1}{~/t!wiw hӒCґJmCĥ=;O^p*-
invalide command \ gq{cr}N;.
invalide command \2p3a - . C:m _Y @c<4/mvΩߵj]SޙU"O}$[
invalide command \)
invalide command \
invalide command \WHElnHBDm%?PBFrOڙ}d"
invalide command \P jsחPm q J[B @$Wt* !&|Zz))Q6AJ Y%!/6=JRJBPþA)YTZ┘=!M^␉CO)→└␋9 ┤E▒5█E≤Pі
T│ȐOȾ B)W┌Ad : }1,kNDoO ' G^W5 :B␊I│7!N;─À @#┘
┼┴▒┌␋␍ ␌└└▒┼␍ \ 6◆3
␋┼┴▒┌␋␍ ␌└└▒┼␍ \2�Ψ)VD4π]
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│89
├±␊@├␊├°┤└↑▒:·$

J’ai essayé de chercher sur le forum, mais je n’ai rien trouvé à ce sujet.

Je compte donc sur votre aide et vous remercie par avance.

PS : Mon anglais est mauvais, il est donc possible que je n’utilise pas les bons mots pour une bonne recherche sur le forum ou que j’interprète mal le tutoriel cité au début de ce post.

Probablement, psql essaie d’utiliser votre utilisateur système actuel (root) qui n’existe pas dans Postgres. Vous devrez peut-être spécifier l’utilisateur lors de l’exécution de psql : psql -U postgres

Et vérifiez ensuite cette étape :

[quote=“Neil Lalonde, post:1, topic:95435, username:neil”]Si vous exécutez l’importation dans un conteneur Docker officiel (recommandé), vous devrez réinitialiser le mot de passe postgres pour le fournir au script, sinon vous pourriez rencontrer une erreur indiquant que l’utilisateur postgres ne peut pas accéder à la base de données.

Pour changer le mot de passe :

sudo -u postgres psql
\\password postgres
(entrez le nouveau mot de passe)
\\q

[/quote]

6 « J'aime »

Merci pour la réponse, j’essaierai ce soir et je reviendrai vers vous pour vous dire.

1 « J'aime »

Bonjour,

Permettez-moi de commencer par vous remercier pour votre aide. Ma réponse est un peu longue, mais elle détaille les étapes suivies.

Ben après plusieurs essais depuis le dernier message, j’ai toujours l’impossibilité d’exécuter la commande gunzip < blabla avec toujours une erreur d’authentification.

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"

Je vous donne les étapes effectuées :

  • Je suis parti d’une installation officielle fraîche.

  • Mes deux sauvegardes sont faites avec la dernière version de Discourse.

  • J’importe et restaure ma sauvegarde « forumDest ».

  • Je télécharge la sauvegarde « ForumOther » dans /var/discourse/shared/standalone/backups/default.

  • Je me connecte avec SSH

  • Je vais dans cd /var/discourse

  • J’entre dans le conteneur avec la commande ./launcher enter app.
    Je décompresse l’archive « ForumOther.tar.gz » située dans /var/discourse/shared/standalone/backups/default

  • Je réinitialise le mot de passe

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

Voici le résultat de la commande ls forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz étant ForumOther et home-assistant-communaute-francophone-2022-04-24-111032-v20220304162250.tar.gz étant ForumDest

Je réinitialise le mot de passe postgres avec les commandes suivantes :

sudo -u postgres psql
\password postgres
(entrer le nouveau mot de passe)
\q

Ce qui donne :

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
  • Création de la base de données « 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$
  • J’exécute la commande 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
    comme mentionné.

Je ne vois pas le début du processus, mais à la fin il me remet toujours

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$

Je comprends donc qu’il y a un problème d’encodage ?

Ce que j’ai essayé :
Dissocier les commandes :

  • Décompression de la sauvegarde ForumOther gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz qui semble extraire quelque chose dans un langage incompréhensible
  • Connexion sur 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=#

Mais une fois connecté à la base « copyme » je ne vois pas quoi faire.

J’ai regardé ce qui suit pour les commandes d’IMPORT, mais même chose, où doivent-elles être exécutées ? Comment faire ? Avec quel utilisateur ?

Essayons étape par étape.

Si j’y arrive, je mettrai plus précisément ma procédure en détaillant un peu plus que le tutoriel d’origine (qui a le mérite d’expliquer les grands principes et d’exister).

Merci encore pour votre temps et votre aide.

Bonjour à tous,

J’ai bien progressé sur mon problème.

Je suis maintenant bloqué juste avant l’exécution du script d’importation.

J’exécute bundle install puis IMPORT=1 bundle install et à ce moment-là, j’obtiens cette erreur :

An error occurred while installing tiny_tds(2.1.5, and Bundler cannot continue

J’exécute toujours la commande complète 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

Cette fois, c’est cette erreur :

The git source https://github.com/nlalonde/ruby-bbcode-to-md is not yet checked out.
Please run `bundle install` before trying to start your application

Avez-vous une idée ?
Merci

Bonjour,

Une autre étape franchie dans le but de fusionner deux forums.

Je n’ai plus de problème de dépendance, mais j’ai un problème de droits lors du lancement du script.

Je lance le script avec une base locale sur une installation officielle de discourse.

La commande du script que j’exécute et le retour :

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
:Class (NoMethodError)
Did you mean?  connection_db_config                                                          
               connection_pool                                                               
               connection_class                                                              
               connection_class?                                                             
               connection_class=                                                             

Merci

Je vous joins également les commandes lancées (qui pourraient être utiles à d’autres).

Upload other.forum.backup dans /var/discourse/shared/standalone/backups/default et extraction de 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

Installation des dépendances nano, sqlite3 et mysql2
Avec l’utilisateur 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

Installation de Tiny_tds
Vous avez besoin de FreeTDS pour installer 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

Pour tiny_tds

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

Lancement du 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 « J'aime »

Il semble que vous ayez eu un mauvais timing. Il y a 11 jours, un commit a mis à niveau Discourse pour utiliser Rails 7. Les scripts d’importation utilisent la méthode ActiveRecord::Base.connection_config qui a été supprimée avec Rails 7.0.0rc1.

@loic Il semble que les scripts d’importation aient été oubliés lors de la mise à niveau.

1 « J'aime »

Oh merci pour cette réponse,

C’est une excellente nouvelle, car je ne voyais pas d’où cela pouvait venir.

Je vais attendre la mise à jour, sauf si je peux mettre à jour le script de fusion moi-même ?

Merci

1 « J'aime »

Je viens d’ouvrir une PR, elle devrait être fusionnée bientôt :slight_smile:

3 « J'aime »

Bonjour,

Merci beaucoup pour votre suivi et votre réactivité.

La migration de deux forums étant un long chemin semé d’embûches, je suis à nouveau confronté à un problème.
Je viens de faire la modification du fichier discourse_merge.rb puis de relancer la commande.

J’ai maintenant un problème avec un HASH existant.

Je comprends qu’il s’agit d’un problème de doublon, mais de quelle nature ?

J’ai déjà supprimé un utilisateur en doublon, après avoir essayé de le renommer pour mon essai, mais maintenant c’est ce problème de token (pourtant je pense que les doublons au niveau des utilisateurs sont gérés ?)

Merci encore pour votre aide.

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

Salut.

J’arrive à la fin de cette migration malgré plusieurs problèmes.

Les derniers problèmes provenaient d’utilisateurs enregistrés avec des adresses primaires différentes sur les deux forums, mais aussi de tables manquantes sur un forum.

Je reviendrai pour mettre la procédure complète ici dès que j’aurai un peu de temps.

Merci encore à @Constanza_Abarca pour son aide.

1 « J'aime »

Cela implique-t-il que les deux instances étaient sur des versions différentes et/ou avaient des plugins différents installés ? Je pense que mon attente, si je devais faire une fusion comme celle-ci moi-même, serait qu’avant toute autre chose, je devrais :

  • Faire des sauvegardes des deux
  • S’assurer que les deux exécutent la même version de Discourse
  • S’assurer que la cible a tous les plugins installés que la source a
  • (Optionnel ?) S’assurer que la source a tous les plugins installés que la cible a
  • Faire à nouveau des sauvegardes
3 « J'aime »

Bonjour,

Les deux forums sont sur la même version mais peut-être pas les mêmes plugins.

Ce ne sont que de petites modifications que j’ai faites à la main.

Pour la vraie fusion, j’essaierai avec les plugins installés pour voir.