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
statefulworkload ({release}-qdrant) serving the REST API and the built-in web dashboard on port6333, and the gRPC API on port6334. - Persistent data — One volume set mounted at
/qdrant/dataholding 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
6333and gRPC on6334. - Volume Set — Persistent storage at
/qdrant/datawith 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.secretNameis set) —revealon 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 inauth.secretName:
api-key— the primary key; full read and write access.read-only-api-key— optional, only needed whenauth.readOnlyKey: true.
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 defaultvalues.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.
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.
/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— Whentrue(default), the volume set takes snapshots onbackup.schedule.backup.schedule— Cron expression in UTC. Hourly is the platform maximum frequency.backup.retention— How long each snapshot is kept (for example7d,720h,30d).
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 whilepublicAccess.enabledisfalse.auth.readOnlyKey— Whentrue, also wires theread-only-api-keyentry from the same secret. Setting it withoutauth.secretNamefails at render time.
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 tofalseon any publicly exposed instance.service.maxRequestSizeMb— Maximum POST body size in MB. An over-size upsert is rejected immediately with HTTP 400 and the messageJSON payload (N bytes) is larger than allowed (limit: M bytes).— nothing is partially written.service.telemetryDisabled— Whentrue(default), Qdrant sends no anonymous usage reports upstream.
Access
publicAccess.enabled— Whentrue, the REST API (and the dashboard, if enabled) is served over HTTPS on the automatically assigned*.cpln.appcanonical endpoint. gRPC always stays internal. Requiresauth.secretName. Whenfalse(default), external requests to the canonical hostname are refused with403 RBAC: access denied.internalAccess.type— Internal firewall scope of the workload:
internalAccess.workloads— Workload links (//gvc/GVC_NAME/workload/WORKLOAD_NAME), used only withworkload-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
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:
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: trueand an emptyauth.secretNamefails at render time. Create the dictionary secret first. - In-GVC clients must disable TLS.
qdrant-clientturns TLS on automatically when anapi_keyis set and then hangs against the internal endpoint; the symptom is a gRPCDEADLINE_EXCEEDED. Passhttps=Falseor use plainhttp://URLs. - The
/dashboardshell loads without an API key (its API calls do not). Setservice.dashboard: falsewhen 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
replicasknob. - Over-size requests return HTTP 400, not 413. A body larger than
service.maxRequestSizeMbis 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_diskvectors or index. Raiseresources.maxMemorybefore 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