labring / labring/fastgpt-plugin

fastgpt-plugin v0.4.0 ESM 打包镜像在特定 Linux 环境下无法连接 MongoDB

Open
#467 1 comment 0 reactions 0 assignees View on GitHub
bug
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 连接超时

**相关截图**

Image

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.