Проблема с объединением двух форумов

Здравствуйте,

Я объединяю два форума, следуя руководству, которое можно найти здесь.

Я застрял на команде gunzip < /path/to/data/other-2018-08-02-134227-v2018xxx.tar.gz | psql -d copyme. Она выдает множество строк с ошибками импорта в виде непонятных символов.

Вот выполненные мной шаги:

  • Установка Discourse официальным способом на VPS.
  • Импорт через GUI резервной копии для объединения (forumother).
  • Создание резервной копии последнего (чтобы иметь резервную копию с последней версией 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.

Я понимаю, что это проблема подключения, но не вижу, как её решить.

Я попробовал войти как пользователь postgres: su - 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+͆Yq4ŠR                                                           
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

Затем проверьте этот шаг:

Спасибо за ответ, я попробую сегодня вечером и сообщу вам.

Снова здравствуйте,

Позвольте начать с благодарности за вашу помощь. Мой ответ немного длинный, но он подробно описывает предпринятые шаги.

После нескольких попыток с момента последнего сообщения у меня по-прежнему не получается выполнить команду 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.

  • Распаковал архив «ForumOther.tar.gz», расположенный в /var/discourse/shared/standalone/backups/default.

  • Сбросил пароль.

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» я не понимаю, что делать дальше.

Я изучил команды для ИМПОРТА, но и здесь непонятно: где их выполнять? Как именно? От имени какого пользователя?

Давайте попробуем шаг за шагом.

Если у меня получится, я более точно опишу свою процедуру, добавив больше деталей по сравнению с оригинальным руководством (которое, безусловно, хорошо объясняет основные принципы и просто существует).

Еще раз спасибо за ваше время и помощь.

Привет всем,

Я добился хорошего прогресса в решении своей проблемы.

Теперь я застрял непосредственно перед выполнением скрипта импорта.

Я запускаю bundle install, а затем IMPORT=1 bundle install, и на этом этапе получаю эту ошибку:

Произошла ошибка при установке tiny_tds(2.1.5), и Bundler не может продолжить работу

Затем я запускаю полную команду:
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

На этот раз возникает следующая ошибка:

Источник git https://github.com/nlalonde/ruby-bbcode-to-md еще не проверен.
Пожалуйста, выполните `bundle install` перед запуском вашего приложения.

Есть ли у вас какие-либо идеи?
Спасибо

Здравствуйте,

Ещё один шаг вперёд в рамках задачи по объединению двух форумов.

У меня больше нет проблем с зависимостями, но при запуске скрипта возникает проблема с правами.

Я запускаю скрипт с локальной базой данных на официальной установке 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
./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

Установите зависимости: nano, sqlite3 и mysql2.
От имени пользователя root:

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

Преобразование BBCode в Markdown на Ruby

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. Скрипты импорта используют метод ActiveRecord::Base.connection_config, который был удалён в версии Rails 7.0.0rc1.

@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
Загрузка приложения...
Запуск...
Предзагрузка I18n...
Исправление номеров самых высоких постов...
Загрузка импортированных ID групп...
Загрузка импортированных ID пользователей...
Загрузка импортированных ID категорий...
Загрузка импортированных ID тем...
Загрузка импортированных ID постов...
Загрузка индексов групп...
Загрузка индексов пользователей...
Загрузка индексов категорий...
Загрузка индексов тем...
Загрузка индексов постов...
Загрузка индексов действий с постами...

Объединение пользователей...
Копирование 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
  • Убедился, что на целевом экземпляре установлены все плагины, которые есть на исходном
  • (Опционально?) Убедился, что на исходном экземпляре установлены все плагины, которые есть на целевом
  • Снова сделал резервные копии

Здравствуйте,

Оба форума работают на одной версии, но, возможно, установлены разные плагины.

Это лишь небольшие изменения, которые я внес вручную.

Для настоящего объединения я попробую использовать установленные плагины, чтобы проверить.