本文属于「自托管 Docker 部署实战」系列(共 35 篇),第 15 篇。 示例中的 IP(192.0.2.10)、域名(example.com)、密码均为占位符,请按实际环境替换。

它是什么

基于 LLM + 向量库的客服系统:agent-desk 提供对话与知识库管理,qdrant 存向量。

前置条件

  • 一台 Linux 服务器(1C1G 起步;Java 类应用建议 2C4G 以上);
  • 已安装 Docker 与 Compose v2,执行 docker compose version 有版本号输出;
  • 所有示例里的 IP / 域名 / 密码都是占位符,实际部署请替换成自己的。
# 安装 Docker(已安装可跳过)
curl -fsSL https://get.docker.com | sh

# 目录约定:一个服务一个目录,后文的 ./data 均指栈目录内
mkdir -p /srv/docker/active/<stack> && cd /srv/docker/active/<stack>

镜像地址

mlogclub/agent-desk:latest
qdrant/qdrant:v1.18.3

目录结构

/srv/docker/active/agent-desk/
├── docker-compose.yml
├── docker/
│   └── agent-desk.yaml   # 应用配置(模型、知识库、渠道)
└── data/                 # 应用数据

部署步骤

# docker-compose.yml(使用官方镜像版)
services:
  qdrant:
    image: qdrant/qdrant:v1.18.3
    restart: unless-stopped
    volumes:
      - qdrant-data:/qdrant/storage
    ports:
      - "6333:6333"

  agent-desk:
    image: mlogclub/agent-desk:latest
    restart: unless-stopped
    depends_on:
      qdrant:
        condition: service_started
    ports:
      - "8083:8083"
    volumes:
      - agent-desk-data:/app/data
      - ./docker/agent-desk.yaml:/app/config/config.yaml:ro
    environment:
      TZ: Asia/Shanghai

volumes:
  qdrant-data:
  agent-desk-data:
docker compose up -d
# 访问 http://<SERVER_IP>:8083

关键配置

  • config.yaml 挂载为只读,改配置后 docker compose restart agent-desk;
  • 向量库地址在配置里写 http://qdrant:6333(容器名),不是宿主 IP;
  • Qdrant 数据在 qdrant-data 卷,重建容器不丢。

注意事项

  • 模型 API Key 走 .env 或配置,不要写进 compose 提交 Git;
  • 首次建知识库时嵌入会吃 CPU/内存,注意 Qdrant 与模型服务的资源;
  • 对话数据涉及用户隐私,做好访问控制;
  • 如果从源码构建,build: . 代替 image:,并保留 agent-desk.yaml。

备份与升级

# 先确认卷名(通常是 <目录名>_qdrant-data / <目录名>_agent-desk-data)
docker volume ls | grep -E 'qdrant|agent-desk'

docker run --rm -v <项目名>_qdrant-data:/src -v "$PWD":/b alpine \
  tar czf /b/qdrant-$(date +%F).tar.gz -C /src .
docker run --rm -v <项目名>_agent-desk-data:/src -v "$PWD":/b alpine \
  tar czf /b/agent-desk-$(date +%F).tar.gz -C /src .

# 升级
docker compose pull
docker compose up -d
  • 重新生成向量成本很高,Qdrant 卷一定要备份;
  • 升级后如果检索异常,先回滚镜像,再检查数据版本。