我正在从头开始为开发目的创建一个新的 discourse 实例,并再次看到此引导错误:
FAILED
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 1002 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 {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap failed with exit code 1
容器设置是为 webonly 和 dataonly (redis) 使用两个容器,并使用外部 postgresql 数据库。注释掉 maxmind 设置没有任何改变。
有什么办法可以解决这个问题吗?
Ed_S
(Ed S)
2025 年4 月 18 日 20:00
2
最好的猜测是您的内存不足 - 在这种情况下,请添加交换空间或迁移到具有更大 RAM 的实例。请尝试运行 free -h。
嗯,不行,我们有 4 GB 的内存和充足的硬盘空间(2 x 32 GB),整体环境与其他运行构建而没有问题的 Docker 机器相同。
内存状态:
root@docker3a:/var/discourse# free -h
总量 已用 空闲 共享 缓冲区/缓存 可用
内存: 3.8Gi 819Mi 1.4Gi 22Mi 1.9Gi 3.0Gi
Swap: 974Mi 52Mi 922Mi
1 个赞
Ed_S
(Ed S)
2025 年4 月 19 日 14:40
4
dmesg 的输出中是否有任何可能相关的近期错误?
Falco
(Falco)
2025 年4 月 19 日 14:42
6
Ed_S:
最好的猜测是你没有足够的内存
这是一个奇怪的猜测,我们通常不会看到内存不足导致 Discourse 出现迁移错误。
检测到 x86_64 架构。
正在确保启动器是最新的
启动器是最新的
2.0.20250226-0128:正在从 discourse/base 拉取
摘要:sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
状态:镜像已是最新,为 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
18:C 2025年4月19日 16:38:41.670 # oO0OoO0OoO0Oo Redis 正在启动 oO0OoO0OoO0Oo
18:C 2025年4月19日 16:38:41.670 # Redis 版本=7.0.15, 位数=64, commit=00000000, 修改=0, pid=18, 刚刚启动
18:C 2025年4月19日 16:38:41.670 # 已加载配置
18:M 2025年4月19日 16:38:41.670 * 单调时钟:POSIX clock_gettime
18:M 2025年4月19日 16:38:41.670 * 运行模式=standalone, 端口=6379。
18:M 2025年4月19日 16:38:41.670 # 服务器已初始化
18:M 2025年4月19日 16:38:41.671 * 加载由版本 7.0.15 生成的 RDB
18:M 2025年4月19日 16:38:41.671 * RDB 年龄 72606 秒
18:M 2025年4月19日 16:38:41.671 * 创建时的 RDB 内存使用量 0.82 Mb
18:M 2025年4月19日 16:38:41.671 * RDB 加载完成,已加载键:0,已过期键:0。
18:M 2025年4月19日 16:38:41.671 * DB 从磁盘加载:0.000 秒
18:M 2025年4月19日 16:38:41.671 * 已准备好接受连接
999:C 2025年4月19日 16:39:59.006 # oO0OoO0OoO0Oo Redis 正在启动 oO0OoO0OoO0Oo
999:C 2025年4月19日 16:39:59.006 # Redis 版本=7.0.15, 位数=64, commit=00000000, 修改=0, pid=999, 刚刚启动
999:C 2025年4月19日 16:39:59.006 # 已加载配置
999:M 2025年4月19日 16:39:59.006 * 单调时钟:POSIX clock_gettime
999:M 2025年4月19日 16:39:59.006 # 警告:无法创建服务器 TCP 监听套接字 *:6379:bind:地址已在使用中
999:M 2025年4月19日 16:39:59.006 # 端口 6379 (TCP) 监听失败,正在中止。
18:signal-handler (1745080813) 收到 SIGTERM,正在计划关闭...
18:M 2025年4月19日 16:40:13.541 # 用户请求关闭...
18:M 2025年4月19日 16:40:13.541 * 正在退出前保存最终 RDB 快照。
18:M 2025年4月19日 16:40:13.549 * DB 已保存到磁盘
18:M 2025年4月19日 16:40:13.549 # Redis 已准备好退出,再见...
失败
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' 失败,返回 #<Process::Status: pid 1002 exit 1>
失败位置:/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
使用参数 exec 失败 {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
引导失败,退出代码为 1
** 引导失败 ** 请向上滚动并查找更早的错误消息,可能不止一个。
./discourse-doctor 可能有助于诊断问题。
48b8aa6c912bbabc42d6b9373808088f5aa9079de1e1f7360fc858891a48556b
Falco
(Falco)
2025 年4 月 19 日 16:54
8
如果这是一个仅限 Web 的容器,为什么它上面会有 Redis?
您能分享您的 yml 容器定义吗?而且,您为什么要运行一个双容器安装?
好的,我已经修复了 web_only 和 redis 的分离。错误信息现在是:
FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 981 e
xit 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 {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migra
te'"]}
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.
801049b69a89d38b1ae5c299d356fc5f8dc6a8f518b1260c2dde05e0b6081556
但也许是我这边理解有误/知识不足:
数据库应该是外部的,位于另一个带有 postgresql 数据库的 lxc 容器中。数据库用户和数据库都存在,但在 web_only 首次引导之前,数据库是空的。脚本是在首次构建时在远程系统上自行创建数据库吗?还是我必须先创建数据库容器,然后手动将它的默认模式和数据导出到外部的 postgresql 守护进程?
整体设置的可视化
Ed_S
(Ed S)
2025 年4 月 20 日 08:11
11
感谢您提供的图表。这是一个相当复杂的设置——如果您有充分的理由并且了解情况,您会这样做。
如果您仍然看到以下内容,我认为这表明了问题所在。Redis 无法打开它需要监听的端口。
Thomas_Rother:
999:C 19 Apr 2025 16:39:59.006 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
999:C 19 Apr 2025 16:39:59.006 # Redis version=7.0.15, bits=64, commit=00000000, modified=0, pid=999, just started
999:C 19 Apr 2025 16:39:59.006 # Configuration loaded
999:M 19 Apr 2025 16:39:59.006 * monotonic clock: POSIX clock_gettime
999:M 19 Apr 2025 16:39:59.006 # Warning: Could not create server TCP listening socket *:6379: bind: Address already in use
999:M 19 Apr 2025 16:39:59.006 # Failed listening on port 6379 (TCP), aborting.
18:signal-handler (1745080813) Received SIGTERM scheduling shutdown...
因此,问题在于 Redis 是否应该在此容器中运行,如果是,那么机器上还有另一个 Redis 在运行吗?lsof 可能是一个有用的工具。
你好 @Ed_S
感谢你关于缺失端口的提示。我首先想等 Falco 回复我关于使用外部 postgres 数据库设置 discourse 的一般性问题。
是的,与仅有一个应用程序容器的标准设置相比,此设置有点复杂。我在 Proxmox(https://p.com )作为虚拟化环境的专用根机器上运行所有内容,位于 hetzner.de 。
1 个赞
pfaffman
(Jay Pfaffman)
2025 年4 月 21 日 18:48
13
您仍然需要分享完整的日志,包括迁移失败的部分。我猜测(因为您没有分享错误信息,所以这只是一个猜测)您正在使用 AI 插件,而您的数据库缺少必需的附加组件。
不,这是一个没有 AI 插件的安装,尽管将来这个实例将成为 AI 功能的试验场。
随附的是一个包含以下内容的 tar 包:
./launcher bootstrap web_only >> web_only_bootstrap.log
以及 redis 和 web_only 的 yml 文件,密码已删除。
forum2_build.tar.gz (3.3 KB)
RGJ
(Richard - Communiteq)
2025 年4 月 21 日 22:18
15
Longshot:
links:
- link:
name: redis
alias: data
为什么不是 alias: redis?
1 个赞
RGJ:
为什么不是 alias: redis?
/samples/web_only.yml 文件中有:
# 使用 'links' 键将容器链接在一起,即使用 Docker --link 标志。
links:
- link:
name: data
alias: data
在我的例子中,data 容器是一个 redis 容器。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
a27999b28a90 local_discourse/redis “/sbin/boot” 2 天前 已启动 20 小时
因此 name: redis and alias: data
根据 Docker 文档,这是一个遗留功能,但仍然可用,请参阅 Legacy container links | Docker Docs
我现在认为更好的方法是首先创建一个标准的“一体化”设置(app.yml)。然后将初始模式和数据从容器通过 sql dump 导出到外部 postgres 机器。@Falco 你怎么看?
pfaffman
(Jay Pfaffman)
2025 年4 月 22 日 16:35
17
但它只有 28 行,所以缺少了大部分。
我的新猜测是它根本没有联系到您的数据库,尽管也可能是它没有与 redis 通信。
尝试
./launcher bootstrap web_only >> web_only_bootstrap.log 2>&1
Falco
(Falco)
2025 年4 月 22 日 16:52
18
只要提供了有效的凭据并且能够访问数据库,安装程序就会自动创建所有必需项。这已在将 Discourse 配置为使用单独的 PostgreSQL 服务器 中进行了记录。
pfaffman
(Jay Pfaffman)
2025 年4 月 22 日 17:01
20
这是全新安装还是迁移到新服务器?
所以您需要查看日志文件并搜索“migrate”以查找迁移错误。
这是错误:
PG::DuplicateObject: ERROR: type “hotlinked_media_status” already exists
这可能是由于某个已迁移但随后被撤销提交的项目引起的问题。这与您的问题相关,但不是您的解决方案:https://meta.discourse.org/t/restore-fails-with-hotlinked-media-status-already-exists/323795。也许是这个:https://meta.discourse.org/t/upgrading-2-7-to-3-1-failing-hotlinked-media-status-already-exists/277313/5?u=pfaffman
另外,您应该修复这个,虽然它并没有真正造成什么损害:
插件名称是“discourse-topic-voting”,但插件目录名为“discourse-voting”
如果您再次这样做,请仅链接文件,而不要将其放入 tar 文件中。
1 个赞