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.
This template does not create a GVC. You must deploy it into an existing GVC.

What Gets Created

Prerequisites

None for a default install. Qdrant needs no database, cache, or object store, and backups use platform volume snapshots rather than a cloud account or bucket. Authentication is optional but strongly recommended, and it is required before you can enable public access. It is driven by a dictionary secret you create yourself and reference by name:
1

Create the API-key secret

Create a dictionary secret with an api-key entry. The read-only-api-key entry is only needed when you set auth.readOnlyKey: true.
  • api-key — the primary key; full read and write access.
  • read-only-api-key — can search, scroll, and read collections; writes are rejected.
Set auth.secretName to this name.
The secret must exist before you install with auth.secretName set. If it does not, the deployment wedges silently: cpln logs returns nothing, and the only place the missing secret is named is status.versions[].message in cpln workload get-deployments RELEASE_NAME-qdrant --gvc GVC_NAME -o yaml. Create the secret and the deployment recovers on its own after a few minutes, or run cpln workload force-redeployment RELEASE_NAME-qdrant --gvc GVC_NAME to skip the wait.

Installation

A default install needs no --set values. To enable authentication, add --set auth.secretName=SECRET_NAME (the secret must already exist).
To install, follow the instructions for 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

Image

Resources

Memory is the sizing constraint. Vectors and their HNSW graphs stay in RAM unless a collection is created with on_disk vectors or index, so raise maxMemory before loading a large collection.

Storage

The chart rejects a capacity below 10 at render time. The single volume at /qdrant/data holds both storage/ (collections, segments, HNSW indexes, WAL) and snapshots/ (Qdrant’s own collection snapshots), so snapshots you create through the API survive restarts and redeployments.

Backup

These are platform volume snapshots of the whole data volume. The volume set also takes a final snapshot when it is deleted, retained for backup.retention, regardless of backup.enabled — setting it to false disables scheduled snapshots only. They are independent of Qdrant’s own collection snapshots, which you create through the API (see Backing Up).

Authentication

Clients authenticate with an api-key header. The read-only key can search, scroll, and read collections; write operations are rejected with 403 Forbidden: Global manage access is required. Qdrant’s health paths (/healthz, /livez, /readyz) stay reachable without a key; /metrics is not exempt and returns 401 without one.

Service

The static shell of the dashboard loads without a key even when authentication is on (its API calls do not), so set service.dashboard: false on any publicly exposed instance.

Access

publicAccess.enabled: true requires auth.secretName; the chart refuses to render without it. gRPC always stays internal.

Connecting

Verify from your machine with a port-forward (works with public access off):
Then, in a second terminal:

Python Client

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. Each address below uses that template’s own release name: A retrieval service running in the GVC embeds with Ollama, stores in Qdrant, and generates through LiteLLM (replace the hostnames with your own release names):
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_NAME-qdrant.GVC_NAME.cpln.local:6333, and QDRANT_API_KEY. The open-webui template does not expose these as values yet — set them on the deployed workload.

Operations

Backing Up

Two different things are called “snapshots”, and they complement each other: Platform volume snapshots (backup.*) are block-level snapshots of the whole data volume, taken on backup.schedule and on delete. List them, or take one on demand:
Qdrant collection snapshots are logical, per-collection archives you create through the REST API. With a port-forward open (see Connecting):
Collection snapshot files are written to /qdrant/data/snapshots/COLLECTION_NAME/ on the data volume, so they survive restarts and are included in platform volume snapshots. Keep a downloaded copy of anything you cannot afford to lose — an uninstall deletes the volume. Qdrant can also take a full-storage snapshot (POST /snapshots), but upstream restores it only through a startup flag that this template does not expose. Use collection snapshots instead.

Restoring a Backup

The procedures below follow the upstream snapshot documentation and the chart’s configured snapshot path. They have not been exercised against a live install of this template.
From a downloaded collection snapshot. Upload the .snapshot file to the server (a fresh install works, as long as it runs the same or the next minor version of Qdrant). priority=snapshot makes the snapshot data win over whatever the target collection currently holds; without it, recovering into an empty collection leaves it empty. With a port-forward open:
From a collection snapshot still on the data volume. Point the recover endpoint at the file’s location under the chart’s snapshot path:
From a platform volume snapshot. This replaces the entire data volume with the snapshot’s contents and restarts the Qdrant replica; anything written after the snapshot is lost. It is issued as a restoreVolume command on the volume set — see the volume set reference. The equivalent CLI form, which has not been exercised on this template, is:

Rotating the API Key

The running replica reads cpln://secret/... references once, at start. After you change the api-key (or read-only-api-key) entry in your dictionary secret, the old key keeps working until the workload restarts — force a redeployment to apply the new one:
Update your clients with the new key at the same time; the restart is a brief outage like any other.

Scaling and Availability

  • Single replica by design. There is no replicas knob: the volume set is per-replica, so a second replica would serve a separate, empty store, and Qdrant’s distributed mode is not part of this version.
  • Upgrades and reschedules are a real outage. Any helm upgrade, configuration change, or reschedule takes the API fully offline until the replacement replica is ready. Plan writes around it. Data, collections, and Qdrant snapshots on the volume survive.
  • Scale vertically. Raise resources.maxMemory before loading a large collection, or have the client create collections with on_disk vectors and index. Changing resources is a helm upgrade, with the outage above.

Troubleshooting

Symptom: cpln helm install fails at render time with qdrant: publicAccess.enabled requires auth.secretName — never expose Qdrant publicly without an API key.Cause: The chart refuses to expose an unauthenticated vector database to the internet.Fix: Create the dictionary secret described in Prerequisites and set auth.secretName to its name, or leave publicAccess.enabled: false.
Symptom: Render fails with qdrant: auth.readOnlyKey requires auth.secretName.Cause: The read-only key is read from the same secret as the primary key, so it cannot be enabled on its own.Fix: Set auth.secretName, and make sure the secret has a read-only-api-key entry.
Symptom: Render fails with qdrant: volumeset.capacity must be at least 10 (GiB, platform minimum).Fix: Set volumeset.capacity to 10 or more.
Symptom: The workload stays not ready and cpln logs returns no lines at all.Cause: The secret named in auth.secretName does not exist, or its api-key (or read-only-api-key) entry is missing. Check status.versions[].message in cpln workload get-deployments RELEASE_NAME-qdrant --gvc GVC_NAME -o yaml — it names the missing secret.Fix: Create the secret with the exact entry names, then wait a few minutes or run cpln workload force-redeployment RELEASE_NAME-qdrant --gvc GVC_NAME.
Symptom: A qdrant-client call from inside the GVC never returns, then fails with DEADLINE_EXCEEDED.Cause: The client enabled TLS automatically because api_key was set, but the internal endpoint speaks plain HTTP and gRPC.Fix: Pass https=False to QdrantClient, or use explicit http:// URLs.
Symptom: Reads work but an upsert, collection create, or delete returns 403 Forbidden: Global manage access is required.Cause: The request used the read-only-api-key.Fix: Use the primary api-key for write operations.
Symptom: A large upsert is rejected with JSON payload (N bytes) is larger than allowed (limit: M bytes). and no points are written.Cause: The request body exceeded service.maxRequestSizeMb (32 MB by default).Fix: Send smaller batches, or raise service.maxRequestSizeMb and run helm upgrade.
Symptom: /healthz, /livez, and /readyz answer without a key, but /metrics returns 401.Cause: Only the health paths are exempt from the API key.Fix: Send the api-key header when scraping /metrics.
Symptom: Requests to the public *.cpln.app hostname are refused with RBAC: access denied.Cause: publicAccess.enabled is false, or it was just switched on and the change has not finished propagating.Fix: Set publicAccess.enabled: true together with auth.secretName, run helm upgrade, and allow a few minutes before retrying.
Symptom: Uploads stall and cpln workload get-deployments RELEASE_NAME-qdrant --gvc GVC_NAME -o yaml shows restarts with reason OOMKilled; nothing is logged by Qdrant itself.Cause: The HNSW index outgrew resources.maxMemory.Fix: Raise resources.maxMemory, or create the collection with vectors.on_disk: true and hnsw_config.on_disk: true — a per-collection client choice, not a template knob.

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; 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. Every upgrade or reschedule takes the API fully offline until the new replica is ready; plan writes around it. There is no replicas knob.
  • Rotating the API key needs a redeployment. The new value is not picked up until you run cpln workload force-redeployment RELEASE_NAME-qdrant --gvc GVC_NAME.
  • Over-size requests return HTTP 400, not 413, and write nothing. Batch large upserts or raise service.maxRequestSizeMb.
  • Two kinds of snapshots. backup.* controls platform volume snapshots; Qdrant’s collection snapshots are created through the API and live on the same volume.
  • Uninstall deletes the volume set. A final snapshot is retained for backup.retention, a reinstall starts empty, 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

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