面向自托管用户的 PostgreSQL 18 更新

你能提供更多细节吗?我也遇到了同样的问题

1 个赞

对于遇到相同问题的人,以下是我所做操作的摘要(由 AI 生成):
临时启动 PG15 → 导出数据库 → 使用 PG18 → 恢复导出的数据

1 个赞

所以,是的,这次升级是基于镜像的。

那么,即使你选择安装旧版本的 Discourse,镜像仍然会强制进行 18 版本的升级吗?

明白了。

1 个赞

我看到你已经修复了,但 ChatGPT 提供的方法虽然解决了错误,却清除了我的数据库,导致实际上没有账户、主题或帖子。

幸运的是,这是一个较新的开发论坛,所以损失不大。

2 个赞

我们非常谨慎,以确保今天不会发生这种情况。在每一步之后,系统都会告诉我这不会删除任何内容,而且我有种印象,我们在同意删除不再需要的内容之前,已经三次确认所有数据都已迁移。

但如果真的出了问题,我唯一会丢失的数据就是主题组件配置。

1 个赞

你好,我有一个数据库相当大的论坛(大约80 GB)。从13版升级到15版时,我更换了服务器,进行了新安装并恢复了数据。
你们也建议采用同样的升级方式吗?(我尝试过直接升级,但遇到了排序规则错误)

该主题前面有工作人员表示:

所以,是的,这是一个可行的选项。

你之前已经说过:

排序规则错误?现有的 Discourse 是什么版本?

也许可以发布你遇到的错误/控制台输出

但你没有空间不足(建议为现有数据库大小的 2 倍)?

你好,我有空间(250 GB 可用),错误是“排序规则不匹配”,但我猜我的 app.yml 文件中没有 UTF-8 字符串。

1 个赞

我们尽量在 discourse_docker 镜像中提供合理的默认设置,但不可能涵盖所有可能的使用场景。如果您愿意,可以随意自定义镜像以保留旧版本。

在某种程度上,依赖项的版本反映了我们的托管需求——我们在内部使用基础镜像。这意味着它不会过于陈旧,但也意味着我们只能维护有限数量的组合。

如果您更习惯这种方式,这完全是一种有效的方法。

如果在准备转储旧数据库时生成此警告,则无需担心。我们仅为了运行 pg_dump 而针对旧数据目录启动服务器。当转储恢复到新服务器时,索引会重新创建。

您看到此警告的原因是,在过去几天里,我们发布了一个新版本的基础镜像,将 Debian 从 Bookworm 升级到 Trixie,从而更改了 glibc 版本。基于 libc 提供程序(您可能正在使用)的区域设置在 glibc 升级过程中并不稳定,因此当升级脚本启动 Postgres 服务器以转储您的旧数据时,会显示排序规则不匹配警告。

排序规则不匹配正是我们选择进行转储和恢复而不是运行 pg_upgrade 的全部原因。一旦您的数据库使用带有 builtin 提供程序的 C.UTF-8,glibc 的升级将不再影响排序规则。

2 个赞

我今晚进行了升级,一切按计划进行。我收到了相同的数据库排序规则警告,但听起来我们应该忽略它们。谢谢。

2 个赞

我尝试在 app.yml 中配置以下内容:

app.yml
templates:

  • “templates/postgres.15.template.yml”
  • “templates/redis.template.yml”
  • “templates/web.template.yml”
  • “templates/web.ratelimited.template.yml”

以推迟升级,但我遇到了以下错误:

Errno::ENOENT: No such file or directory @ rb_sysopen - /etc/postgresql/15/main/postgresql.conf
Location of failure: /usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups/replace_command.rb:11:in ‘IO.read’
replace failed with the params {“filename” => “/etc/postgresql/15/main/postgresql.conf”, “from” => “data_directory = ‘/var/lib/postgresql/15/main’”, “to” => “data_directory = ‘/shared/postgres_data’”}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.

我觉得可能是基础容器用错了。你运行过 ./launcher rebuild 吗?这个命令应该会执行 git pull,但你可以试试手动运行 git pull,看看情况会不会有变化。

1 个赞

同样的错误

摘要: sha256:837e8ed4b5916baa36856b842ad84fe262b6b1b5550701f8844b13cc7acad7a5
状态: 已下载 discourse/base:2.0.20260812-0036 的新镜像
docker.io/discourse/base:2.0.20260812-0036
正在确保 launcher 为最新版本
Launcher 已是最新版本
正在停止旧容器

  • /usr/bin/docker stop -t 600 app
    app
    2.0.20260812-0036: 从 discourse/base 拉取
    摘要: sha256:837e8ed4b5916baa36856b842ad84fe262b6b1b5550701f8844b13cc7acad7a5
    状态: discourse/base:2.0.20260812-0036 镜像已是最新
    docker.io/discourse/base:2.0.20260812-0036
    /usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups.rb
    /usr/local/bin/pups --stdin
    I, [2026-08-25T06:22:16.249062 #1] INFO – : 正在从标准输入读取
    I, [2026-08-25T06:22:16.274434 #1] INFO – : 文件 > /etc/service/postgres/run chmod: +x chown:
    I, [2026-08-25T06:22:16.281650 #1] INFO – : 文件 > /etc/service/postgres/log/run chmod: +x chown:
    I, [2026-08-25T06:22:16.287846 #1] INFO – : 文件 > /etc/runit/3.d/99-postgres chmod: +x chown:
    I, [2026-08-25T06:22:16.293208 #1] INFO – : 文件 > /root/install_postgres chmod: +x chown:
    I, [2026-08-25T06:22:16.299851 #1] INFO – : 文件 > /root/upgrade_postgres chmod: +x chown:

失败 (FAILED)

Errno::ENOENT: 没有那个文件或目录 @ rb_sysopen - /etc/postgresql/15/main/postgresql.conf
失败位置: /usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups/replace_command.rb:11:in ‘IO.read’
替换失败,参数为 {“filename” => “/etc/postgresql/15/main/postgresql.conf”, “from” => “data_directory = ‘/var/lib/postgresql/15/main’”, “to” => “data_directory = ‘/shared/postgres_data’”}
引导 (bootstrap) 以退出代码 1 失败
** 引导失败 (FAILED TO BOOTSTRAP) ** 请向上滚动查找早期的错误消息,可能不止一个。
./discourse-doctor 可能有助于诊断问题。
2d15a756bfd82ed45debfbb4936784721293a3aeecabe8ba9b58c64d4bbe16e1

1 个赞

我认为我找到了原因。

当前的基础镜像安装了 PostgreSQL 18 服务器,但 postgres.15.template.yml 仍然假设 PostgreSQL 15 服务器软件包已经存在。因此,在 /etc/postgresql/15/main/postgresql.conf 文件存在之前,脚本就尝试访问它,从而产生了上述的 ENOENT 错误。

我提交了一个小的 PR,该 PR 让 PostgreSQL 15 的保留模板在配置 PostgreSQL 之前,先移除 PostgreSQL 18 服务器软件包并安装 PostgreSQL 15 服务器软件包:

这应该能恢复预期的路径,即通过将 postgres.template.yml 更改为 postgres.15.template.yml 来推迟 PostgreSQL 18 的升级。

4 个赞

更新已发布吗?
我什么时候可以重试?(仅供参考)

我已经合并了修复(感谢 @Ethsim2!),所以现在你可以再试一次了。

2 个赞

可以了,非常感谢!

2 个赞

那些在同一台服务器上运行多个容器的用户,升级顺利吗?如果这周末我有时间,我可能会升级我们的服务器——只是先在这里问问,看看我是不是现在先别急着升级。

是的,几周前我在一台服务器上对双容器进行了升级(在俄罗斯的一台服务器上也是)。完全没有问题,但请先确保你有足够的磁盘空间。

3 个赞

给那些在 Docker 之外执行 PostgreSQL 更新的人一个小技巧:你可以在 pg_upgrade 中使用 --link 参数,这样就不必复制数据,而是可以直接硬链接数据。这样可以节省磁盘空间。

2 个赞