例行检查
你的版本
问题描述, 日志截图,配置文件等
标题(Title)
fastgpt-code-sandbox v4.15.0 在群晖 NAS(DSM 定制内核)上启动失败:Python warm child failed: load seccomp filter: operation canceled
环境信息(Environment)
问题描述(Description)
按照官方 V4.15.0 升级文档迁移 docker-compose_pg.yml 后,fastgpt-code-sandbox(v4.15.0)容器启动后反复打印以下警告,最终容器异常退出/无法保持运行:
2026-07-05 10:59:59 INF sandbox:server Sandbox server starting on port 3000...
2026-07-05 10:59:59 INF sandbox:server Sandbox server listening on port 3000
2026-07-05 11:00:00 WRN sandbox:server Python warm child failed: load seccomp filter: operation canceled
2026-07-05 11:00:01 WRN sandbox:server Python warm child failed: load seccomp filter: operation canceled
... (反复出现,直到容器退出)
同一台机器上,v4.14.15 版本的 fastgpt-code-sandbox 镜像可以正常启动、正常构建运行(配置文件其余部分未变)。
复现步骤(Steps to Reproduce)
- 在群晖 DSM Docker(Container Manager)上,使用官方 V4.15.0 的
docker-compose_pg.yml(未做任何自定义修改,仅替换了密钥/密码类变量)
docker-compose up -d 启动全部服务
- 观察
fastgpt-code-sandbox 容器日志
期望结果(Expected Behavior)
fastgpt-code-sandbox 容器正常启动并保持运行,健康检查通过。
实际结果(Actual Behavior)
容器持续打印 Python warm child failed: load seccomp filter: operation canceled,最终容器停止/不断重启,无法提供正常的代码执行沙箱服务。
已尝试的排查(What I've Tried)
- 给容器添加
security_opt: [no-new-privileges:true, seccomp:unconfined](关闭 Docker 外层 seccomp 限制)—— 无效,报错依旧
- 给容器添加
privileged: true(完全放开容器权限)—— 无效,报错依旧
- 将镜像版本回退到
v4.14.15(配置其余不变)—— 可以正常启动
初步原因分析(Root Cause Analysis)
在 projects/sandbox/src/sandbox/constants.ts 中,Python 沙箱通过 python-seccomp(libseccomp 的 Python 绑定)为每个预热的 Python 子进程加载 seccomp-BPF 过滤规则:
f = SyscallFilter(defaction=KILL)
# ... add_rule ...
f.load()
f.load() 默认会以 SECCOMP_FILTER_FLAG_TSYNC(线程同步)模式把过滤规则同步到进程内所有线程。当内核无法完成这种"多线程同步"时,libseccomp 会返回 ECANCELED,对应日志中的 operation canceled。
这是 v4.15 才引入的新的沙箱内部加固机制(v4.14.x 的镜像没有这个逻辑),怀疑与部分定制/精简内核(例如群晖 DSM 的定制内核分支)对 seccomp BPF TSYNC 多线程同步支持不完整或有限制有关,属于容器内部应用自身调用 seccomp 失败,而非 Docker 外层 seccomp 策略拦截(因为关闭外层 seccomp、甚至使用 privileged: true 都无法解决)。
诉求 / 建议(Ask)
- 是否可以增加一个环境变量开关(例如
SANDBOX_DISABLE_NESTED_SECCOMP 之类),允许在这类内核不完整支持 seccomp TSYNC 的环境下,跳过这层内部 seccomp 加固,退回到仅靠模块白名单 + 资源限制的隔离方式,而不是让容器直接崩溃?
- 或者在
f.load() 失败时做优雅降级(记录警告但继续用非 TSYNC 模式或不加载该层过滤,而不是导致 warm child 反复失败、容器最终不可用)?
- 是否有计划在文档中补充这一已知兼容性限制,方便其他群晖/NAS 用户排查?
非常感谢 FastGPT 团队的工作,如果需要更多环境信息或协助测试,我可以补充。
例行检查
你的版本
问题描述, 日志截图,配置文件等
标题(Title)
fastgpt-code-sandboxv4.15.0 在群晖 NAS(DSM 定制内核)上启动失败:Python warm child failed: load seccomp filter: operation canceled环境信息(Environment)
docker-compose-pgvector/ pg 版本)uname -r>fastgpt-code-sandbox镜像版本:v4.15.0问题描述(Description)
按照官方 V4.15.0 升级文档迁移
docker-compose_pg.yml后,fastgpt-code-sandbox(v4.15.0)容器启动后反复打印以下警告,最终容器异常退出/无法保持运行:同一台机器上,
v4.14.15版本的fastgpt-code-sandbox镜像可以正常启动、正常构建运行(配置文件其余部分未变)。复现步骤(Steps to Reproduce)
docker-compose_pg.yml(未做任何自定义修改,仅替换了密钥/密码类变量)docker-compose up -d启动全部服务fastgpt-code-sandbox容器日志期望结果(Expected Behavior)
fastgpt-code-sandbox容器正常启动并保持运行,健康检查通过。实际结果(Actual Behavior)
容器持续打印
Python warm child failed: load seccomp filter: operation canceled,最终容器停止/不断重启,无法提供正常的代码执行沙箱服务。已尝试的排查(What I've Tried)
security_opt: [no-new-privileges:true, seccomp:unconfined](关闭 Docker 外层 seccomp 限制)—— 无效,报错依旧privileged: true(完全放开容器权限)—— 无效,报错依旧v4.14.15(配置其余不变)—— 可以正常启动初步原因分析(Root Cause Analysis)
在
projects/sandbox/src/sandbox/constants.ts中,Python 沙箱通过python-seccomp(libseccomp 的 Python 绑定)为每个预热的 Python 子进程加载 seccomp-BPF 过滤规则:f.load()默认会以SECCOMP_FILTER_FLAG_TSYNC(线程同步)模式把过滤规则同步到进程内所有线程。当内核无法完成这种"多线程同步"时,libseccomp 会返回ECANCELED,对应日志中的operation canceled。这是 v4.15 才引入的新的沙箱内部加固机制(v4.14.x 的镜像没有这个逻辑),怀疑与部分定制/精简内核(例如群晖 DSM 的定制内核分支)对 seccomp BPF
TSYNC多线程同步支持不完整或有限制有关,属于容器内部应用自身调用 seccomp 失败,而非 Docker 外层 seccomp 策略拦截(因为关闭外层 seccomp、甚至使用privileged: true都无法解决)。诉求 / 建议(Ask)
SANDBOX_DISABLE_NESTED_SECCOMP之类),允许在这类内核不完整支持 seccomp TSYNC 的环境下,跳过这层内部 seccomp 加固,退回到仅靠模块白名单 + 资源限制的隔离方式,而不是让容器直接崩溃?f.load()失败时做优雅降级(记录警告但继续用非 TSYNC 模式或不加载该层过滤,而不是导致 warm child 反复失败、容器最终不可用)?非常感谢 FastGPT 团队的工作,如果需要更多环境信息或协助测试,我可以补充。