从 3.0.0.beta16 更新到 3.1.0.beta2

我尝试进行备份,但备份失败了。

我尝试进行升级。

起初,升级屏幕上的所有选项都处于禁用状态。我重启后,就可以选择 docker_manager 升级了。但它失败了,错误信息如下:

rake aborted!
NoMethodError: undefined method `path' for nil:NilClass

所以,我通过 SSH 连接到服务器,尝试重建,这是我得到的结果:

root@Discourse-1:/var/discourse# ./launcher rebuild app
x86_64 arch detected.
WARNING: containers/app.yml file is world-readable. You can secure this file by running: chmod o-rwx containers/app.yml
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
............
Downloading MaxMindDB...
Compressing Javascript and Generating Source Maps

I, [2023-03-10T03:08:58.958320 #1]  INFO -- : Terminating async processes
I, [2023-03-10T03:08:58.958649 #1]  INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main pid: 42
I, [2023-03-10T03:08:58.958745 #1]  INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 103
103:signal-handler (1678417738) Received SIGTERM scheduling shutdown...
2023-03-10 03:08:58.959 UTC [42] LOG:  received fast shutdown request
2023-03-10 03:08:58.966 UTC [42] LOG:  aborting any active transactions
2023-03-10 03:08:58.969 UTC [42] LOG:  background worker "logical replication launcher" (PID 51) exited with exit code 1
2023-03-10 03:08:58.971 UTC [46] LOG:  shutting down
103:M 10 Mar 2023 03:08:59.047 # User requested shutdown...
103:M 10 Mar 2023 03:08:59.047 * Saving the final RDB snapshot before exiting.
2023-03-10 03:08:59.060 UTC [42] LOG:  database system is shut down
103:M 10 Mar 2023 03:08:59.073 * DB saved on disk
103:M 10 Mar 2023 03:08:59.073 # Redis is now ready to exit, bye bye...


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile' failed with return #<Process::Status: pid 1004 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"assets_precompile", "cmd"=>["su discourse -c 'bundle exec rake themes:update assets:precompile'"]}
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.
e956a73644feb880e4b524bcbd4fa3c626fcfcc4edb3752f72e523194f663b4e
root@Discourse-1:/var/discourse# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
root@Discourse-1:/var/discourse# 

您的 app.yml 中有插件吗?
当这种情况发生在我身上时,通常是某个插件损坏了,在重建之前必须将其注释掉。

你有多少内存?尝试重启机器并重新构建。

free 告诉您什么?

就个人而言,如果备份失败,我不会尝试更新。备份——包括下载副本——对我来说是先决条件。这可能不是一个此时有用的评论,但我认为它必须说出来。

在您之前的帖子中,您提供了有关 rake 中止的更多信息:

那不是问题。那看起来像是没有下载 MaxMind DB 的密钥。问题在上面。

如果问题是无法生成,那么我们不仅要关心 RAM 和交换空间的使用情况,还要关心内核配置。如果日志中出现以下内容

# WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

那么按照建议去做是值得的。另请参阅

我的 Discourse 安装非常通用。重启后,我得到了一个干净的备份。所以,最终我决定从头开始安装。安装失败,出现了我上面发布的相同错误。过去四年我一直在 LXD 容器中使用 6GB 内存运行 Discourse,没有出现任何问题。内存利用率稳定在 1.9GB。升级期间,内存峰值达到 5.1GB。我的数据库备份只有 30GB 数据,因此与其他人相比,我的安装规模很小。我的配置运行在 Ubuntu 22.04 上。我应该换用其他发行版吗?

我有大约 40 个用户和 150 篇帖子。该系统使用了 1.8GB 内存,我分配了 6GB 内存。重建工作需要多少内存?过去这似乎一直足够。

我没有使用任何插件。

您能分享一下您的 app.yml 文件吗?恐怕您为 MaxMind 设置了无效的 API 密钥。

这是我的 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"
## 如果您希望添加 Lets 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: "4096MB"

  ## 可以提高排序性能,但会增加每个连接的内存使用量
  #db_work_mem: "40MB"

  ## 此容器应使用哪个 Git 版本? (默认:tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## 支持多少并发 Web 请求?取决于内存和 CPU 核心。
  ## 将由 bootstrap 根据检测到的 CPU 自动设置,或者您可以覆盖它
  UNICORN_WORKERS: 8

  ## TODO:此 Discourse 实例将响应的域名
  ## 必需。Discourse 不能使用裸 IP 地址。
  DISCOURSE_HOSTNAME: discussion.scottibyte.com

  ## 如果您希望容器以与上面指定的相同主机名 (-h 选项) 启动,请取消注释
  ## (默认值为 "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO:将成为初始注册管理员和开发人员的逗号分隔的电子邮件列表
  ## 示例 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'aaaaaa@gmail.com'

  ## TODO:用于验证新帐户和发送通知的 SMTP 邮件服务器
  # 需要 SMTP 地址、用户名和密码
  # 警告:SMTP 密码中的字符 '#' 可能会导致问题!
  DISCOURSE_SMTP_ADDRESS: smtp.gmail.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: redacted
  DISCOURSE_SMTP_PASSWORD: redacted
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (可选,默认 true)
  DISCOURSE_SMTP_DOMAIN: discussion.scottibyte.com
  DISCOURSE_NOTIFICATION_EMAIL: noreply@scottibyte.com

  ## 如果您添加了 Lets Encrypt 模板,请取消注释下方以获取免费 SSL 证书
  LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## 此 Discourse 实例的 HTTP 或 HTTPS CDN 地址(配置为拉取)
  ## 请参阅 https://meta.discourse.org/t/14857 获取详细信息
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## 用于 IP 地址查找的 MaxMind 地理位置 IP 地址密钥
  ## 请参阅 https://meta.discourse.org/t/-/137387/23 获取详细信息
  DISCOURSE_MAXMIND_LICENSE_KEY: aaaaaaaa

## Docker 容器是无状态的;所有数据都存储在 /shared 中
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## 插件放在这里
## 请参阅 https://meta.discourse.org/t/19157 获取详细信息
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## 构建后要运行的任何自定义命令
run:
  - exec: echo "Beginning of custom commands"
  ## 如果您想为第一次注册设置“发件人”电子邮件地址,请取消注释并更改:
  ## 获取第一个注册电子邮件后,重新注释该行。它只需要运行一次。
  # - exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "End of custom commands"

当我进行新的构建时,我尝试了一个新的 Maxmind 密钥,但遇到了同样的错误。

删除或注释掉带有 DISCOURSE_MAXMIND_LICENSE_KEY 的行并重新构建。

哦,如果这有帮助的话。现在一切运行正常。更新是导致问题的根源。

已在 YAML 中注释掉 Maxmind 密钥。正在进行重建。顺便说一句,电子邮件通知一直运行正常。最近,备份下载链接的电子邮件不再起作用。我只需转到文件夹并通过 sftp 下载备份,这可以正常工作,并且备份日志成功完成。那么,您认为 Maxmind 密钥的问题出在哪里?

@Falco 看来问题出在 Maxmind 密钥上。


正如你所见,重建成功了,论坛也已更新到最新版本。从 GUI 进行新的备份、备份通知以及备份下载链接都运行正常。一切都很好。
谢谢你,你真是大师!评论很棒,帮助也很棒。

所以,即使更换了新的 Maxmind 密钥,我也没有成功。关于这一点,有什么建议吗?

那么无效的密钥会中断构建,但 Null 密钥不会?

理想情况下两者都不会,只需要确认具体是哪里坏了,并提供正确的复现步骤,以便我们提交一个 bug 并指派一名工程师来修复。

我所做的只是注释掉密钥,然后重新构建就完美地完成了。使用有效的(甚至是新的密钥),构建就会失败,并附带我提供的日志。