DEV Community

Cover image for Deploying Qdrant Open-Source Vector Database for AI Applications on Ubuntu 24.04
Sanskriti Harmukh for Vultr

Posted on with Aashish Chaurasiya • Originally published at docs.vultr.com

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

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
Enter fullscreen mode Exit fullscreen mode

2. Generate a strong API key:

$ openssl rand -hex 32
Enter fullscreen mode Exit fullscreen mode

Save the value for the .env file.

3. Create the environment file:

$ nano .env
Enter fullscreen mode Exit fullscreen mode
DOMAIN=qdrant.example.com
LETSENCRYPT_EMAIL=admin@example.com
QDRANT_API_KEY=PASTE_GENERATED_KEY_HERE
Enter fullscreen mode Exit fullscreen mode

Deploy with Docker Compose

1. Create the Compose manifest:

$ nano docker-compose.yaml
Enter fullscreen mode Exit fullscreen mode
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
Enter fullscreen mode Exit fullscreen mode

2. Start the services and tail logs:

$ docker compose up -d
$ docker compose ps
$ docker compose logs --tail=50
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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"
      }
    }'
Enter fullscreen mode Exit fullscreen mode

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"}}
      ]
    }'
Enter fullscreen mode Exit fullscreen mode

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
    }'
Enter fullscreen mode Exit fullscreen mode

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)