{"id":49440200,"url":"https://github.com/ganochenkodg/qdrant-operator","last_synced_at":"2026-04-29T19:35:55.519Z","repository":{"id":214457691,"uuid":"736573663","full_name":"ganochenkodg/qdrant-operator","owner":"ganochenkodg","description":"Kubernetes operator for Qdrant","archived":false,"fork":false,"pushed_at":"2024-02-24T07:04:16.000Z","size":19646,"stargazers_count":27,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-02-25T07:35:37.854Z","etag":null,"topics":["database","kubernetes","neural-network","neural-search","operator","question-answering","rag","search-engine","similarity-search","vector-database"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ganochenkodg.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-12-28T09:17:46.000Z","updated_at":"2024-02-25T07:35:37.854Z","dependencies_parsed_at":"2024-02-05T02:43:51.573Z","dependency_job_id":"21926fd2-f803-4389-94ff-48301ce1fb36","html_url":"https://github.com/ganochenkodg/qdrant-operator","commit_stats":null,"previous_names":["ganochenkodg/qdrant-operator"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/ganochenkodg/qdrant-operator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ganochenkodg%2Fqdrant-operator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ganochenkodg%2Fqdrant-operator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ganochenkodg%2Fqdrant-operator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ganochenkodg%2Fqdrant-operator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ganochenkodg","download_url":"https://codeload.github.com/ganochenkodg/qdrant-operator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ganochenkodg%2Fqdrant-operator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32441408,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T18:12:22.909Z","status":"ssl_error","status_checked_at":"2026-04-29T18:11:33.322Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","kubernetes","neural-network","neural-search","operator","question-answering","rag","search-engine","similarity-search","vector-database"],"created_at":"2026-04-29T19:35:54.378Z","updated_at":"2026-04-29T19:35:55.510Z","avatar_url":"https://github.com/ganochenkodg.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp style=\"text-align:center;\" align=\"center\"\u003e\n  \u003cimg src=\"resources/logo.png\" width=\"200\"/\u003e\u003c/a\u003e  \n\u003c/p\u003e\n\n\u003ch4 align=\"center\"\u003eKubernetes operator for the \u003ca href=\"https://github.com/qdrant/qdrant\" target=\"_blank\"\u003eQdrant\u003c/a\u003e Vector Database.\u003c/h4\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#-key-features\"\u003eKey Features\u003c/a\u003e •\n  \u003ca href=\"#-installation\"\u003eInstallation\u003c/a\u003e •\n  \u003ca href=\"#-quickstart\"\u003eQuickstart\u003c/a\u003e •\n  \u003ca href=\"#-security\"\u003eSecurity\u003c/a\u003e •\n  \u003ca href=\"#-backups\"\u003eBackups\u003c/a\u003e •\n  \u003ca href=\"#-documentation\"\u003eDocumentation\u003c/a\u003e •\n  \u003ca href=\"#-demo-application\"\u003eDemo application\u003c/a\u003e\n\u003c/p\u003e\n\n![screenshot](resources/qdrant-operator.gif)\n\n## 🎯 Key features\n\nThe operator provides the following functionality:\n\n- Creation of single-node and multi-node Qdrant clusters, cluster scaling.\n- Authentication support in the cluster using API keys with read-write and read-only permissions. Auto-generated and user-provided keys are supported.\n- TLS Encryption support for connections, both for client and peer-to-peer communication. Auto-generated and user-provided certificates are supported.\n- Support for setting custom Qdrant parameters.\n- Support for setting various scheduling options for the cluster (tolerations, affinities, topology spread).\n- Management of Qdrant collections, including configuration of replication, sharding, indexing, quantization, etc.\n- The operator works in cluster mode with leader elections, ensuring high availability.\n- The operator allows to create instant and scheduled snapshots and store them in any S3-compatible storage.\n\n### 🔨 Installation\n\nTo run the operator you need Kubernetes version 1.26+.\n\nThe operator includes two custom resources - `QdrantCluster` and `QdrantCollection`. Install the CRDs by running the commands below:\n\n```bash\nkubectl apply -f https://raw.githubusercontent.com/ganochenkodg/qdrant-operator/main/deploy/crds/crd-qdrantcluster.yaml\nkubectl apply -f https://raw.githubusercontent.com/ganochenkodg/qdrant-operator/main/deploy/crds/crd-qdrantcollection.yaml\n```\n\nYou will see the next output:\n\n```console\ncustomresourcedefinition.apiextensions.k8s.io/qdrantclusters.qdrant.operator created\ncustomresourcedefinition.apiextensions.k8s.io/qdrantcollections.qdrant.operator created\n```\n\nInstall the operator by running the command below:\n\n```bash\nkubectl apply -f https://raw.githubusercontent.com/ganochenkodg/qdrant-operator/main/deploy/operator.yaml\n```\n\n```console\nnamespace/qdrant-operator created\nserviceaccount/qdrant-operator-sa created\nclusterrole.rbac.authorization.k8s.io/qdrant-operator-role created\nclusterrolebinding.rbac.authorization.k8s.io/qdrant-operator-rolebinding created\nconfigmap/qdrant-operator-config created\ndeployment.apps/qdrant-operator created\n```\n\nWait for operator's readiness:\n\n```bash\nkubectl wait pods -l app=qdrant-operator --for condition=Ready --timeout=300s -n qdrant-operator\n```\n\nAnd check operator's logs to ensure it is working:\n\n```bash\nkubectl logs deploy/qdrant-operator -n qdrant-operator\n```\n\n```console\nFound 3 pods, using pod/qdrant-operator-6577f85799-ggkgm\n1/14/2024, 3:58:40 PM: Debug mode ON!\n1/14/2024, 3:58:40 PM: Status of \"qdrant-operator-6577f85799-ggkgm\": FOLLOWER. Trying to get leader status...\n1/14/2024, 3:58:41 PM: Status of \"qdrant-operator-6577f85799-ggkgm\": LEADER.\n1/14/2024, 3:58:41 PM: Watching QdrantClusters API.\n1/14/2024, 3:58:41 PM: Watching QdrantCollections API.\n```\n\n### ⚡ Quickstart\n\nDeploy your first Qdrant cluster by applying the minimal QdrantCluster custom resource:\n\n```bash\ncat \u003c\u003cEOF | kubectl apply -f -\napiVersion: qdrant.operator/v1alpha1\nkind: QdrantCluster\nmetadata:\n  name: my-cluster\nspec:\n  replicas: 1\n  image: qdrant/qdrant:v1.7.4\nEOF\n```\n\n```console\nqdrantcluster.qdrant.operator/my-cluster created\n```\n\nCheck operator's logs to ensure cluster is running now:\n\n```console\n1/14/2024, 3:59:24 PM: Received event in phase ADDED.\n1/14/2024, 3:59:25 PM: The cluster \"my-cluster\" status now is Pending.\n1/14/2024, 3:59:25 PM: ConfigMap \"my-cluster\" is not available. Creating...\n1/14/2024, 3:59:25 PM: ConfigMap \"my-cluster\" was successfully created!\n1/14/2024, 3:59:25 PM: Service \"my-cluster-headless\" is not available. Creating...\n1/14/2024, 3:59:25 PM: Service \"my-cluster-headless\" was successfully created!\n1/14/2024, 3:59:26 PM: Service \"my-cluster\" is not available. Creating...\n1/14/2024, 3:59:26 PM: Service \"my-cluster\" was successfully created!\n1/14/2024, 3:59:26 PM: StatefulSet \"my-cluster\" is not available. Creating...\n1/14/2024, 3:59:26 PM: StatefulSet \"my-cluster\" was successfully created!\n1/14/2024, 3:59:31 PM: Cluster \"my-cluster\" is not ready: 0/1 are available.\n1/14/2024, 3:59:36 PM: Cluster \"my-cluster\" is not ready: 0/1 are available.\n1/14/2024, 3:59:41 PM: Cluster \"my-cluster\" is ready!\n1/14/2024, 3:59:41 PM: The cluster \"my-cluster\" status now is Running.\n```\n\nThere are two mandatory parameters - `replicas` and `image`. You can check minimal and complete YAML manifests in the [examples](examples) folder.\n\nBy default there are no replication, resources, data persistence and scheduling options configured.\n\nNow create your first vector [collection](https://qdrant.tech/documentation/concepts/collections/):\n\n```bash\ncat \u003c\u003cEOF | kubectl apply -f -\napiVersion: qdrant.operator/v1alpha1\nkind: QdrantCollection\nmetadata:\n  name: my-collection\nspec:\n  cluster: my-cluster\n  vectorSize: 10\nEOF\n```\n\n```console\nqdrantcollection.qdrant.operator/my-collection created\n```\n\nCheck logs:\n\n```console\n1/14/2024, 4:01:43 PM: Received event in phase ADDED.\n1/14/2024, 4:01:43 PM: Trying to create a Collection \"my-collection\" in the Cluster \"my-cluster\"...\n1/14/2024, 4:01:44 PM: Status: \"\"ok\"\", time: \"0.311443\".\n```\n\nThere are two mandatory parameters - `cluster` with the cluster reference and `vectorSize`. Minimal and complete manifests are also stored in the [examples](examples) folder.\n\nBy default disk storage is not configured and will use global cluster parameters, and shards number and replication factor are configured to `1` both.\n\n### 🔒 Security\n\nYou can enable traffic encryption for client connections and between Qdrant nodes using the `spec.tls.enabled` option. \nYou can provide your own certificates (`spec.tls.secretName`) or use those generated by the operator.\n\n```yaml\napiVersion: qdrant.operator/v1alpha1\nkind: QdrantCluster\n...\nspec:\n  ...\n  tls:\n    enabled: true\n    # secretName: your-certs-secret\n```\n\nAuthentication is supported using API keys and read-only API keys. The parameters can be 'false', 'true' (operator generates keys), or 'your-own-custom-key'.\n\n```yaml\napiVersion: qdrant.operator/v1alpha1\nkind: QdrantCluster\n...\nspec:\n  apikey: 'true'\n  readApikey: 'readoperationskey123'\n```\n\n### 💾 Backups\n\nThe operator allows you to create instant and scheduled snapshots of collections, storing data in S3 buckets (various cloud providers are supported). \nUse the `spec.snapshots` option.\n\n```yaml\napiVersion: qdrant.operator/v1alpha1\nkind: QdrantCollection\n...\nspec:\n  ...\n  snapshots:\n    s3EndpointURL: https://storage.googleapis.com/\n    # s3EndpointURL: https://s3.amazonaws.com\n    s3CredentialsSecretName: your-credentials-secret\n    bucketName: your-bucket-for-snapshots\n    # backupNow: true\n    backupSchedule: \"0 0 * * *\"\n    # restoreSnapshotName: clustername/collectionname/2024-01-01-23-59\n```\n\nEnsure to replace placeholders `your-credentials-secret` and `your-bucket-for-snapshots` with your actual secret name and bucket name.\n\n### 🤖 Demo application\n\n![demo](resources/demo2.gif)\n\nCheck the [demo-app](demo-app/README.md) folder to see a simple demo application that allows you to upload PDF documents to Qdrant and answer questions about the contents of the file. \nThe demo application does not rely on paid APIs from well-known services (such as Google Vertex AI or OpenAI). \n\n### 📖 Documentation\n\nGuides:\n\n- [TLS usage](docs/tls.md)\n- [Authentication](docs/authentication.md)\n- [Cluster architecture](docs/architecture.md)\n- [QdrantClusters API reference](docs/qdrantclusters-api.md)\n- [QdrantCollections API reference](docs/qdrantcollections-api.md)\n- [Backup and Restore](docs/backup-restore.md)\n\nYAML examples:\n\n- [Minimal Qdrant cluster](examples/qdrant-cluster-minimal.yaml)\n- [Qdrant cluster with authentication](examples/qdrant-cluster-apikey.yaml)\n- [Qdrant cluster with TLS](examples/qdrant-cluster-tls.yaml)\n- [Complete Qdrant cluster](examples/qdrant-cluster-complete.yaml)\n- [Minimal Qdrant collection](examples/qdrant-collection-minimal.yaml)\n- [Qdrant collection with replication](examples/qdrant-collection-replication.yaml)\n- [Qdrant collection with snapshots](examples/qdrant-collection-snapshot.yaml)\n- [Complete Qdrant collection](examples/qdrant-collection-complete.yaml)\n\n### ⭐ Give a Star! \n\nDo you like this project? Support it by **giving a star**!\n\n### ❓ Help and contribution.\n\nIf you encounter any issues while using Qdrant-operator, you can get help using [Github issues](https://github.com/ganochenkodg/qdrant-operator/issues). \nIf you want to help out with a code contribution, check the [Contribution guideline](./CONTRIBUTING.md).\n\n## License\n\nThis project is licensed under the [MIT](./LICENSE) license.\n\n## Disclaimer of Warranty\n\nPlease note that the Qdrant operator currently is under development and new releases might contain bugs and breaking changes. The operator is not affiliated with [Qdrant](https://github.com/qdrant/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fganochenkodg%2Fqdrant-operator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fganochenkodg%2Fqdrant-operator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fganochenkodg%2Fqdrant-operator/lists"}