升级/重建因 MaxMind DB 停止服务而失败

各位,

希望有人能在这里提供帮助。我的论坛运行在 EC2 上的 Docker 容器中,已经超过 12 个月没有遇到过升级问题。

我尝试了以下方法:

  • 运行 launcher cleanup,但磁盘空间没有问题
  • 执行最新的 git pull
  • 多次重新构建应用
  • 甚至尝试了 discourse-setup,并打算尝试恢复数据库::frowning:
  • 重启服务器
  • 运行 apt-get update; apt-get upgrade

以下是日志的末尾部分:

完成所有 JS 文件的压缩:88.88 秒
rake 中断!
SocketError: 无法打开到 geolite.maxmind.com:443 的 TCP 连接(getaddrinfo:主机名未关联任何地址)
/var/www/discourse/lib/final_destination.rb:411:in `safe_session'
/var/www/discourse/lib/final_destination.rb:362:in `safe_get'
/var/www/discourse/lib/final_destination.rb:131:in `get'
/var/www/discourse/lib/file_helper.rb:51:in `download'
/var/www/discourse/lib/discourse_ip_info.rb:30:in `mmdb_download'
/var/www/discourse/lib/tasks/assets.rake:220:in `block (3 levels) in <top (required)>'
/var/www/discourse/lib/tasks/assets.rake:219:in `each'
/var/www/discourse/lib/tasks/assets.rake:219:in `block (2 levels) in <top (required)>'

原因:

SocketError: getaddrinfo:主机名未关联任何地址

/var/www/discourse/lib/final_destination.rb:411:in `safe_session'
/var/www/discourse/lib/final_destination.rb:362:in `safe_get'
/var/www/discourse/lib/final_destination.rb:131:in `get'
/var/www/discourse/lib/file_helper.rb:51:in `download'
/var/www/discourse/lib/discourse_ip_info.rb:30:in `mmdb_download'
/var/www/discourse/lib/tasks/assets.rake:220:in `block (3 levels) in <top (required)>'
/var/www/discourse/lib/tasks/assets.rake:219:in `each'
/var/www/discourse/lib/tasks/assets.rake:219:in `block (2 levels) in <top (required)>'

任务:TOP => assets:precompile

(通过运行任务并添加 --trace 参数可查看完整跟踪信息)

I, [2019-12-30T18:56:27.608998 #1] INFO -- : 正在下载 MaxMindDB...
正在压缩 JavaScript 并生成源映射文件
I, [2019-12-30T18:56:27.633923 #1] INFO -- : 正在终止异步进程
I, [2019-12-30T18:56:27.637383 #1] INFO -- : 向 HOME=/var/lib/postgresql USER=postgres 执行 chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/10/bin/postmaster -D /etc/postgresql/10/main 发送 INT 信号,pid: 49
I, [2019-12-30T18:56:27.639770 #1] INFO -- : 向 exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf 发送 TERM 信号,pid: 166
166:signal-handler (1577732187) 收到 SIGTERM,正在计划关闭...
2019-12-30 18:56:27.639 UTC [49] LOG: 收到快速关闭请求
2019-12-30 18:56:27.654 UTC [49] LOG: 中止任何活跃事务
166:M 30 Dec 2019 18:56:27.666 # 用户请求关闭...
166:M 30 Dec 2019 18:56:27.694 * 在退出前保存最终的 RDB 快照。
2019-12-30 18:56:27.702 UTC [49] LOG: 工作进程:逻辑复制启动器(PID 58)以退出代码 1 退出
2019-12-30 18:56:27.711 UTC [53] LOG: 正在关闭
2019-12-30 18:56:27.819 UTC [49] LOG: 数据库系统已关闭
166:M 30 Dec 2019 18:56:27.885 * 数据库已保存到磁盘
166:M 30 Dec 2019 18:56:27.886 # Redis 现在准备退出,再见...

失败
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake assets:precompile' 执行失败,返回状态为 #<Process::Status: pid 507 exit 1>
失败位置:/pups/lib/pups/exec_command.rb:112:in `spawn'
执行失败,参数如下:{"cd"=>"$home", "hook"=>"assets_precompile", "cmd"=>["su discourse -c 'bundle exec rake assets:precompile'"]}
fcf17d793c27c4e87616420ead222cc3f4a9fc163f239a5542b1c9a092579b30

** 启动失败 ** 请向上滚动查看更早的错误消息,可能不止一条。
./discourse-doctor 可能有助于诊断问题。

真的希望有人能对此提供一些线索。

谢谢大家。

如果有人希望继续使用旧许可证下发布的最后版本文件,我已将它们全部保存至 archive.org

所有文件均由 MaxMind 创建,并根据 知识共享署名 - 相同方式共享 4.0 国际许可协议 分发。

archive.org 链接 MD5 哈希值 Last-Modified 头部
GeoLite2-City.tar.gz 7ba2c58b4e0eac6c08c6399aebdae26c Tue, 24 Dec 2019 17:46:00 GMT
GeoLite2-Country.tar.gz dc6224c648350d90f344a0c5c3ca5474 Tue, 24 Dec 2019 17:40:42 GMT
GeoLite2-ASN.tar.gz f3c9c5775fd226db6e8098675ff65861 Tue, 24 Dec 2019 14:16:58 GMT
GeoLite2-City-CSV.zip 89e5bf01a970b5668d74cf29a242d546 Tue, 24 Dec 2019 17:45:52 GMT
GeoLite2-Country-CSV.zip f50b518341de54fe48c5e34f13e24e99 Tue, 24 Dec 2019 17:40:41 GMT
GeoLite2-ASN-CSV.zip 463ccd73c104c52547fa50a84fc2f86e Tue, 24 Dec 2019 14:16:58 GMT

信息页面存档截图

我们现在支持通过官方认可的方式获取数据库,详情如下:

如果您希望定期获取 MaxMind 的更新,请访问 GeoLite sign up | MaxMind 注册账户并生成许可证密钥。

然后,您需要修改容器配置,在 env: 部分添加该密钥:

env:
   DISCOURSE_MAXMIND_LICENSE_KEY: ...在此处填写密钥...

此修复确保不再存在定时炸弹问题。如果没有许可证密钥,系统将永远不会尝试下载相关文件。

我们正在与 MaxMind 讨论将更新后的数据库捆绑到新基础镜像中的可能性。根据讨论结果,自托管用户将面临两种选择:

  1. 在添加许可证之前,用户个人资料页面和管理页面将不提供 IP 解析功能。

  2. 自获取基础镜像(即执行 ./launcher rebuild app)起,IP 解析数据可能最多滞后 N 天。

很可能最终自托管用户将采用方案(1)。

我们也在调查其他替代方案,但目前的限制较多。

我个人非常反对在核心功能中添加通过 Web 服务进行 IP 查询的功能,因为这会将信息暴露给第三方。目前只有两种主要的替代方案,且两者都需要注册。

@sam 我有一个小功能请求,能否在管理面板中添加一个设置,用于输入 MaxMind 许可证密钥?

近期不太可能,这是一个全局设置,在 multisite 中按站点设置没有意义。

还有其他人在尝试注册 MaxMind 账户时遇到这个错误吗?

我可以确认,我们已顺利注册账户,未遇到任何问题。如需解决账户相关问题,请联系 MaxMind 获取支持,我们在此无法提供帮助。

我试图从 2.3.8 升级到 2.3.9,但所有方法都无效。

据我所知,相关错误就是本主题中讨论的那个。

rake aborted!
SocketError: Failed to open TCP connection to geolite.maxmind.com:443 (getaddrinfo: Name or service not known)

在我的 app.yml 中,我已尝试将该 env 标志的值设为 30、100 和 0:

DISCOURSE_REFRESH_MAXMIND_DB_DURING_PRECOMPILE_DAYS: 0

但这似乎从未产生任何效果(我怀疑它是否被正确识别)。

还有什么其他可以尝试的方法吗?

感谢过去几周里所有参与快速修复工作的人。我们不得不对 Matomo 做同样的事情,那要痛苦得多(需要手动操作)。

由此我想问一个问题:MaxMind 数据具体用在哪里?是否仅在管理员查看用户 IP 地址时使用?还有其他我可能忽略的用途吗?

我们显然已经拥有 MaxMind 账户,但想知道是否有必要立即着手处理此事。

它执行 IP 地址的地理查询。最近我进行了多次安装和升级,未设置 API 密钥,重建也能正常工作。(当前版本为 beta 10)

此外,获取密钥以下载数据库并不难。

我希望能于下周更新 discourse-setup 以支持该密钥。

没错,它用于管理员查询用户 IP。此外,还用于用户偏好设置中的“最近使用的设备”列表,以及当检测到账户从不同位置登录时向管理员发出警报。

抱歉打扰了,我想问一下,是否计划保留禁用 IP 查询的功能?在我看来,强制管理员订阅第三方服务并不是一个好主意。我自己已经拥有用于其他用途的许可证密钥,因此这里我是从一般角度出发的。

如果您不输入许可证密钥,该功能将被禁用。系统不会强制管理员进行设置。

此外,为避免任何混淆,Discourse 绝不会将 IP 地址发送给第三方。Discourse 会从 MaxMind 下载完整的 IP 位置数据库,然后在内部进行查询。

太好了,感谢您的澄清!

正在修订此内容……该更新已向后移植到稳定版。