Skip to main content

Overview

Qdrant is an open-source (Apache-2.0) vector database for similarity search and retrieval-augmented generation. This template deploys a single Qdrant 1.18 server with persistent storage, REST and gRPC APIs, optional API-key authentication, and scheduled platform volume snapshots. There is no feature gating — everything in the upstream open-source build is available.

Architecture

  • Qdrant server — A single-replica stateful workload ({release}-qdrant) serving the REST API and the built-in web dashboard on port 6333, and the gRPC API on port 6334.
  • Persistent data — One volume set mounted at /qdrant/data holding collections, segments, HNSW indexes, the write-ahead log, and Qdrant’s own logical snapshots. Both durable directories live on the same volume, so a snapshot you create through the API survives restarts and redeployments.
  • Authentication (optional) — API keys come from a dictionary secret you create yourself and reference by name. A read-only key can be wired alongside the primary key.

What Gets Created

  • Stateful Qdrant Workload — A single replica serving REST on 6333 and gRPC on 6334.
  • Volume Set — Persistent storage at /qdrant/data with scheduled snapshots and a final snapshot on delete.
  • Identity — An identity bound to the workload, used to read the API-key secret.
  • Policy (only when auth.secretName is set)reveal on exactly that one secret and nothing else.
This template does not create a GVC. You must deploy it into an existing GVC.

Prerequisites

A default install has no prerequisites — Qdrant needs no database, cache, or object store, and backups use platform volume snapshots rather than a cloud account or bucket. If you want authentication (required before you can enable public access), create a dictionary secret first and reference it by name in auth.secretName:
  • api-key — the primary key; full read and write access.
  • read-only-api-key — optional, only needed when auth.readOnlyKey: true.
Installing with publicAccess.enabled: true and an empty auth.secretName fails at render time. An internet-reachable vector database without a key would expose every collection to anyone who finds the endpoint, so the chart refuses to render that combination — create the secret first.
Install the template using your preferred method:

UI

Browse, install, and manage templates visually

CLI

Manage templates from your terminal

Terraform

Declare templates in your Terraform configurations

Pulumi

Declare templates in your Pulumi programs

Configuration

The default values.yaml for this template:

Image and resources

  • image — The Qdrant server image. Pin a concrete tag.
  • resources.minCpu / resources.maxCpu / resources.minMemory / resources.maxMemory — CPU reservation and limit, memory reservation and limit for the Qdrant container.
Memory is the sizing constraint. Vectors and their HNSW graphs are held in RAM unless a collection is explicitly created with on_disk vectors or index, so size roughly as vectors × dimensions × 4 bytes × 1.5 — about 1.8 GiB for 200,000 vectors at 1536 dimensions. Raise maxMemory before loading a large collection.

Storage

  • volumeset.capacity — Initial volume size in GiB. The platform minimum is 10, and the chart rejects anything smaller at render time.
The single volume at /qdrant/data holds storage/ (collections, segments, HNSW indexes, WAL) and snapshots/ (Qdrant’s own logical snapshots). Keeping both on the volume is deliberate: the upstream defaults place snapshots on the container’s ephemeral layer, where they would be lost on every restart.

Backup

Backups are platform volume snapshots of the data volume — no cloud account, bucket, or IAM policy is required.
  • backup.enabled — When true (default), the volume set takes snapshots on backup.schedule.
  • backup.schedule — Cron expression in UTC. Hourly is the platform maximum frequency.
  • backup.retention — How long each snapshot is kept (for example 7d, 720h, 30d).
The volume set is also configured to take a final snapshot when it is deleted, retained for backup.retention. That final snapshot is taken regardless of backup.enabled — setting it to false disables scheduled snapshots only. These platform snapshots are independent of Qdrant’s own collection snapshots, which you create through the API and which live on the same volume.

Authentication

  • auth.secretName — Name of your prerequisite dictionary secret. Empty (the default) leaves the API unauthenticated, which is permitted only while publicAccess.enabled is false.
  • auth.readOnlyKey — When true, also wires the read-only-api-key entry from the same secret. Setting it without auth.secretName fails at render time.
Clients authenticate with an api-key header. The read-only key can search, scroll, and read collections, but write operations are rejected with 403 Forbidden: Global manage access is required. Qdrant’s health paths (/healthz, /livez, /readyz) stay reachable without a key so the platform probes keep working with authentication on. /metrics is not exempt — it returns 401 without a key.

Service

  • service.dashboard — Serves Qdrant’s built-in web UI at /dashboard. The static shell of that UI loads without a key even when authentication is on (its API calls do not), so set this to false on any publicly exposed instance.
  • service.maxRequestSizeMb — Maximum POST body size in MB. An over-size upsert is rejected immediately with HTTP 400 and the message JSON payload (N bytes) is larger than allowed (limit: M bytes). — nothing is partially written.
  • service.telemetryDisabled — When true (default), Qdrant sends no anonymous usage reports upstream.

Access

  • publicAccess.enabled — When true, the REST API (and the dashboard, if enabled) is served over HTTPS on the automatically assigned *.cpln.app canonical endpoint. gRPC always stays internal. Requires auth.secretName. When false (default), external requests to the canonical hostname are refused with 403 RBAC: access denied.
  • internalAccess.type — Internal firewall scope of the workload:
  • internalAccess.workloads — Workload links (//gvc/GVC_NAME/workload/WORKLOAD_NAME), used only with workload-list.

Connecting

The canonical hostname appears under status.canonicalEndpoint (cpln workload get {release}-qdrant -o yaml). Public traffic is HTTPS at the platform edge; same-GVC traffic is plain HTTP and gRPC carried over the mesh’s own mTLS.

Python client — disable TLS for in-GVC calls

qdrant-client silently switches to TLS as soon as an api_key is supplied. Against the internal endpoint, which speaks plain HTTP and gRPC, the call then hangs instead of failing cleanly — the symptom is a gRPC DEADLINE_EXCEEDED. Pass https=False (or use explicit http:// URLs) for any client running inside the GVC.

Using Qdrant with Other Templates

Qdrant is the retrieval tier of a RAG stack, and every other component reaches it over internal GVC DNS with no public exposure. Deploy them into the same GVC and wire them by hostname: A retrieval service running in the GVC embeds with Ollama, stores in Qdrant, and generates through LiteLLM:
Open WebUI can also use Qdrant as its vector store instead of the bundled Chroma, via the environment variables VECTOR_DB=qdrant, QDRANT_URI=http://{release}-qdrant.{gvc}.cpln.local:6333, and QDRANT_API_KEY. The open-webui template does not expose these as values yet — set them on the deployed workload.

Important Notes

  • Public access requires an API key. Installing with publicAccess.enabled: true and an empty auth.secretName fails at render time. Create the dictionary secret first.
  • In-GVC clients must disable TLS. qdrant-client turns TLS on automatically when an api_key is set and then hangs against the internal endpoint; the symptom is a gRPC DEADLINE_EXCEEDED. Pass https=False or use plain http:// URLs.
  • The /dashboard shell loads without an API key (its API calls do not). Set service.dashboard: false when Qdrant is publicly exposed.
  • Single replica by design. Data survives restarts and upgrades on the volume set, but any upgrade or reschedule is a real outage of roughly 60–90 seconds — measured at 79 seconds with 313 consecutive failed requests — not a blip. Budget about 2.5 minutes for a configuration change to roll fully, and plan writes around it. Qdrant’s distributed mode is supported upstream but requires stable per-peer addressing that this version does not implement; there is no replicas knob.
  • Over-size requests return HTTP 400, not 413. A body larger than service.maxRequestSizeMb is rejected outright and no points are written — batch large upserts or raise the limit.
  • Uninstall deletes the volume set. A final snapshot is retained for backup.retention, and your own API-key secret is left untouched.
  • Memory is the sizing constraint. Vectors and HNSW graphs stay in RAM unless a collection is created with on_disk vectors or index. Raise resources.maxMemory before loading large collections.

External References

Qdrant Documentation

Official Qdrant documentation

Security and API Keys

API-key authentication and read-only key behavior

Collections and Indexing

Create collections, choose distance metrics, and tune HNSW

Snapshots

Qdrant’s own collection snapshot and restore API

Memory Consumption

Sizing guidance for vectors, indexes, and on-disk storage

Qdrant Template

View the source files, default values, and chart definition