Skip to content

Qdrant

Qdrant 1.18 vector database — similarity search for embeddings (RAG, recommendations, semantic search). Runs as a single node, or as a distributed cluster when you add replicas. Secured with an API key and reachable only over your private network by default.

Configuration

yaml
services:
  vectors:
    package: qdrant

That's a complete single-node setup — the API key is auto-generated on the first managed apply and reused forever after. To pin your own key (for example from an environment variable):

yaml
services:
  vectors:
    package: qdrant
    config:
      api_key: "${QDRANT_API_KEY}"

To run a cluster, add replicas:

yaml
services:
  vectors:
    package: qdrant
    replicas: 2   # 3 nodes total: the first peer + 2 joining peers

Parameters

ParameterRequiredDefaultDescription
api_keyYesauto-generatedThe key clients must send in the api-key header
replicasNo0Additional cluster nodes beyond the first
versionNo1.18.3Qdrant release to install. The default installs checksum-verified; other versions download unverified
bind_publicNofalseListen on all interfaces instead of the private/overlay IP. A footgun — only enable if you know the ports are firewalled
keep_daily_backupsNo5Number of daily backups to retain
keep_weekly_backupsNo1Number of weekly backups to retain
keep_monthly_backupsNo1Number of monthly backups to retain

Connection

Qdrant serves HTTP (REST + JSON) on 6333 and gRPC on 6334, bound to the private/overlay address so only your other servers can reach it. Every request carries the API key in the api-key header:

bash
curl -H "api-key: $QDRANT_API_KEY" http://<private-ip>:6333/collections

The official client libraries take the same key:

python
from qdrant_client import QdrantClient
client = QdrantClient(host="<private-ip>", port=6333, api_key="...")

The auto-generated key is stored with your project's state and shown (masked) in the dashboard's Configuration panel for the service.

Clustering

Set replicas and managed apply grows the service into a real distributed cluster:

  • The first node is the cluster's founding peer. Its configuration never changes when nodes join, so scale-ups don't restart it.
  • Each new node installs Qdrant, then bootstraps into the cluster through the first peer over the private/overlay network (consensus and node-to-node traffic ride port 6335, which is opened between the service's own nodes only).
  • All nodes serve the full API on 6333/6334 with the same API key — requests to any node are routed to the right shard internally.

Spreading data across nodes

Where your data lives is decided per collection, when you create it. A collection created with defaults keeps all its data on one node. To replicate and shard:

bash
curl -X PUT -H "api-key: $QDRANT_API_KEY" -H "Content-Type: application/json" \
  -d '{"vectors": {"size": 1536, "distance": "Cosine"}, "replication_factor": 2, "shard_number": 6}' \
  http://<any-node>:6333/collections/documents
  • replication_factor: 2 keeps two copies of every shard, so the collection survives a node going down.
  • shard_number splits the collection so it can outgrow a single machine. Pick roughly nodes × 2 at creation time — it can't be changed cheaply later.

Checking the cluster

bash
managed service vectors check-cluster

Shows how many peers the cluster has versus how many it should have, this node's consensus role, and any pending operations. The dashboard also charts a Cluster peers gauge and every node's health.

Cluster limitations

  • Backups are single-node only. In cluster mode the daily backup skips (one node's files are not a complete backup) and restore refuses to run. Use replication_factor: 2+ for redundancy.
  • Removing nodes is manual. Scaling replicas down removes the servers, but the cluster remembers the departed peers; check-cluster will show them missing. Move or re-replicate their shards first, then remove the peers via Qdrant's cluster API.
  • A cluster needs the private/overlay network — nodes must be able to reach each other. managed apply sets this up automatically when the servers support it.

Backups

On a single node, a full backup runs every 24 hours: Qdrant is paused for a moment while its data directory is streamed to object storage as a compressed archive — a byte-exact, consistent copy — then started again. Retention follows the daily/weekly/monthly scheme (see the parameters above).

bash
managed service vectors backup            # take a backup now (brief pause)
managed service vectors backup-list       # list what's in storage
managed service vectors restore --arg confirm=yes

Restore replaces everything in Qdrant with the backup contents — it previews what it will do and requires the confirm=yes argument. If the download fails mid-restore, the original data is put back untouched.

Commands

CommandDescription
managed service <name> statusServer status and collection list
managed service <name> check-clusterCluster membership and consensus health
managed service <name> backupBack up now (single-node only; brief pause)
managed service <name> backup-listList available backups in storage
managed service <name> restoreRestore from the latest (or specified) backup

Ports

PortProtocolOpen toPurpose
6333tcpprivate networksHTTP API (REST + JSON)
6334tcpprivate networksgRPC API
6335tcpthis service's nodes onlyCluster consensus & node-to-node transfer

How it works

The service installs the official static Qdrant binary from GitHub releases — checksum-verified for the default version — and runs it under systemd as the unprivileged qdrant user. The API key is handed to the process through a root-only environment file, never on a command line or in a world-readable config. Telemetry is disabled.

Distributed mode is always on: a lone node runs as a 1-peer cluster. That keeps every declared port really listening, and it means adding replicas later grows the cluster without touching the first node.

Where the data lives

Qdrant keeps everything in /var/lib/qdrant on the server (storage/ for collections, snapshots/ for snapshots). managed installs onto whatever disk layout the server already has — on OVH bare metal, set up Storage & RAID before the first apply.