skozz
(Raúl M.)
1
大家好,我在尝试了所有方法后仍然卡在升级上,所以在这里发帖求助。
- 我在几个月后更新论坛。像往常一样运行了备份并下载了它。
- 显然,在此更新过程中,有一个从 PG 13 到 15 的迁移。
一切运行正常,直到更新失败,由于磁盘空间不足而被中断。
- 我去了我的 Digitalocean droplet,停止了它,扩展了磁盘,然后再次启动它。
- 我运行了一些常规命令来释放磁盘空间(删除旧日志,./launcher cleanup 等)
所以我开始了重建,然后遇到了第一堵墙:
root@discourse-ubuntu-s-2vcpu-4gb-fra1-01:/var/discourse# ./launcher rebuild app
警告:Docker 版本 20.10.1 已弃用,建议升级到 24.0.7 或更高版本。
检测到 x86_64 架构。
警告:containers/app.yml 文件是全局可读的
skozz
(Raúl M.)
2
更新:
我还在尝试各种方法。目前,我只想回到支持PG13的版本,这样我就可以恢复我的备份,但我仍然无法做到。
升级之前的提交哈希是v3.3.0.beta6 +294,我正在尝试用YML重新构建它,但在构建时仍然显示以下内容:
root@discourse-ubuntu-s-2vcpu-4gb-fra1-01:/var/discourse# ./launcher rebuild app
警告:Docker版本20.10.1已弃用,建议升级到24.0.7或更高版本。
检测到x86_64架构。
警告:我们即将开始下载Discourse基础镜像
此过程可能需要几分钟到一小时不等,具体取决于您的网络速度
请耐心等待
2.0.20250226-0128: Pulling from discourse/base
af302e5c37e9: Pull complete
ed49ab5c933d: Pull complete
4d13d450f300: Pull complete
a67afd5cca97: Pull complete
d22a5b6769a6: Pull complete
83c133b53b22: Pull complete
fec147508f0c: Pull complete
21850d8b3ba1: Pull complete
02e250b6bcc4: Pull complete
71ba5ea7da00: Pull complete
ddcfbf6d2647: Pull complete
9c3e54d34536: Pull complete
29ce98d2d62d: Pull complete
4c9694455fd5: Pull complete
58a8ebcc6563: Pull complete
9c8966f1f999: Pull complete
b3dde96c4217: Pull complete
f934de9e2e8d: Pull complete
834e25f513a1: Pull complete
85d3cf606a95: Pull complete
94331a6982ee: Pull complete
14936beb0e9f: Pull complete
3ef05b122d47: Pull complete
6c2dff13a1e7: Pull complete
7682543ad38b: Pull complete
f16f8d5c5a04: Pull complete
06d7037d56ef: Pull complete
bc6c17ae1969: Pull complete
d19f089ead0e: Pull complete
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Downloaded newer image for discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
警告:containers/app.yml文件是世界可读的。您可以通过运行以下命令来保护此文件:chmod o-rwx containers/app.yml
确保启动器是最新的
正在获取origin
启动器是最新的
2.0.20250226-0128: Pulling from discourse/base
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Image is up to date for discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-06-11T09:54:52.350929 #1] INFO -- : Reading from stdin
I, [2025-06-11T09:54:52.357807 #1] INFO -- : > DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector
E: 执行脚本 DPkg::Post-Invoke 'rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true' 时出现问题
E: 子进程返回错误代码
I, [2025-06-11T09:54:53.837808 #1] INFO -- : Reading package lists...
Building dependency tree...
Reading state information...
以下软件包是自动安装的,现在不再需要:
libcommon-sense-perl libio-pty-perl libipc-run-perl libjson-perl
libjson-xs-perl libllvm19 libtypes-serialiser-perl libz3-4
postgresql-client-common postgresql-common postgresql-common-dev ssl-cert
使用'apt autoremove'来删除它们。
以下软件包将被删除:
postgresql-15* postgresql-15-pgvector* postgresql-client-15*
升级了0个,新安装了0个,要删除3个,未升级0个。
在此操作之后,将释放60.9 MB的磁盘空间。
(正在读取数据库 ... 当前安装了33951个文件和目录。)
正在删除 postgresql-15-pgvector (0.8.0-1.pgdg120+1) ...
正在删除 postgresql-15 (15.12-1.pgdg120+1) ...
invoke-rc.d: 无法确定当前运行级别
update-alternatives: 警告:强制重新安装备用文件/usr/share/postgresql/15/man/man1/psql.1.gz,因为链接组psql.1.gz已损坏
正在删除 postgresql-client-15 (15.12-1.pgdg120+1) ...
正在处理 postgresql-common (274.pgdg120+1) 的触发器 ...
正在从已安装的myspell/hunspell软件包构建PostgreSQL字典...
正在删除过时的字典文件:
(正在读取数据库 ... 当前安装了31913个文件和目录。)
正在清除 postgresql-15 (15.12-1.pgdg120+1) 的配置文件 ...
正在删除集群main...
失败
--------------------
Pups::ExecError: DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector failed with return # ocess::Status: pid 7 exit 100
失败位置: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
执行失败,参数为 "DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector"
引导失败,退出代码为 100
** 引导失败 ** 请向上滚动并查找更早的错误消息,可能不止一个。
./discourse-doctor 可能会帮助诊断问题。
a609309cf458b146e5650d21103bf084e9bf66843e46e627827f50b6f8c03376
pfaffman
(Jay Pfaffman)
3
如果你像你说的那样做了备份,最简单的方法是启动一个新的 droplet,然后按照 将 Discourse 站点迁移到另一台 VPS (使用 rsync) 的步骤操作(但不要复制数据库文件),然后恢复你的备份。
3 个赞
skozz
(Raúl M.)
4
你好
嗨 Jay!非常感谢你的回复。我刚开始着手进行,实例目前正在设置中。
快速提问:在开始更新之前,我下载了备份文件,这是文件:forumname-2025-06-11-060249-v20240807024301.tar.gz (4,6GB compressed) 论坛版本是 v3.3.0.beta6 +294 with PG13。
我计划在 app.yml 中强制指定这个版本来初始化新的实例,例如:
## 这是全合一、独立的 Discourse Docker 容器模板
##
## 修改此文件后,您必须重建
## /var/discourse/launcher rebuild app
##
## 编辑时请务必*非常*小心!
## YAML 文件对空格或对齐错误非常非常敏感!
## 如有需要,请访问 http://www.yamllint.com/ 进行验证
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## 如果您想添加 Let's Encrypt (https),请取消注释这两行
- "templates/web.ssl.template.yml"
- "templates/web.letsencrypt.ssl.template.yml"
## 此容器应暴露哪些 TCP/IP 端口?
## 如果您希望 Discourse 与 Apache 或 nginx 等其他 Web 服务器共享端口,
## 请参阅 https://meta.discourse.org/t/17247 获取详细信息
expose:
- "80:80" # http
- "443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## 将 db_shared_buffers 设置为总内存的最多 25%。
## 将由 bootstrap 根据检测到的 RAM 自动设置,或者您可以覆盖它
db_shared_buffers: "1024MB"
## 可以提高排序性能,但会增加每个连接的内存使用量
#db_work_mem: "40MB"
## 此容器应使用哪个 Git 版本? (默认值: tests-passed)
version: v3.3.0.beta6
然后,在新论坛运行后,从那里导入备份。
这有意义吗? 或者我遗漏了什么重要的参数或步骤?
1 个赞
skozz
(Raúl M.)
6
再次感谢 Jay 的回复。我非常感谢您花时间帮助我度过这个噩梦。
我正在尝试通过那种方式(在 YML 中强制指定版本),但显然 discourse_docker (目前)还不支持这个更改:
FAILED
--------------------
Pups::ExecError: grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'Nginx 的 \"before-server\" outlet 丢失。此版本的 discourse_docker 与所选的 Discourse 版本不兼容。' ; exit 1 ) failed with return #<Process::Status: pid 2788 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in spawn'
exec failed with the params {"cmd"=>["cp $home/config/nginx.sample.conf /etc/nginx/conf.d/discourse.conf", "rm /etc/nginx/sites-enabled/default", "mkdir -p /var/nginx/cache", "grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'Nginx 的 \\\"before-server\\\" outlet 丢失。此版本的 discourse_docker 与所选的 Discourse 版本不兼容。' ; exit 1 )", "grep -q 'outlets/server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'Nginx 的 \\\"server\\\" outlet 丢失。此版本的 discourse_docker 与所选的 Discourse 版本不兼容。' ; exit 1 )", "grep -q 'outlets/discourse' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'Nginx 的 \\\"discourse\\\" outlet 丢失。此版本的 discourse_docker 与所选的 Discourse 版本不兼容。' ; exit 1 )", "mkdir -p /etc/nginx/conf.d/outlets/before-server", "touch /etc/nginx/conf.d/outlets/before-server/20-redirect-http-to-https.conf", "touch /etc/nginx/conf.d/outlets/before-server/30-ratelimited.conf", "mkdir -p /etc/nginx/conf.d/outlets/server", "touch /etc/nginx/conf.d/outlets/server/10-http.conf", "touch /etc/nginx/conf.d/outlets/server/20-https.conf", "touch /etc/nginx/conf.d/outlets/server/30-offline-page.conf", "mkdir -p /etc/nginx/conf.d/outlets/discourse", "touch /etc/nginx/conf.d/outlets/discourse/20-https.conf", "touch /etc/nginx/conf.d/outlets/discourse/30-ratelimited.conf"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** 请向上滚动查找更早的错误消息,可能不止一个。
./discourse-doctor 可能会帮助诊断问题。
d511b0ec31ac912c99c682611c35bbb446dde1488e1762aa07ccd24690c63164
2/2
更新前我截了当前版本的截图,以防万一,有没有办法强制 discourse_docker 使用兼容的旧版本?
我尝试在 Google 和 Meta 上搜索,但还没有找到如何做的方法。
skozz
(Raúl M.)
8
明白了,我现在就试试。
不过,有个快速问题:如果备份来自我之前使用的旧版本 Discourse(使用 PG13),在将备份导入到使用 PG15 的最新版本 Discourse 时,我会遇到问题吗?
1 个赞
skozz
(Raúl M.)
10
抱歉 @pfaffman,我之前写了一条消息,以为问题已经解决了,但后来情节发生了变化。
经过长时间的导入后,我看到论坛又上线了,列出了所有的帖子等等。
在终端中,日志是:
[...]
-- execute("DELETE FROM site_settings WHERE name='warn_reviving_old_topic_age'")
-\"> 0.0002s
== 20250609115711 RemoveComposerTipsSiteSettings: migrated (0.0012s) ==========
正在重新连接数据库...
正在重新加载站点设置...
正在为非工作人员禁用发送邮件...
正在禁用只读模式...
正在清除分类缓存...
正在重新加载翻译...
正在重新映射上传...
正在恢复上传,这可能需要一段时间...
正在将上传迁移到'默认'的 S3...
正在将文件上传到 S3...
- 正在列出本地文件
=> 5 个文件
- 正在列出 S3 文件
............................................................................................................................................................................ => 171490 个文件
- 正在将文件同步到 S3
.....
正在更新数据库中的 URL...
我在那里待了一段时间,我以为只是我的终端连接问题。然而,几分钟后,它继续以失败告终:
490 个文件
- 正在将文件同步到 S3
.....
正在更新数据库中的 URL...
正在删除旧的优化图像...
正在标记所有包含灯箱的帖子以进行重新烘焙...
76198 个帖子被标记为重新烘焙
EXCEPTION: 903 个帖子未重新映射到新的 S3 上传 URL。S3 迁移对于数据库 'default' 失败。
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:81:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:383:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/file_store/s3_store.rb:354:in `copy_from'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:69:in `restore_uploads'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:49:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:167:in `restore_uploads'
/var/www/discourse/lib/backup_restore/restorer.rb:71:in `run'
script/discourse:191:in `restore'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/command.rb:28:in `run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor.rb:538:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/base.rb:584:in `start'
script/discourse:345:in `
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `kernel_load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:452:in `exec'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor.rb:538:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:35:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:29:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:28:in `block in
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:20:in `
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `'
正在尝试回滚...
正在回滚...
正在清理...
正在从 discourse_functions 模式中删除函数...
正在删除 tmp '/var/www/discourse/tmp/restores/default/2025-06-11-121115' 目录...
正在取消暂停 sidekiq...
正在将恢复标记为已完成...
正在通知“系统”恢复结束...
已完成!
[失败]
恢复完成。
```突然,那个“恢复”上线的论坛里,所有的帖子都消失了,只剩下几个话题还活着。
由于日志显示“76198个帖子被标记为重新烘焙(rebake)”,我以为只是现在它们必须被重新烘焙,所以我去了Sidekiq,但没有任何待处理的内容 :(


skozz
(Raúl M.)
11
更新:
登录到 rails 控制台,显然只有 10 篇帖子,而不是所有要导入的帖子 
/var/www/discourse# rails c
正在加载生产环境(Rails 7.2.2.1)
discourse(prod)> Post.count
=> 10
discourse(prod)> Post.where("baked_version IS NULL").count
=> 0
1 个赞
pfaffman
(Jay Pfaffman)
12
叹气。您使用的是相同的hostname吗?(也许吧?)
这就是您现在的问题。
您是在数据库中还是在yml文件中配置的S3?我猜是前者。最简单的方法是只恢复数据库,但这很难解释(提取sql文件,然后将其命名为与tar.gz文件相同的东西)。
您可以尝试这个
discourse restore --pause <backup_filename>
这将在尝试恢复S3内容之前暂停。然后,如果您知道该怎么做,就可以解决错误上传的问题。
请参阅 Issues with restoring backup to discourse - #16 by gerhard
另一种方法是在您的 app.yml 中将 DISCOURSE_USE_S3 设置为 false。您可能还需要设置其他S3内容,例如那些指示使用S3上传和/或S3存储桶的设置。
1 个赞
skozz
(Raúl M.)
13
是的,但既然您提到了。
- 论坛现在已经有10年了。
- 我以前设置过S3,但后来移除了,所以那些带有S3图片的帖子已经很旧了。
有没有办法识别它们并忽略/删除它们,以便导入能够顺利进行?
另一个办法是在您的 app.yml 中将 DISCOURSE_USE_S3 设置为 false。您可能还需要设置其他 S3 相关的内容,比如那些指示使用 S3 上传和/或 S3 存储桶的设置。
我也会尝试这个,因为最终我们不关心那些 S3 文件或帖子,只是我还不清楚如何处理以忽略它们。
pfaffman
(Jay Pfaffman)
14
如果你真的不在乎它们,你可以使用暂停功能,当它暂停时,打开另一个终端,进入rails并执行如下操作:
bad=Upload.where("url like '%the-s3-url%'")
bad.destroy_all
pfaffman
(Jay Pfaffman)
15
顺便说一句,如果你仍然陷入困境,感到绝望并且有预算,你可以通过电子邮件或私信联系我,或者在#marketplace中提问。
1 个赞
skozz
(Raúl M.)
16
你一开始就该告诉我!我一开始就很乐意付费!呵呵
它现在已经启动并运行了。
在尝试了无数种方法后,我最终做了一些违反直觉但现在有效的事情:
- 在新实例中正确设置 S3(通过管理面板)
- 使用–pause thing 运行导入,但在第二步,只是停止了该过程。我期望论坛无法运行或图像出现问题,但它正在运行并且旧图像正在加载而没有问题。
我仍在测试各种东西,也许稍后会发现一些损坏的东西,但现在,经过 12 小时的故障排除,我暂时将其视为一次胜利。
2 个赞
pfaffman
(Jay Pfaffman)
17
那不是正确的。请参阅为上传配置 S3 兼容对象存储提供商。您需要将所有这些设置放在您的 yml 文件中。
1 个赞