{"id":167996,"date":"2026-05-27T00:28:44","date_gmt":"2026-05-26T21:28:44","guid":{"rendered":"https:\/\/computingforgeeks.com\/?p=167996"},"modified":"2026-05-27T00:28:44","modified_gmt":"2026-05-26T21:28:44","slug":"install-qdrant-ubuntu","status":"publish","type":"post","link":"https:\/\/computingforgeeks.com\/install-qdrant-ubuntu\/","title":{"rendered":"Install Qdrant on Ubuntu 26.04 \/ 24.04 \/ 22.04"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Qdrant is the open source vector database that powers retrieval at scale for AI applications. This guide walks through installing Qdrant on Ubuntu LTS, covering both the Docker path most teams use and the native .deb path when you need a system service without Docker. The same steps apply to Ubuntu 26.04, 24.04, and 22.04, with version-aware commands for each.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By the end you will have Qdrant running, the REST API responding, the built in Web UI loaded in a browser, and a first collection holding a few vectors so you can confirm search works. We tested every command in this guide on a fresh Ubuntu 24.04 LTS VM. Companion code lives at <a href=\"https:\/\/github.com\/c4geeks\/qdrant\/tree\/main\/install-ubuntu\" rel=\"noopener\" target=\"_blank\" rel=\"noreferrer noopener\">c4geeks\/qdrant\/install-ubuntu<\/a>, and the canonical reference for any flag in this article is the <a href=\"https:\/\/qdrant.tech\/documentation\/\" rel=\"noopener\" target=\"_blank\">official Qdrant documentation<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you are new to vector databases as a category, our <a href=\"https:\/\/computingforgeeks.com\/vector-search-vs-traditional-search-why-ai-driven-search-is-the-future\/\">vector search vs traditional search<\/a> explainer walks through why dense retrieval beats keyword matching for fuzzy intent queries. If you are weighing Qdrant against a Postgres extension, the <a href=\"https:\/\/computingforgeeks.com\/install-pgvector-postgresql-linux\/\">install pgvector on PostgreSQL<\/a> walkthrough sets up the other end of the self host spectrum.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Before you begin<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You will need the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ubuntu 26.04, 24.04, or 22.04 LTS server with at least 2 GB of RAM. The official Docker image runs on amd64 and arm64.<\/li>\n\n\n<li>A user account with <code>sudo<\/code> rights.<\/li>\n\n\n<li>Network access to <code>github.com<\/code> (release downloads) and <code>download.docker.com<\/code> (Docker repo).<\/li>\n\n\n<li>Two free TCP ports: <code>6333<\/code> (REST and Web UI) and <code>6334<\/code> (gRPC).<\/li>\n\n\n<li>Roughly 1 GB of disk for the image plus whatever your dataset needs in <code>\/var\/lib\/qdrant\/storage<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Refresh the package index so the rest of the steps run cleanly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install -y ca-certificates curl jq<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Method 1: Install Qdrant with Docker<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Docker is the recommended install path for almost every Qdrant deployment. The image is the same one the maintainers ship to production, so what runs on your laptop is what runs in the cluster.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Install the Docker engine<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Add the Docker apt repository and install the engine plus the Compose plugin:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo install -m 0755 -d \/etc\/apt\/keyrings\nsudo curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg \\\n  -o \/etc\/apt\/keyrings\/docker.asc\nsudo chmod a+r \/etc\/apt\/keyrings\/docker.asc\n\n. \/etc\/os-release\necho \"deb [arch=$(dpkg --print-architecture) signed-by=\/etc\/apt\/keyrings\/docker.asc] \\\n  https:\/\/download.docker.com\/linux\/ubuntu ${VERSION_CODENAME} stable\" \\\n  | sudo tee \/etc\/apt\/sources.list.d\/docker.list >\/dev\/null\n\nsudo apt update\nsudo apt install -y docker-ce docker-ce-cli containerd.io \\\n  docker-buildx-plugin docker-compose-plugin<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add your user to the <code>docker<\/code> group so you do not need <code>sudo<\/code> for routine commands. Log out and back in for the group change to take effect:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo usermod -aG docker $USER\ndocker --version\ndocker compose version<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Detect the latest Qdrant release and pull the image<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pull a specific Qdrant tag so your environment is reproducible. Capture the latest release tag into a shell variable, then use it everywhere:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export QDRANT_VERSION=$(curl -s https:\/\/api.github.com\/repos\/qdrant\/qdrant\/releases\/latest | jq -r .tag_name)\necho $QDRANT_VERSION\n\ndocker pull qdrant\/qdrant:${QDRANT_VERSION}  # https:\/\/github.com\/qdrant\/qdrant\/releases<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: Run Qdrant with persistent storage<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Create a host directory for the vector data, bind it into the container at the canonical <code>\/qdrant\/storage<\/code> path, and start the service:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir -p \/var\/lib\/qdrant\/storage\n\ndocker run -d \\\n  --name qdrant \\\n  --restart unless-stopped \\\n  -p 6333:6333 -p 6334:6334 \\\n  -v \/var\/lib\/qdrant\/storage:\/qdrant\/storage:z \\\n  qdrant\/qdrant:${QDRANT_VERSION}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Confirm the container is running and the ports are bound:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps --filter name=qdrant --format \"table {{.Names}}\\t{{.Status}}\\t{{.Ports}}\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The output should show the container in the <code>Up<\/code> state with both REST and gRPC ports mapped to the host:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"920\" height=\"800\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/01-docker-install-wm.png\" alt=\"Terminal showing Qdrant Docker pull and run commands\" class=\"wp-image-167990\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/01-docker-install-wm.png 920w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/01-docker-install-wm-300x261.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/01-docker-install-wm-768x668.png 768w\" sizes=\"auto, (max-width: 920px) 100vw, 920px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4: Verify the install<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Qdrant exposes three quick endpoints to confirm the service is alive, ready to serve queries, and on the expected version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -sf http:\/\/localhost:6333\/healthz\ncurl -s http:\/\/localhost:6333\/ | jq .\ncurl -s http:\/\/localhost:6333\/readyz<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">You should see the health probe pass, the version response confirm the running tag, and readiness report that the shards are loaded:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"920\" height=\"800\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/02-health-check-wm.png\" alt=\"Terminal output of Qdrant healthz and version endpoints\" class=\"wp-image-167991\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/02-health-check-wm.png 920w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/02-health-check-wm-300x261.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/02-health-check-wm-768x668.png 768w\" sizes=\"auto, (max-width: 920px) 100vw, 920px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Step 5: Create your first collection and search<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A collection holds points (your vectors plus their metadata). Create one called <code>demo<\/code> with four dimensional vectors and cosine distance, then upsert three sample points:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -s -X PUT http:\/\/localhost:6333\/collections\/demo \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\"vectors\":{\"size\":4,\"distance\":\"Cosine\"}}'\n\ncurl -s -X PUT http:\/\/localhost:6333\/collections\/demo\/points \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\n    \"points\": [\n      {\"id\":1, \"vector\":[0.1,0.2,0.3,0.4], \"payload\":{\"city\":\"Nairobi\"}},\n      {\"id\":2, \"vector\":[0.2,0.3,0.4,0.5], \"payload\":{\"city\":\"Berlin\"}},\n      {\"id\":3, \"vector\":[0.9,0.8,0.7,0.6], \"payload\":{\"city\":\"Tokyo\"}}\n    ]\n  }'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now run a similarity search. The vector closest to the query gets the highest score:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -s -X POST http:\/\/localhost:6333\/collections\/demo\/points\/search \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\"vector\":[0.15,0.25,0.35,0.45],\"limit\":3,\"with_payload\":true}' \\\n  | jq .<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Berlin lands first, Nairobi second, Tokyo last because its vector points the other way. This is your end to end sanity check that ingest, index, and query all work:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"920\" height=\"800\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/03-first-search-wm.png\" alt=\"Terminal output of first vector search returning Berlin Nairobi Tokyo\" class=\"wp-image-167992\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/03-first-search-wm.png 920w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/03-first-search-wm-300x261.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/03-first-search-wm-768x668.png 768w\" sizes=\"auto, (max-width: 920px) 100vw, 920px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Step 6: Open the built in Web UI<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every Qdrant container ships with a browser based UI at <code>\/dashboard<\/code>. Open <code>http:\/\/&lt;server-ip&gt;:6333\/dashboard<\/code> in a browser. The Collections panel lists the <code>demo<\/code> collection you just created, with status, point count, and vector config:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1366\" height=\"768\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/04-web-ui-collections-wm.png\" alt=\"Qdrant Web UI showing demo collection with 3 points and GREEN status\" class=\"wp-image-167993\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/04-web-ui-collections-wm.png 1366w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/04-web-ui-collections-wm-300x169.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/04-web-ui-collections-wm-1024x576.png 1024w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/04-web-ui-collections-wm-768x432.png 768w\" sizes=\"auto, (max-width: 1366px) 100vw, 1366px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Click <strong>Console<\/strong> in the sidebar to run REST calls directly from the browser. Useful for quick experiments and onboarding teammates who do not have curl in their muscle memory:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1366\" height=\"768\" src=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/05-web-ui-console-wm.png\" alt=\"Qdrant Web UI Console panel showing REST API examples\" class=\"wp-image-167994\" title=\"\" srcset=\"https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/05-web-ui-console-wm.png 1366w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/05-web-ui-console-wm-300x169.png 300w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/05-web-ui-console-wm-1024x576.png 1024w, https:\/\/computingforgeeks.com\/wp-content\/uploads\/2026\/05\/05-web-ui-console-wm-768x432.png 768w\" sizes=\"auto, (max-width: 1366px) 100vw, 1366px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Docker Compose alternative<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you prefer Compose, the equivalent setup with an API key and a memory limit fits in one file. Save this as <code>docker-compose.yml<\/code> next to a <code>.env<\/code> that defines <code>QDRANT_VERSION<\/code> and <code>QDRANT_API_KEY<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services:\n  qdrant:\n    image: qdrant\/qdrant:${QDRANT_VERSION}  # https:\/\/github.com\/qdrant\/qdrant\/releases\n    container_name: qdrant\n    restart: unless-stopped\n    ports:\n      - \"6333:6333\"\n      - \"6334:6334\"\n    volumes:\n      - .\/qdrant_storage:\/qdrant\/storage:z\n      - .\/qdrant_snapshots:\/qdrant\/snapshots:z\n    environment:\n      QDRANT__SERVICE__API_KEY: ${QDRANT_API_KEY}\n      QDRANT__TELEMETRY_DISABLED: \"true\"\n    deploy:\n      resources:\n        limits:\n          memory: 4G<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Generate a strong API key and bring the stack up:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"QDRANT_VERSION=${QDRANT_VERSION}\" > .env\necho \"QDRANT_API_KEY=$(openssl rand -base64 32)\" >> .env\n\ndocker compose up -d\ndocker compose logs -f --tail=20 qdrant<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Every subsequent curl now needs the <code>api-key<\/code> header:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -s http:\/\/localhost:6333\/collections \\\n  -H \"api-key: $(grep QDRANT_API_KEY .env | cut -d= -f2)\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Method 2: Native .deb install with systemd<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The native path drops the Docker layer and lets <code>systemd<\/code> manage Qdrant directly. Use this when your host policy forbids Docker, when you need tighter integration with <code>journalctl<\/code>, or when the rest of your stack uses native packages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Download the official .deb for the latest release. The release page publishes <code>amd64<\/code> and <code>arm64<\/code> packages:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>QDRANT_PKG_VERSION=\"${QDRANT_VERSION#v}\"\ncd \/tmp\ncurl -fL --retry 3 -o \"qdrant_${QDRANT_PKG_VERSION}-1_amd64.deb\" \\\n  \"https:\/\/github.com\/qdrant\/qdrant\/releases\/download\/${QDRANT_VERSION}\/qdrant_${QDRANT_PKG_VERSION}-1_amd64.deb\"  # https:\/\/github.com\/qdrant\/qdrant\/releases\n\nsudo apt install -y \".\/qdrant_${QDRANT_PKG_VERSION}-1_amd64.deb\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Create a dedicated system user and storage directory, then drop a systemd unit:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo useradd -r -s \/sbin\/nologin qdrant\nsudo mkdir -p \/var\/lib\/qdrant\/storage \/etc\/qdrant\nsudo chown -R qdrant:qdrant \/var\/lib\/qdrant<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Write the unit file at <code>\/etc\/systemd\/system\/qdrant.service<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[Unit]\nDescription=Qdrant Vector Database\nAfter=network.target\n\n[Service]\nType=simple\nUser=qdrant\nGroup=qdrant\nWorkingDirectory=\/var\/lib\/qdrant\nExecStart=\/usr\/bin\/qdrant\nRestart=on-failure\nRestartSec=5\nLimitNOFILE=65536\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Reload <code>systemd<\/code>, enable, and start the service:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl daemon-reload\nsudo systemctl enable --now qdrant\nsudo systemctl status qdrant --no-pager\njournalctl -u qdrant -n 20 --no-pager<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The same health endpoint works against the native install:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -sf http:\/\/localhost:6333\/healthz<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Open the firewall safely<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Never expose Qdrant on a public interface without authentication. The default Docker run is open, which is fine on a laptop and dangerous on a VPS. If UFW is enabled, allow REST and gRPC from a trusted CIDR only:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TRUSTED_CIDR=\"10.0.0.0\/8\"   # adjust to your office or VPN range\n\nsudo ufw allow from $TRUSTED_CIDR to any port 6333 proto tcp\nsudo ufw allow from $TRUSTED_CIDR to any port 6334 proto tcp\nsudo ufw reload\nsudo ufw status numbered<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For internet facing deployments, bind Qdrant to <code>127.0.0.1<\/code> and put Nginx with TLS plus an API key in front. The full hardening walkthrough is the next article in this series.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Upgrade Qdrant<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Upgrades are usually a tag swap. With Docker, stop the container, re-detect the latest tag, and recreate. The storage volume persists across the swap:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export QDRANT_VERSION=$(curl -s https:\/\/api.github.com\/repos\/qdrant\/qdrant\/releases\/latest | jq -r .tag_name)\ndocker pull qdrant\/qdrant:${QDRANT_VERSION}  # https:\/\/github.com\/qdrant\/qdrant\/releases\ndocker stop qdrant && docker rm qdrant\ndocker run -d --name qdrant --restart unless-stopped \\\n  -p 6333:6333 -p 6334:6334 \\\n  -v \/var\/lib\/qdrant\/storage:\/qdrant\/storage:z \\\n  qdrant\/qdrant:${QDRANT_VERSION}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With Docker Compose, edit <code>QDRANT_VERSION<\/code> in <code>.env<\/code> and run <code>docker compose pull &amp;&amp; docker compose up -d<\/code>. With the native install, download the new .deb and let <code>apt install<\/code> upgrade in place, then restart the service.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting common issues<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Port 6333 already in use<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If <code>docker run<\/code> fails with <code>bind: address already in use<\/code>, find what is holding the port and either stop it or remap the Qdrant ports:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo ss -ltnp | grep -E ':(6333|6334)\\b'\n\n# Remap if you cannot free the port\ndocker run -d --name qdrant -p 16333:6333 -p 16334:6334 \\\n  -v \/var\/lib\/qdrant\/storage:\/qdrant\/storage:z \\\n  qdrant\/qdrant:${QDRANT_VERSION}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Container restarts in a loop<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Look at the logs first. The most common culprit is a permission error on the bind mount when SELinux or AppArmor labels conflict:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker logs --tail=50 qdrant\nsudo chown -R 1000:1000 \/var\/lib\/qdrant\/storage<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Web UI loads but Collections list is empty<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The Web UI ships empty on a fresh install. Create your first collection through the Console panel or via curl, then click the refresh icon next to the Collections heading.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where to next<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You now have a working Qdrant on Ubuntu, a sample collection, and the Web UI for quick experiments. The series builds outward from here: <strong>secure Qdrant with API key, TLS, and Nginx<\/strong> is the next stop for any host reachable beyond localhost, and the <strong>Qdrant Web UI tour<\/strong> covers every panel in the dashboard. To wire Qdrant into a local LLM pipeline, our <a href=\"https:\/\/computingforgeeks.com\/self-hosted-rag-ollama-pgvector\/\">self hosted RAG with Ollama<\/a> guide pairs naturally with Qdrant as a drop in for the vector store, and the <a href=\"https:\/\/computingforgeeks.com\/ollama-commands-cheat-sheet\/\">Ollama commands cheat sheet<\/a> covers the embedding side.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Install Qdrant on Ubuntu LTS via Docker, Docker Compose, or the native deb plus systemd. Verify, create a first collection, search vectors, open the Web UI.<\/p>\n","protected":false},"author":3,"featured_media":167995,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[39034,461,35913,50,81],"tags":[],"cfg_series":[39865],"class_list":["post-167996","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-databases","category-devops","category-linux-tutorials","category-ubuntu","cfg_series-qdrant-mastery"],"_links":{"self":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/167996","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/comments?post=167996"}],"version-history":[{"count":1,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/167996\/revisions"}],"predecessor-version":[{"id":168128,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/posts\/167996\/revisions\/168128"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media\/167995"}],"wp:attachment":[{"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/media?parent=167996"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/categories?post=167996"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/tags?post=167996"},{"taxonomy":"cfg_series","embeddable":true,"href":"https:\/\/computingforgeeks.com\/wp-json\/wp\/v2\/cfg_series?post=167996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}