Qdrant is an open-source vector database for AI applications, optimised for similarity search over high-dimensional embeddings, with a REST/gRPC API, payload filtering, and a built-in dashboard. This guide deploys Qdrant using Docker Compose with Traefik handling automatic HTTPS, API-key authentication, and a sample collection that runs a similarity search. By the end, you'll have Qdrant serving vector search securely at your domain.
Set Up the Directory Structure
1. Create the project directory:
$ mkdir -p ~/qdrant/data
$ cd ~/qdrant
2. Generate a strong API key:
$ openssl rand -hex 32
Save the value for the .env file.
3. Create the environment file:
$ nano .env
DOMAIN=qdrant.example.com
LETSENCRYPT_EMAIL=admin@example.com
QDRANT_API_KEY=PASTE_GENERATED_KEY_HERE
Deploy with Docker Compose
1. Create the Compose manifest:
$ nano docker-compose.yaml
services:
traefik:
image: traefik:v3.6
container_name: traefik
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--api.dashboard=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL}"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
restart: unless-stopped
qdrant:
image: qdrant/qdrant:v1.17.1
container_name: qdrant
expose:
- "6333"
volumes:
- "./data:/qdrant/storage"
environment:
QDRANT__SERVICE__API_KEY: "${QDRANT_API_KEY}"
labels:
- "traefik.enable=true"
- "traefik.http.routers.qdrant.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.qdrant.entrypoints=websecure"
- "traefik.http.routers.qdrant.tls.certresolver=letsencrypt"
- "traefik.http.services.qdrant.loadbalancer.server.port=6333"
restart: unless-stopped
2. Start the services and tail logs:
$ docker compose up -d
$ docker compose ps
$ docker compose logs --tail=50
Access the Dashboard and Health Endpoint
1. Open https://qdrant.example.com/dashboard and paste the API key when prompted.
2. Confirm the service is ready:
$ curl https://qdrant.example.com/readyz
A response of all shards are ready confirms Qdrant is healthy.
Create a Collection and Run a Similarity Search
1. Export the API key:
$ export QDRANT_API_KEY=YOUR_API_KEY
2. Create a 4-dimensional collection with cosine distance:
$ curl -X PUT "https://qdrant.example.com/collections/star_charts" \
-H "Content-Type: application/json" \
-H "api-key: ${QDRANT_API_KEY}" \
-d '{
"vectors": {
"size": 4,
"distance": "Cosine"
}
}'
3. Insert sample points:
$ curl -X PUT "https://qdrant.example.com/collections/star_charts/points" \
-H "Content-Type: application/json" \
-H "api-key: ${QDRANT_API_KEY}" \
-d '{
"points": [
{"id": 1, "vector": [0.05, 0.61, 0.76, 0.74], "payload": {"colony": "Mars"}},
{"id": 2, "vector": [0.19, 0.81, 0.75, 0.11], "payload": {"colony": "Jupiter"}},
{"id": 3, "vector": [0.36, 0.55, 0.47, 0.94], "payload": {"colony": "Venus"}},
{"id": 4, "vector": [0.18, 0.01, 0.85, 0.80], "payload": {"colony": "Moon"}},
{"id": 5, "vector": [0.24, 0.18, 0.22, 0.44], "payload": {"colony": "Pluto"}}
]
}'
4. Run a similarity search:
$ curl -X POST "https://qdrant.example.com/collections/star_charts/points/search" \
-H "Content-Type: application/json" \
-H "api-key: ${QDRANT_API_KEY}" \
-d '{
"vector": [0.2, 0.1, 0.9, 0.7],
"limit": 3,
"with_payload": true
}'
The top result is the Moon point (cosine ~0.99). The dashboard's Collections tab shows star_charts with a green status and 5 points.
Next Steps
Qdrant is running and serving vector search over HTTPS. From here you can:
- Generate embeddings with OpenAI, Cohere, or Sentence-Transformers and upsert them
- Add payload filters to combine vector similarity with structured criteria
- Snapshot the
data/volume regularly for restore-able backups
For the full guide with additional tips, visit the original article on Vultr Docs.
Top comments (0)