遇到的问题是:
backend 报错:502 Bad Gateway 来自 Qdrant
→ 导致接口 `/api/chat` 返回 500 Internal Server Error
并且日志中提示:
QDRANT_URL=== http://qdrant:6333
这个错误的根本原因是:
你的 backend 服务尝试连接 qdrant 容器,但失败了,返回 502 Bad Gateway。
502 是网关错误,意味着请求到达了目标地址(qdrant),但是 qdrant 自己内部没能正常处理,可能根本没起来或者端口挂了。
现在的 Docker 服务大概率是通过 docker-compose.yml
启动的,我们要排查 Qdrant 是否正常启动:
docker ps --filter "name=qdrant"
应该看到类似:
CONTAINER ID IMAGE NAME ... STATUS
abc123 qdrant/qdrant qdrant ... Up ...
如果没有 Up
,说明没启动成功。
docker-compose logs qdrant
看是否有类似错误:
进入 backend
容器内,使用 curl 测试:
docker exec -it backend sh
apk add curl # 如果没有 curl
# 测试连接 qdrant 的接口
curl http://qdrant:6333/collections
预期返回应该是 JSON(即使没有 collection 也会有一个空结构)。如果返回的是空的或超时,说明 qdrant 没起来或不能访问。
返回:
ubuntu@VM-96-14-ubuntu:~/rag-saas$ curl http://localhost:6333/collections
{"result":{"collections":[]},"status":"ok","time":9.408e-6}
ubuntu@VM-96-14-ubuntu:~/rag-saas$ curl http://159.75.85.9:6333/collections
{"result":{"collections":[]},"status":"ok","time":3.616e-6}
发的两个 curl
请求都返回了有效结果,说明:
localhost:6333
)运行正常。159.75.85.9:6333
)。但是我现在的架构如下:
pyproject.toml
定义的一个命令;如果不想在云服务器上安装 poetry
,但又想执行 poetry run generate
的等效功能。
以下是pyproject.toml
配置:
[tool.poetry.scripts]
generate = "app.api.chat.engine.generate:generate_datasource"
说明 generate
其实只是运行了一个 Python 函数:
# 路径:app/api/chat/engine/generate.py
# 函数名:generate_datasource()
问题的原因是:qdrant中没有插入任何数据,没有生成qdrant实例。
其实完全可以在 backend
容器中(另外一个容器,已经安装了程序运行所需的各种库和包依赖) 执行 generate_datasource()
的命令,而且这样做反而是最推荐的方式之一,因为:
backend
为例)sudo docker exec -it backend bash
表示以交互方式(interactive)进入名为 backend 的正在运行的 Docker 容器的命令行环境
然后:
find . -name generate.py
以下截图是没有进入任何容器的路径信息展示:
sudo docker exec -it backend bash
表示以交互方式(interactive)进入名为 backend 的正在运行的 Docker 容器的命令行环境
以下截图是进入backend Docker 容器
之后的路径信息展示:
从这个输出:
/app
/app/app
可以看出你代码的根目录是 /app
,而且代码包是 /app/app
,也就是说你模块的路径像这样:
app.api.chat.engine.generate
generate_datasource()
:python -c "from app.api.chat.engine.generate import generate_datasource; generate_datasource()"
backend
):sudo docker exec -it backend bash
cd /app
python -c "from app.api.chat.engine.generate import generate_datasource; generate_datasource()"
sudo docker exec backend python -c "from app.api.chat.engine.generate import generate_datasource; generate_datasource()"
如果你运行时报错类似 ModuleNotFoundError: No module named 'app'
,说明 Python 的工作目录不对。
这时候你可以把 PYTHONPATH
加进去:
sudo docker exec backend bash -c "cd /app && PYTHONPATH=. python -c 'from app.api.chat.engine.generate import generate_datasource; generate_datasource()'"
或者:
sudo docker exec backend env PYTHONPATH=/app python -c "from app.api.chat.engine.generate import generate_datasource; generate_datasource()"