두 포럼 병합 시 발생하는 문제

안녕하세요,

여기에 있는 튜토리얼을 따라 두 포럼을 통합하고 있습니다.

gunzip < /path/to/data/other-2018-08-02-134227-v2018xxx.tar.gz | psql -d copyme 명령어에서 막혀 있습니다.
이해할 수 없는 문자로 된 import 오류가 여러 줄 표시됩니다.

실시한 단계는 다음과 같습니다:

  • VPS에서 공식 방법으로 Discourse 설치.
  • 통합할 백업(forumother)을 GUI를 통해 가져오기.
  • 해당 백업 생성 (최신 버전의 discourse 백업을 갖기 위해).
  • 대상 포럼(forumdest)의 백업 가져오기.
  • forumother 백업을 SFTP를 통해 /var/discourse/shared/standalone/backups/default 폴더로 가져오기.

그 후 위 폴더로 이동하여 tar xvzf forumother.tar.gz 명령을 실행했습니다 (실제 백업 파일명을 사용).

cd /var/discourse로 이동한 후 ./launcher enter app 실행

sudo -u postgres psql 실행 후 CREATE DATABASE "copyme" ENCODING = 'utf8'; 입력하고 q 로 종료

지금 이 단계에서 막혀 있습니다.
gunzip < public/backups/default/forumother.tar.gz | psql -d copyme 명령어는 그대로 실행되지 않습니다.
에러 메시지는 psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: role "root" does not exist 입니다.

이것이 연결 문제임을 알 수 있지만, 해결 방법을 찾지 못하고 있습니다.

su - postgres로 postgres 사용자로 로그인한 후 gunzip ... 명령을 실행해 보았지만, 그때부터 명령어 출력이 완전히 일관성이 없습니다.

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 \{wB                                                                         
invalid command \֬IeY┴WPC<P%£6؜◆BP␌U@Q█5                                                  
␋┼┴▒┌␋␍ ␌└└▒┼␍ \                                                                            
␋┼┴▒┌␋␍ ␌└└▒┼␍ \];*░Һ                                                                       
␋┼┴▒┌␋␍ ␌└└▒┼␍ \FMݤ!≥"≠±↓QʏCMHȽ◆)&E/M6!◆┐                                           
␋┼┴▒┌␋␍ ␌└└▒┼␍ \↑                                                                          
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│␊° █│37 █│49                            
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│␉␉                                      
␋┼┴▒┌␋␍ ␌└└▒┼␍ \лT4٩3┼←                                                                    
␋┼┴▒┌␋␍ ␌└└▒┼␍ \^EC◆≥]B2Ɣ?8[N→^G9←@±4?WY°O͖↓HY┬4                                 
ERROR:  ␋┼┴▒┌␋␍ ␉≤├␊ ␊─┤␊┼␌␊ ° ␊┼␌␍␋┼± "UTF8": █│␉2                                      
...                                                           
invalid command \UWXJ&qkW*SQy2漆&%>N≤OI2·^;├                                               
␋┼┴▒┌␋␍ ␌└└▒┼␍ \2d-ɸjrR*֬&^_'Ƶ褚N2HhIu                                               
                                              S3                                             
invalid command \VI                                                                          
invalid command \}Jݐ                                                                         
invalid command \BQNr|΅tU~#_k#D,WHfqtC                                                       
invalid command \syJx%                                                                    
invalid command \Eq                                                                         
invalid command \-KmJ                                                                        
invalid command \                                                                            
invalid command \/ly=}E~ԚYj>nO                                                               
invalid command \SM!{Co~UH^x)*O}9vUǙk}LQ                                                   
invalid command \eH<=gTRPR1}{~/t!wiwhӒCґJmCĥ=;O^p*-                                   
invalid command \gq{cr}N;.                                                                  
invalid command \2p3a-.C:m_Y@c<4/mvΩߵj]SޙU"O}$[                                         
invalid command \)                                                                           
invalid command \                                                                            
invalid command \VOtDIM2+͆Yq4R                                                           
invalid command \WHElnHBDm%?PBFrOڙ}d"                                                        
invalid command \PjsחPmqJ[B@$Wt*!&|Zz))Q6AJY%!/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                                      
├±␊@├␊├°┤└↑▒:·$                                                                    

포럼에서 검색해 보았지만 이 문제에 대한 내용은 찾지 못했습니다.

도움을 부탁드립니다. 미리 감사드립니다.

P.S. 제 영어가 좋지 않아 포럼에서 적절한 단어를 사용하여 검색하지 못했거나, 이 게시물 초반에 인용된 튜토리얼을 오해하고 있을 수 있습니다.

아마도 psql이 현재 시스템 사용자(root)를 사용하려고 하고 있지만, 이 사용자는 Postgres에 존재하지 않기 때문일 것입니다. psql을 실행할 때 사용자를 지정해야 할 수 있습니다: psql -U postgres

그리고 다음 단계를 확인해 보세요:

답변해 주셔서 감사합니다. 오늘 밤 시도해 보고 알려드리겠습니다.

다시 인사드립니다.

도움을 주셔서 감사드립니다. 제 답변은 다소 길지만, 수행한 단계를 자세히 설명하고 있습니다.

Ben, 지난 메시지 이후 여러 번 시도해 보았지만, gunzip < blabla 명령을 실행할 때 항상 인증 오류가 발생합니다.

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"

수행한 단계를 공유합니다:

  • 공식 최신 설치 환경에서 시작했습니다.

  • 두 개의 백업 모두 최신 버전의 Discourse로 생성되었습니다.

  • “forumDest” 백업을 가져와 복원했습니다.

  • “ForumOther” 백업을 /var/discourse/shared/standalone/backups/default 디렉토리에 업로드했습니다.

  • SSH로 접속했습니다.

  • cd /var/discourse 명령으로 해당 디렉토리로 이동했습니다.

  • ./launcher enter app 명령으로 컨테이너에 진입했습니다.

  • /var/discourse/shared/standalone/backups/default에 있는 “ForumOther.tar.gz” 아카이브를 압축 해제했습니다.

  • 비밀번호를 재설정했습니다.

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

여기는 ls 명령의 결과입니다. forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz는 ForumOther이고, home-assistant-communaute-francophone-2022-04-24-111032-v20220304162250.tar.gz는 ForumDest입니다.

다음 명령을 사용하여 postgres 비밀번호를 재설정했습니다:

sudo -u postgres psql
\password postgres
(새 비밀번호 입력)
\q

그 결과는 다음과 같습니다:

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
  • “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$
  • postgres@testforum-app:/var/www/discourse/public/backups/default$ gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz | psql -d copyme
    또는 언급된 대로 gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz | psql -U postgres -d copyme 명령을 실행했습니다.

프로세스의 시작 부분은 보이지 않지만, 마지막에는 항상 다음과 같은 오류가 표시됩니다.

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$

즉, 인코딩에 문제가 있는 것 같습니다.

시도해 본 것:
명령을 분리하여 실행:

  • ForumOther 백업 압축 해제 gunzip < forum-francophone-home-assistant-2022-04-24-120337-v20220407195246.tar.gz (이해할 수 없는 문자열이 추출되는 것으로 보입니다)
  • 데이터베이스 접속 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=# 

하지만 “copyme” 데이터베이스에 접속한 후에는 무엇을 해야 할지 모르겠습니다.

IMPORT 명령에 대해 다음을 확인해 보았지만, 결과는 동일합니다. 어디서 실행해야 하나요? 어떻게 해야 하나요? 어떤 사용자로 실행해야 하나요?

단계별로 시도해 보겠습니다.

성공한다면, 기존 튜토리얼보다 조금 더 자세히 (튜토리얼은 주요 원리를 설명하고 존재한다는 장점이 있습니다) 제 절차를 더 정확하게 정리하여 공유하겠습니다.

다시 한번 시간과 도움을 주셔서 감사합니다.

모두에게 인사드립니다.

제 문제에 대해 좋은 진전을 이루었습니다.

이제 임포트 스크립트가 실행되기 직전에 막혀 있습니다.

bundle install을 실행한 후 IMPORT=1 bundle install을 실행하면 이 시점에서 다음과 같은 오류가 발생합니다.

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

여전히 전체 명령어 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를 실행합니다.

이번에는 다음과 같은 오류가 나요.

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

혹시 아이디어가 있으신가요?
감사합니다

안녕하세요,

두 포럼을 통합하려는 목표에서 한 걸음 더 나아가게 되었습니다.

의존성 문제는 더 이상 없는데, 스크립트를 실행할 때 권한 문제(right problem)가 발생하는 것 같습니다.

공식 설치된 Discourse에서 로컬 데이터베이스를 사용하여 스크립트를 실행하고 있습니다.

실행한 스크립트 명령과 반환 결과입니다:

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=                                                             

감사합니다

실행한 명령어들(다른 분들에게 도움이 될 수 있을 것 같습니다)도 첨부합니다.

other.forum.backup을 /var/discourse/shared/standalone/backups/default에 업로드하고 tar xvzf other.forum.backup.tar.gz를 실행하여 압축을 풉니다.

cd `/var/discourse
./launcher 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

의존성(nano, sqlite3, mysql2) 설치
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

Tiny_tds 설치
Tiny_tds를 설치하려면 FreeTDS가 필요합니다.

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

tiny_tds용

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

스크립트 실행

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

이 작업을 수행한 시점의 타이밍이 불운했던 것 같습니다. 11일 전에 Discourse를 Rails 7로 업그레이드하는 커밋이 있었습니다. 가져오기 스크립트에는 Rails 7.0.0rc1에서 제거된 ActiveRecord::Base.connection_config 메서드가 사용되고 있습니다.

@loic 업그레이드 시 가져오기 스크립트가 놓쳤을 가능성이 있어 보입니다.

이 답변 감사합니다.

정말 좋은 소식이에요. 어디서 온 건지 전혀 몰랐거든요.

업데이트를 기다리겠습니다. 혹시 제가 직접 머지 스크립트를 업데이트할 수 있나요?

감사합니다.

방금 PR을 열었습니다. 곧 병합될 것 같습니다 :slight_smile:

안녕하세요,

후속 조치와 빠른 대응에 대해 진심으로 감사드립니다.

두 개의 포럼을 마이그레이션하는 과정은 함정이 많은 긴 여정이라, 다시 문제가 발생했습니다.
방금 discourse_merge.rb 파일에 수정을 적용한 후 명령을 다시 실행했습니다.

현재 기존 HASH와 관련하여 문제가 발생했습니다.

이것이 중복 문제라는 것은 이해하지만, 어떤 성질의 중복인가요?

시도해 보기 위해 이름 변경을 시도한 후 중복 사용자를 삭제했지만, 지금은 이 토큰 문제입니다(사용자 레벨의 중복은 처리된다고 생각하는데요).

다시 한번 도움 주셔서 감사합니다.

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

안녕하세요.

여러 문제에도 불구하고 이 마이그레이션을 끝까지 마쳤습니다.

마지막 문제들은 두 포럼에서 서로 다른 기본 주소로 등록된 사용자들에서 발생했고, 한 포럼에서 테이블이 누락된 것도 원인이었습니다.

시간이 나면 전체 절차를 여기에 다시 정리해 올리겠습니다.

도움을 주신 @Constanza_Abarca님께 다시 한번 감사드립니다.

이는 두 인스턴스가 서로 다른 버전을 사용하거나, 설치된 플러그인이 서로 달랐다는 것을 의미합니까? 만약 제가 이런 방식으로 병합을 수행한다면, 그 전에 먼저 다음과 같은 사항을 확인해야 한다고 생각합니다:

  • 양쪽 모두에서 백업을 수행합니다.
  • 두 인스턴스가 동일한 버전의 Discourse를 실행 중인지 확인합니다.
  • 대상(Target)에 소스(Source)에 설치된 모든 플러그인이 설치되어 있는지 확인합니다.
  • (선택 사항?) 소스(Source)에 대상(Target)에 설치된 모든 플러그인이 설치되어 있는지 확인합니다.
  • 다시 한 번 백업을 수행합니다.

안녕하세요,

두 포럼은 동일한 버전을 사용하지만 플러그인은 다를 수 있습니다.

이것들은 제가 직접 수동으로 적용한 작은 수정 사항들입니다.

실제 병합 시에는 설치된 플러그인을 기준으로 시도해 보겠습니다.