将 postgres 数据库迁移到中央数据库服务器:构建错误

您好,

我目前正在从传统的两个容器设置(分离的 web_onlydata 容器)迁移到一个数据库托管在中央数据库服务器(不在 Docker 容器内)的设置。

中央数据库是从 dump.sql 创建的,该文件是备份文件的一部分。docker compose web_only.yaml 使用:

  ## 连接到中央 PostgreSQL 数据库
  DISCOURSE_DB_SOCKET: ''
  DISCOURSE_DB_USERNAME: discourse
  DIS="../../home/discourse/discourse/config/database.yml"
  DISCOURSE_DB_HOST: 10.10.10.xx
  DISCOURSE_DB_NAME: discourse

在构建 web_only 时,我收到以下错误:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 741 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.

使用这些数据可以访问数据库主机。有什么想法知道发生了什么吗?使用标准的数据库容器进行相同的构建可以成功完成。

您确定服务器可以访问远程数据库吗?看起来不行。您能从 Web 服务器机器 telnet 到数据库端口吗?

嗨 Jay,

我按照 Falco 在 Configure Discourse to use a separate PostgreSQL server 的帖子进行了操作。数据库服务器可以从 VM 访问:

root@docker2:/var/discourse# pg_isready -d discourse -h 10.10.10.18 -p 5432 -U discourse    
10.10.10.18:5432 - Verbindungen werden angenommen

(连接已接受)

web_only.yml 中的数据库名称、用户和密码也是正确的。构建错误是:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process:
:Status: pid 829 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migra
te'"]}
bootstrap failed with exit code 1

我不是 Ruby 专家,所以需要一些帮助来从这里出现的错误开始调试。

再见,Thommie

在这种情况下:

您有哪些插件?您有 AI 插件吗?

您正在运行哪个版本的 postgres?

  • PostgreSQL 13.12
  • 无 AI 插件
  • 插件:
cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-shared-edits.git
          - git clone https://github.com/discourse/discourse-chat-integration
          - git clone https://github.com/discourse/wp-discourse
          - git clone https://github.com/discourse/discourse-openid-connect
          - git clone https://github.com/discourse/discourse-calendar
          - git clone https://github.com/discourse/discourse-data-explorer
          - git clone https://github.com/paviliondev/discourse-events
          - git clone https://github.com/paviliondev/discourse-locations
          - git clone https://github.com/discourse/discourse-reactions
          - git clone https://github.com/discourse/discourse-chat
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/discourse-user-notes.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-footnote.git
          - git clone https://github.com/discourse/discourse-docs.git
          - git clone https://github.com/discourse/discourse-docs-card-filter.git
          - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/discourse/discourse-templates.git
          - git clone https://github.com/discourse/discourse-saved-searches.git
          - git clone https://github.com/discourse/discourse-tooltips
          - git clone https://github.com/nathan-nz/discourse-wikified-posts
          - git clone https://github.com/discourse/discourse-post-voting.git
          - git clone https://github.com/discourse/discourse-encrypt.git
          - git clone https://github.com/discourse/discourse-zoom.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-category-experts.git

\n\n可以\n[quote=“Thommie Rother, post:1, topic:284615, username:Thomas_Rother”]\n请向上滚动并查找更早的错误消息,可能不止一条。\n[/quote]\n\n吗?\n\n确切的错误消息将告诉我们问题所在 :smile:\n\n[quote=“Thommie Rother, post:1, topic:284615, username:Thomas_Rother”]\n我目前正在从传统的两个容器设置(分离的 web_only 和 data 容器)迁移到一个数据库托管在中央数据库服务器上(不在 docker 容器内)的设置。\n[/quote]\n\n您的计划是放弃数据容器吗?

1 个赞

错误代码:

> FAILED
> --------------------
> Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' 失败,返回 #<Process::Status: pid 816 exit 1>
> 失败位置:/usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
> exec 失败,参数为 {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
> bootstrap 失败,退出代码为 1

在新系统上,数据应尽可能来自中央数据库,而不是 Docker 数据库。

我想知道将其设置为空值而不是未设置是否会导致问题。

无论如何,请发布完整的输出。

1 个赞

./launcher rebuild web_only 的完整构建日志

web_only_build.zip (9.4 KB)

yaml 文件

web_only.zip (2.4 KB)

关于 DISCOURSE_DB_SOCKET:“”:由于我们使用远程连接,我猜套接字值在两种情况(dockerized 数据或远程数据)下都不相关

1 个赞

错误出现在更靠前的构建日志中:

…
docker_manager 已是最新兼容版本
wp-discourse 已是最新兼容版本

I, [2023-11-10T21:08:17.388213 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate'
插件名称为 'discourse-topic-voting',但插件目录名为 'discourse-voting'
rake 中止!
ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR:  permission denied for table users (ActiveRecord::StatementInvalid)

所以好消息是!它连接正常,只是数据库权限需要调整。

2 个赞

嗯,奇怪,discourse 数据库用户在中央 postgres 服务器上拥有

postgres=# GRANT ALL ON DATABASE discourse TO discourse;

我们还需要此角色做其他事情吗?

这不会影响现有表。

粗略地说,也许:

ALTER DATABASE "discourse" OWNER TO "discourse";

或者:

ALTER DEFAULT PRIVILEGES IN SCHEMA "public" GRANT ALL ON TABLES TO "discourse";

Postgres 日志也应该更详细地告诉您哪些操作失败了。

4 个赞

… 好的好的,看起来我在这里还有一些权限问题,请看 /var/log/postgresql/postgresql-13-main.log:

2023-11-10 22:07:58.371 UTC [196127] postgres@postgres STATEMENT:  ALTER DEFAULT PRIVILEGES IN SCHEMA 'public' GRANT ALL ON TABLES TO 'discourse';
2023-11-10 22:10:18.270 UTC [196160] discourse@discourse ERROR:  permission denied for table site_settings
2023-11-10 22:10:18.270 UTC [196160] discourse@discourse STATEMENT:  SELECT name, data_type, value FROM site_settings
2023-11-10 22:10:18.313 UTC [196160] discourse@discourse ERROR:  permission denied for table users
2023-11-10 22:10:18.313 UTC [196160] discourse@discourse STATEMENT:  SELECT COUNT(*) FROM (SELECT 1 AS one FROM "users" LIMIT 20) subquery_for_count

好的,一如既往,这是一个“第 8 层问题” :smiling_face_with_tear:
我已经在 postgres 中创建了一个 discourse 数据库,但 discourse 用户/角色在该数据库上没有所有必需的权限。而且我确实错过了一些 mariadb 和 postgres 之间主要的“行为”差异……

现在我重新创建了所有内容:用户、数据库、用户/角色的权限(包括 ALTER DEFAULT PRIVILEGES FOR ROLE discourse IN SCHEMA public GRANT ALL ON TABLES TO “discourse”; 以匹配该用户将来创建的表)

构建已完成,实例可以正常运行,使用远程 postgres 服务器,因此可以导入旧实例的备份。

4 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.