Skip to main content

Command Palette

Search for a command to run...

Deploying Qdrant Open-Source Vector Database for AI Applications on Ubuntu 24.04

Step-by-step guide to deploy Qdrant with Docker Compose and Traefik on Ubuntu 24.04, with API-key authentication and automatic HTTPS for vector similarity search.

Updated
3 min read
Deploying Qdrant Open-Source Vector Database for AI Applications on Ubuntu 24.04
S
A Developer Advocate with a focus on improving the developer experience through clear communication, technical enablement, and community engagement.
A
DevOps Engineer with experience in Kubernetes, automation, cloud infrastructure, and observability. I work in Developer Relations, contribute to technical documentation, and collaborate on engineering-focused projects.

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, following vector database deployment practices documented in Vultr Docs.


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.


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.

The Self-Hosted Stack

Part 1 of 50

The Self-Hosted Stack is a developer-focused series exploring open-source tools you can deploy, run, and manage on your own infrastructure. From AI platforms and databases to developer tools, observability stacks, and authentication systems, each guide walks through deploying production-ready open-source software on Vultr cloud infrastructure.