在使用 Docker 本地运行 Discourse 时,Postgres 似乎没有在运行

为了我的公司,我需要针对 Discourse 实例的 REST API 开发一些功能。对于本地开发和测试,我一直在成功地遵循 Install Discourse for development using Docker

我已经几周没有进行开发了。昨天我想再次在本地启动 Discourse,所以我执行了我平常的 git pull && d/boot_dev && d/bundle install && d/rails s 命令。然而,最后一个命令 d/rails s 因以下错误而失败:

URGENT: Failed to initialize site default: ActiveRecord::ConnectionNotEstablished connection to server on socket \"/var/run/postgresql/.s.PGSQL.5432\" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?

/home/discourse/.bundle/gems/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:69:in `rescue in new_client'
[...]\

当我进入 discourse_dev 容器并执行 ls -la /var/run/postgresql/ 时,我可以看到这里确实没有 .s.PGSQL.5432 套接字。

好的,所以我想也许我不应该盲目地先执行 git pull,所以我签出了 tag v4.4.0 甚至 tag v3.3.0 并再次尝试。但我遇到了完全相同的错误。

在我看来,Postgres 数据库似乎没有在 discourse_dev 容器中运行?

奇怪的是:如果我将 discourse 仓库 克隆到一个新文件夹中(是的,即使是 main 分支中的最新代码),并使用 Docker 启动 Discourse,我不会遇到此错误,并且 Discourse 会成功启动。
但当然,我的数据库是空的,这有点不幸。我明白数据会持久化在 tmp/postgres 中,我可以从旧文件夹复制到新文件夹。但昨天我不知道这一点,并且在我昨天的故障排除尝试中,我删除了所有临时文件夹以及 node_modules.pnpm-store 文件夹等等。但问题仍然存在。

有人知道这里发生了什么或者我该如何解决这个问题吗?

我的本地数据似乎完全损坏,导致 PostgreSQL 无法启动。

当我 sudo cp -pr discourse/data/postgres discourse2/data/postgres 时,从 discourse2 文件夹启动 Discourse 会出现完全相同的问题。反之,当我删除 discourse/data/postgres 时,我的原始 Discourse 实例可以正常启动,但当然没有数据 :frowning:

抱歉造成麻烦。这可能是由于最近的 PostgreSQL 15 update 引起的。旧的 PG 13 数据文件与现在运行 PG 15 的 discourse_dev 镜像不兼容,但我们的自动化数据库更新过程并非为开发环境设计。

您是否有特别的原因想要保留旧的数据文件?

您可以在容器内运行 rake dev:populate 来生成一些测试数据。

1 个赞

请不要使用该指南。它需要更新或删除。

请使用这个:Developing Discourse using a Dev Container

2 个赞

哦,这太有道理了。非常感谢您的解释。今天才知道,盲目地在 main 分支上执行 git pull 是个坏主意,因为可能会无意中破坏太多东西 :slight_smile:

只是因为一些管理员设置,特别是关于 Discourse Connect 的。还有一些 REST API 设置、一些插件设置和一些特定的手动用户组。我们有一个特殊的 SSO 设置,它通过 REST API 管理类别和用户组(+组成员资格)。在开发过程中,我根本不在乎实际内容,比如帖子和回复,这就是为什么我认为 rake dev:populate 对我没有帮助。

这里没有恶意。

如果您的预演/生产站点已更新到 PG 15,您可以从中拉取备份。

或者,您可以尝试手动更新您的本地数据文件。这可能会有帮助:

cd discourse
mkdir data/postgres_new
docker run --rm \
	--entrypoint=/bin/bash \
	-v "$(pwd)/data/postgres":/var/lib/postgresql/13/data \
	-v "$(pwd)/data/postgres_new":/var/lib/postgresql/15/data \
	tianon/postgres-upgrade:13-to-15 \
	-c "apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
	docker-upgrade"
mv data/postgres data/postgres_old
mv data/postgres_new data/postgres
docker run --rm -v "$(pwd)/data/postgres":/postgres \
discourse/discourse_dev:release chown -R postgres:postgres /postgres

(如果您使用的是基于 ARM 的处理器,您将必须构建自己的镜像。)

1 个赞

非常感谢您富有建设性的回复!

这在我同事和我将本地 discourse 实例升级到 3.4.0 以上版本时会很有帮助。

不过,目前我已从一个全新的数据集开始,并重新应用了必要的配置。幸运的是,我们已经有一份内部指南,指导我们的开发同事如何开始 discourse 开发 :slight_smile:

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