labring / labring/fastgpt-plugin
fastgpt-plugin v0.4.0 ESM 打包镜像在特定 Linux 环境下无法连接 MongoDB
- Dominant language
- TypeScript
- Stars
- 44
- Forks
- 94
- Avg merge
- 23h 14m
- Merged PRs (30d)
- 22
Description
**例行检查**
[//]: # '方框内填 x 表示打钩'
- [x] 我已确认目前没有类似 issue
- [x] 我已完整查看过项目 README,以及[项目文档](https://doc.fastgpt.io/docs/introduction/)
- [x] 我使用了自己的 key,并确认我的 key 是可正常使用的
- [x] 我理解并愿意跟进此 issue,协助测试和提供反馈
- [x] 我理解并认可上述内容,并理解项目维护者精力有限,**不遵循规则的 issue 可能会被无视或直接关闭**
**你的版本**
- [ ] 公有云版本
- [x ] 私有部署版本, 具体版本号: v0.4.0
**问题描述, 日志截图,配置文件等**
## 环境信息
| 项目 | 云服务器(天翼云) | 本地 WSL2 |
|------|-------------------|-----------|
| OS | Ubuntu, Linux 5.15.0-76-generic x86_64 | Linux 6.6.87.2-microsoft-standard-WSL2 |
| Docker | 29.5.3 | 29.5.3 |
| Docker Compose | v2.38.1 | - |
| MongoDB 镜像 | mongo:5.0.32 | mongo:5.0.18 |
| plugin 镜像 | v0.4.0 (阿里云 registry) | v0.4.0 (阿里云 registry) |
## 问题描述
`fastgpt-plugin:v0.4.0` 容器在天翼云服务器上启动后,无法连接 MongoDB,反复重启。**相同的 docker-compose.yml 配置在本地 WSL2 环境下运行正常。**
错误日志:
```
LP1 [MongooseError]: Connection operation buffering timed out after 10000ms
at R6._waitForConnect (file:///app/dist/index.js:761:1304)
at async R6.createCollection (file:///app/dist/index.js:757:1738)
at async q0.createCollection (file:///app/dist/index.js:925:2325)
at async q0.syncIndexes (file:///app/dist/index.js:925:3020)
```
## 已排查的结论
经过大量排查,我们定位到了最本质的问题:
**plugin 镜像内置的 ESM 打包 MongoDB 驱动无法在该环境下建立连接,但同一网络中其他容器使用相同版本的驱动可以正常连接。**
具体证据:
1. **网络层完全正常**:从 plugin 容器内 `ping`、`nc`、Node.js `net` 模块到 MongoDB 的 TCP 连接均成功
2. **MongoDB 服务正常**:副本集状态为 PRIMARY,其他服务(fastgpt、fastgptpro)均可正常连接
3. **相同驱动版本从其他容器连接成功**:在同一个 Docker 网络中,使用 sandbox 容器安装 `mongodb@6` 和 `mongoose@8` 并连接 MongoDB,完全正常:
```
Connecting to: mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
Mongoose connected OK!
```
4. **MongoDB 驱动调试日志无输出**:设置 `MONGODB_LOG_ALL=DEBUG` 等环境变量后,plugin 容器没有任何调试日志输出,说明 **驱动根本没有尝试发起连接**
5. **plugin 镜像内置的驱动版本**:Mongoose 8.19.2 + MongoDB driver 6.20.0(与 sandbox 测试成功的版本一致)
6. **重新拉取镜像和导出本地镜像均无效**:排除了镜像损坏的可能性
## 关键对比
| 测试场景 | 结果 |
|---------|------|
| sandbox 容器 + mongodb@6 (CommonJS) | ✅ 连接成功 |
| sandbox 容器 + mongoose@8 (CommonJS) | ✅ 连接成功 |
| plugin 容器 v0.4.0 (ESM 打包) | ❌ 连接超时 |
| 本地 WSL2 + plugin v0.4.0 | ✅ 连接成功 |
| 云服务器 + plugin v0.4.0 | ❌ 连接超时 |
## 推测的根因
plugin 镜像使用 ESM 打包(`file:///app/dist/index.js`),将 Mongoose 和 MongoDB 驱动打包在一个文件中。这种打包方式在某些 Linux 内核环境下可能导致 MongoDB 驱动的网络连接逻辑异常。
具体来说,MongoDB 驱动在建立连接时会经历:TCP 连接 → 握手(hello/isMaster)→ 认证。从调试结果看,驱动甚至没有进入 TCP 连接阶段(无调试日志输出),但在同一容器内使用 Node.js `net` 模块的 TCP 连接完全正常。
## 复现步骤
1. 在天翼云 Ubuntu 服务器(Linux 5.15.0-76-generic)上
2. 使用 `deploy/docker/cn/docker-compose.yml` 启动服务
3. `fastgpt-plugin` 容器持续重启,日志显示 MongoDB 连接超时
**相关截图**
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.