Qdrant 入门系列04 – 在 Debian 13 和 Debian 12 上安装 Qdrant

Qdrant 是用于自行部署语义搜索与 RAG 的开源向量数据库。本文介绍在 Debian 13(Trixie)和 Debian 12(Bookworm)上安装的两种方式:Docker Compose,以及由 systemd 管理的原生 deb 包。前者便于快速部署;后者适合更希望使用 systemctl 管理服务的环境。

原文命令在全新的 Debian 13.5 云镜像上测试,并记录了实际遇到的问题:Qdrant deb 包安装二进制程序和配置,但不提供 systemd 单元、专用用户,也不会创建启动所需的快照目录。这些内容需要自行配置。配套代码位于 c4geeks/qdrant 的 install-debian 目录,参数含义以 Qdrant 官方文档为准。

开始前的准备

  • Debian 13 或 Debian 12,amd64 或 arm64,至少 2 GB 内存。
  • 具有 sudo 权限的普通用户。
  • 能够访问 Qdrant 发行版、Docker 软件源和 Debian 镜像站。
  • 空闲 TCP 端口 6333(REST、Web UI)和 6334(gRPC)。

先安装辅助工具:

sudo apt update
sudo apt install -y ca-certificates curl jq

方法一:Docker Compose

Docker 上游镜像跨发行版保持一致,Compose 文件也可与其他服务配置一起纳入 Git。Debian 自带软件源中的 Docker 可能较旧,本文使用官方 Docker CE 软件源。

第一步:添加 Docker CE 软件源并安装

安装 Docker 引擎和 Compose 插件:

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg \
  -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

. /etc/os-release
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/debian ${VERSION_CODENAME} stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin

docker --version
docker compose version

将用户加入 docker 组,退出后重新登录以使组权限生效:

sudo usermod -aG docker $USER

全新 Trixie 主机上的安装过程如下:

Debian 13 上安装 Docker CE

第二步:将容器日志发送到 journald

对于长期运行的 systemd 主机,使用 journalctl 集中读取日志较方便。在启动容器前,将 journald 日志驱动写入 /etc/docker/daemon.json:

echo '{"log-driver":"journald"}' | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker

日志驱动在创建容器时确定。已有容器需重建才会使用新设置;下面创建的新容器会直接采用 journald。

第三步:通过 Docker 启动 Qdrant

检测执行时的最新版本,创建存储目录并运行容器。Qdrant 日志随后进入系统日志:

export QDRANT_VERSION=$(curl -s https://api.github.com/repos/qdrant/qdrant/releases/latest | jq -r .tag_name)
echo $QDRANT_VERSION   # v1.18.1 at the time of writing

sudo mkdir -p /var/lib/qdrant/storage

docker run -d \
  --name qdrant \
  --restart unless-stopped \
  -p 6333:6333 -p 6334:6334 \
  -v /var/lib/qdrant/storage:/qdrant/storage \
  qdrant/qdrant:${QDRANT_VERSION}  # https://github.com/qdrant/qdrant/releases

验证驱动,并从 journald 读取日志:

docker inspect qdrant --format 'log driver={{.HostConfig.LogConfig.Type}}'
curl -sf http://localhost:6333/healthz
sudo journalctl CONTAINER_NAME=qdrant --no-pager -n 5

驱动应显示 journald,健康检查应通过,Qdrant 的最新日志应来自系统日志:

Debian 中 Qdrant 容器日志写入 journald

第四步:改用 Docker Compose

首次体验可用 docker run,反复调整的服务更适合 Compose。以下文件集中设置 API 密钥、内存限制、持久化存储和 journald:

services:
  qdrant:
    image: qdrant/qdrant:${QDRANT_VERSION}  # https://github.com/qdrant/qdrant/releases
    container_name: qdrant
    restart: unless-stopped
    ports:
      - "6333:6333"
      - "6334:6334"
    volumes:
      - ./qdrant_storage:/qdrant/storage
      - ./qdrant_snapshots:/qdrant/snapshots
    environment:
      QDRANT__SERVICE__API_KEY: ${QDRANT_API_KEY}
      QDRANT__TELEMETRY_DISABLED: "true"
    logging:
      driver: journald
    deploy:
      resources:
        limits:
          memory: 4G

生成高强度密钥,将版本和密钥写入 .env,再启动服务:

echo "QDRANT_VERSION=${QDRANT_VERSION}" > .env
echo "QDRANT_API_KEY=$(openssl rand -base64 32)" >> .env

docker compose up -d
docker compose logs -f --tail=20 qdrant

方法二:原生 deb 包与 systemd

Qdrant 在 GitHub 发行版中提供官方 deb 包。虽然软件包命名面向 Ubuntu,原文测试中仍可在 Debian 安装。它只提供二进制程序、默认配置与 Web UI 资源;服务单元、用户、存储和快照目录需要自行创建。

第一步:安装 deb 包

如果前面运行了 Docker 容器,先停止它,释放 6333 端口:

docker stop qdrant 2>/dev/null

cd /tmp
curl -fL -o "qdrant_${QDRANT_VERSION#v}-1_amd64.deb" \
  "https://github.com/qdrant/qdrant/releases/download/${QDRANT_VERSION}/qdrant_${QDRANT_VERSION#v}-1_amd64.deb"  # https://github.com/qdrant/qdrant/releases

sudo apt install -y "./qdrant_${QDRANT_VERSION#v}-1_amd64.deb"

qdrant --version
systemctl status qdrant 2>&1 | head -3

版本命令应正常输出,而 systemctl status 会提示尚无服务单元。安装位置分别为 /usr/bin/qdrant、/etc/qdrant/config.yaml 和 /var/lib/qdrant/static:

Debian 上通过 deb 包安装 Qdrant

第二步:创建用户、目录和服务单元

创建专用系统用户,同时创建存储和快照目录,并设置所有权。打包配置使用绝对路径 /var/lib/qdrant/storage 与 /var/lib/qdrant/snapshots:

sudo useradd -r -s /usr/sbin/nologin qdrant
sudo mkdir -p /var/lib/qdrant/storage /var/lib/qdrant/snapshots
sudo chown -R qdrant:qdrant /var/lib/qdrant

写入服务单元。显式使用 --config-path,使程序读取软件包提供的配置,而非在工作目录中搜索:

sudo tee /etc/systemd/system/qdrant.service >/dev/null <<'EOF'
[Unit]
Description=Qdrant Vector Database
After=network.target

[Service]
Type=simple
User=qdrant
Group=qdrant
WorkingDirectory=/var/lib/qdrant
ExecStart=/usr/bin/qdrant --config-path /etc/qdrant/config.yaml
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now qdrant
sudo systemctl is-active qdrant
curl -sf http://localhost:6333/healthz

服务应显示 active,健康检查应通过:

Debian 上自定义 Qdrant systemd 服务单元正常运行

如果未创建快照目录就启动,程序可能以 Failed to create snapshots temp directory 错误退出。原文测试确实遇到此问题,因此在 systemctl start 前,应确保两个目录都存在。

验证集合与搜索

两种安装方式使用相同的 6333 REST API。创建 demo 集合,写入三个带载荷的点,再搜索最近邻:

curl -s -X PUT http://localhost:6333/collections/demo \
  -H "Content-Type: application/json" \
  -d '{"vectors":{"size":4,"distance":"Cosine"}}' | jq .

curl -s -X PUT http://localhost:6333/collections/demo/points \
  -H "Content-Type: application/json" \
  -d '{
    "points": [
      {"id":1, "vector":[0.1,0.2,0.3,0.4], "payload":{"city":"Nairobi"}},
      {"id":2, "vector":[0.2,0.3,0.4,0.5], "payload":{"city":"Berlin"}},
      {"id":3, "vector":[0.9,0.8,0.7,0.6], "payload":{"city":"Tokyo"}}
    ]
  }' | jq .

curl -s -X POST http://localhost:6333/collections/demo/points/search \
  -H "Content-Type: application/json" \
  -d '{"vector":[0.15,0.25,0.35,0.45],"limit":3,"with_payload":true}' \
  | jq .

Berlin 与查询的余弦方向最接近,排在第一;之后是 Nairobi、Tokyo。相同排序说明写入、索引和查询流程已连通:

Debian 上首次向量搜索结果

打开 Web UI

访问服务器 6333 端口的 /dashboard,Collections 面板应显示 demo 集合:

Debian 13 上 Qdrant Web UI 的集合面板

配置防火墙

Debian 云镜像通常不默认启用防火墙。若使用 nftables,只允许可信 CIDR 访问两个 Qdrant 端口。面向公网前,应先设置 API 密钥与 TLS:

sudo apt install -y nftables
sudo systemctl enable --now nftables

TRUSTED_CIDR="10.0.0.0/8"   # adjust to your office or VPN range

sudo nft add table inet filter
sudo nft 'add chain inet filter input { type filter hook input priority 0 ; policy accept ; }'
sudo nft add rule inet filter input ip saddr $TRUSTED_CIDR tcp dport { 6333, 6334 } accept
sudo nft list ruleset

进一步加固可参考本系列的 API 密钥、TLS 和 Nginx 安全篇。

升级 Qdrant

两种安装方式升级时都应保留存储卷,因此集合与快照继续存在:

# Docker
export QDRANT_VERSION=$(curl -s https://api.github.com/repos/qdrant/qdrant/releases/latest | jq -r .tag_name)
docker pull qdrant/qdrant:${QDRANT_VERSION}  # https://github.com/qdrant/qdrant/releases
docker stop qdrant && docker rm qdrant
docker run -d --name qdrant --restart unless-stopped \
  -p 6333:6333 -p 6334:6334 \
  -v /var/lib/qdrant/storage:/qdrant/storage \
  qdrant/qdrant:${QDRANT_VERSION}

# Native .deb
cd /tmp
curl -fL -o "qdrant_${QDRANT_VERSION#v}-1_amd64.deb" \
  "https://github.com/qdrant/qdrant/releases/download/${QDRANT_VERSION}/qdrant_${QDRANT_VERSION#v}-1_amd64.deb"
sudo apt install -y "./qdrant_${QDRANT_VERSION#v}-1_amd64.deb"
sudo systemctl restart qdrant

故障排查

Failed to create snapshots temp directory

原生服务启动前未创建 /var/lib/qdrant/snapshots。创建目录,将所有权设为 qdrant:qdrant,再重启服务。

加载集合时 WAL 文件 PermissionDenied

原生 qdrant 用户无法读取先前 Docker 以 root 身份创建的文件。可使用新的空存储目录,或在启动服务前运行 sudo chown -R qdrant:qdrant /var/lib/qdrant 修正所有权。

journalctl 中没有容器日志

日志驱动在创建容器时写入。配置好 /etc/docker/daemon.json 后,删除并重建对应容器,使新设置生效。

Avatar photo

关于 木子

Email: muzi@vip.rockylinux.cn 微信:VebinLee QQ: 2306867585
Founder of the Rocky Linux Chinese community, MVP、VMware vExpert、TVP, advocate for cloud native technologies, with over ten years of experience in site reliability engineering (SRE) and the DevOps field. Passionate about Cloud Computing、Microservices、CI&CD、DevOps、Kubernetes, currently dedicated to promoting and implementing Rocky Linux in Chinese-speaking regions.
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇