Проблема PG::ConnectionBad при слиянии двух форумов, несмотря на несколько предыдущих успешных попыток

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

После успешного слияния двух форумов на тестовом сервере в апреле мы решили окончательно объединить их.

Следуя процедуре, которую я использовал тогда, я столкнулся с ошибкой подключения к PostgreSQL при запуске скрипта слияния.

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

Заранее спасибо.

Вот текст ошибки:

discourse@serveur-app:/var/www/discourse$ IMPORT=1 DB_NAME=copyme DB_PASS=passwdDB SOURCE_BASE_URL=http://old.forum.fr UPLOADS_PATH=/var/www/discourse/public/uploads/default bundle exec ruby script/bulk_import/discourse_merger.rb
Loading application...
Traceback (most recent call last):
	5: from script/bulk_import/discourse_merger.rb:817:in `<main>'
	4: from script/bulk_import/discourse_merger.rb:817:in `new'
	3: from script/bulk_import/discourse_merger.rb:22:in `initialize'
	2: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.2/lib/pg.rb:69:in `connect'
	1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.2/lib/pg/connection.rb:661:in `new'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/pg-1.4.2/lib/pg/connection.rb:708:in `connect_to_hosts': could not match 0 port numbers to 1 hosts (PG::ConnectionBad)


Я воспользуюсь случаем, чтобы привести полную процедуру слияния.

Эта процедура основана на оригинальном посте и проблемах, возникших во время моих тестов

Эта процедура работала в апреле (см. эту тему).

  • Начните с обновленных резервных копий обоих форумов,
  • Установите Discourse,
  • Импортируйте обе резервные копии,
  • Восстановите форум, который нужно сохранить.

В SSH:

  • Перейдите в папку /var/discourse
  • Войдите в приложение: ./launcher enter app.

Создание базы данных.

su postgres
psql
CREATE DATABASE copyme ENCODING='utf8';

Смена пароля пользователя postgres

\postgres password

Выход из psql:

\q

Выход из пользователя postgres

exit

Переключение на пользователя discourse

su discourse

Распаковка резервной копии старого форума
Перейдите в папку: cd public/backups/default
Распакуйте резервную копию старого форума командой: tar xvzf old.forum.tar.gz

Копирование из БД.old в БД copyme.

gunzip < dump.sql.gz | psql -d copyme

Выход из пользователя discourse

exit

Зависимости

Зависимости: nano, sqlite3 и mysql2
(от имени root в /var/www/discourse)

apt update && apt upgrade -y
apt-get install -y nano sqlite3 libsqlite3-dev mariadb-server libmariadb-dev -y
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
cd ./..

Установка Tiny_tds
Сначала необходимо установить FreeTDS, затем Tiny_tds.
Для FreeTDS:

wget http://www.freetds.org/files/stable/freetds-1.3.12.tar.gz
tar -xzf freetds-1.3.12.tar.gz
cd freetds-1.3.12
./configure --prefix=/usr/local --with-tdsver=7.3
make
make install

Для Tiny_tds:

gem install tiny_tds
gem install ruby-bbcode-to-md
cd ./..

Скрипт

su discourse
bundle config unset deployment
IMPORT=1 bundle install
IMPORT=1 DB_NAME=copyme DB_PASS=passwdDB SOURCE_BASE_URL=http://old.forum.fr UPLOADS_PATH=/var/www/discourse/public/uploads/default bundle exec ruby script/bulk_import/discourse_merger.rb

Переведено с помощью www.DeepL.com/Translator (бесплатная версия)

Привет,

Postgres действительно использует порт 5432 (проверьте через \conninfo в командной строке psql), но, боюсь, в файле connection.rb указан порт 5433.

Пароль верный — проверено командой psql postgres://postgres:password@127.0.0.1:5432.

Может ли кто-нибудь подтвердить, что с портом всё в порядке?

Заранее спасибо

У меня возникла та же ошибка. Похоже, что порт не загружается в конфигурацию БД здесь: discourse/script/bulk_import/discourse_merger.rb at main · discourse/discourse · GitHub

Если запустить это из консоли Rails:

[1] pry(main)> ActiveRecord::Base.connection_db_config.configuration_hash
=> {:prepared_statements=>false,
 :adapter=>"postgresql",
 :database=>"discourse_development",
 :min_messages=>"warning",
 :pool=>5,
 :timeout=>5000,
 :checkout_timeout=>5,
 :advisory_locks=>false,
 :host_names=>["localhost"],
 :variables=>{}}

Порта нет в конфигурации, но код предполагает, что он есть: discourse/script/bulk_import/discourse_merger.rb at main · discourse/discourse · GitHub

Хотя это исправлено в ядре, вы можете указать порт вручную. Вместо:

 @raw_connection = PG.connect(dbname: local_db[:database], host: 'localhost', port: local_db[:port], user: 'postgres', password: db_password)

используйте:

@raw_connection = PG.connect(dbname: local_db[:database], host: 'localhost', port: 5432, user: 'postgres', password: db_password)

Спасибо, спасибо, спасибо!

Я пробовал с портом = 5432, но не с портом = 5432.

Иногда, когда мы слишком сильно углубляемся в детали, упускаем очевидные вещи.

Спасибо ещё раз.

Спасибо @McFly за составление полного руководства. Это очень полезно. Можно ли автоматизировать все эти шаги? И создать для этого cron-задачу?

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

Поскольку обычно это не тот случай, когда требуется повторение, я не знаю, будет ли это полезно.