[{"data":1,"prerenderedAt":224},["ShallowReactive",2],{"seo-verification":3,"blog-heberger-qdrant-vps-ma-fr":6,"promo-bar-likely":223},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-heberger-qdrant-vps-ma-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":35,"sections":36,"ctaTitle":164,"ctaBody":165,"ctaButton":166,"ctaUrl":167,"relatedPosts":168},65,"heberger-qdrant-vps",{"fr":10,"en":12,"ar":13,"es":14},"hosting-qdrant-on-a-vps","استضافة-qdrant-على-خادم-vps","alojar-qdrant-en-un-vps","Héberger Qdrant sur un VPS","Hébergez Qdrant sur votre VPS : Docker Compose, clé API, TLS, tuning HNSW, quantization, client Python v1, snapshots et monitoring Prometheus.",8,1,false,"2026-04-16T00:00:00+00:00","2026-10-20T23:18:05+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},6,"Bases de données","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-qdrant-vps-poster.svg",{"categorySlug":25,"appSlug":34},"qdrant","Qdrant est une base de données vectorielle écrite en Rust, taillée pour la recherche sémantique, les systèmes de recommandation et les pipelines RAG des applications IA. Légère et rapide, elle s'auto-héberge parfaitement sur un VPS pour garder vos embeddings sous votre contrôle et éviter la facturation au vecteur des services managés.\n\nCe guide couvre l'intégralité du chemin : installation avec Docker Compose, sécurisation par clé API et reverse proxy TLS, insertion de vecteurs en Python avec le client officiel v1, optimisation de l'index HNSW et de la quantization, sauvegarde par snapshots et monitoring via l'endpoint `\u002Fmetrics` compatible Prometheus. Les VPS SSD NVMe de ServOrbit démarrent à 99 DH\u002Fmois et couvrent un corpus de moins d'un million de vecteurs sans configuration particulière.",[37,41,51,67,70,82,97,100,124,128,135,150,153,161],{"type":38,"title":39,"body":40},"h2","Pourquoi auto-héberger Qdrant sur un VPS","Qdrant stocke et interroge des vecteurs d'embeddings pour trouver les éléments les plus proches sémantiquement : c'est la brique de recherche au cœur des chatbots RAG, des moteurs de recommandation et de la recherche en langage naturel. Écrite en Rust, elle est rapide et économe en ressources, ce qui la rend idéale à héberger sur un VPS plutôt que de payer un service vectoriel managé facturé au vecteur stocké.\n\nL'auto-hébergement est essentiel pour les applications IA traitant des données sensibles : vos embeddings, souvent dérivés de documents internes confidentiels, ne quittent jamais votre infrastructure. Vous maîtrisez aussi la latence, déterminante quand chaque requête utilisateur déclenche une recherche vectorielle, et vous évitez les limites de débit des API tierces lors des montées en charge.",{"type":42,"title":43,"items":44},"ul","Pré-requis et ressources VPS recommandées",[45,46,47,48,49,50],"RAM : minimum 1 Go pour tester, 2 Go pour quelques centaines de milliers de vecteurs, 4–8 Go au-delà du million de vecteurs en haute dimension (l'index HNSW vit en mémoire).","Stockage : 20–50 Go de SSD NVMe pour persister les collections et les snapshots.","CPU : 1–2 vCPU suffisent pour un trafic modéré ; ajoutez des cœurs si vous indexez en continu.","Docker et Docker Compose installés sur le VPS.","Port 6333 (REST) et 6334 (gRPC) accessibles depuis votre application ; 80\u002F443 pour le reverse proxy public.","Un enregistrement DNS A (ex. `vectors.mondomaine.com`) si vous exposez l'API en HTTPS.",{"type":52,"title":53,"steps":54},"steps","Installer Qdrant avec Docker Compose",[55,58,61,64],{"title":56,"body":57},"Créer le répertoire et le fichier compose.yml","Sur le VPS, créez un dossier dédié : `mkdir -p \u002Fopt\u002Fqdrant && cd \u002Fopt\u002Fqdrant`. Créez le fichier `compose.yml` suivant :\n\n```yaml\nservices:\n  qdrant:\n    image: qdrant\u002Fqdrant:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:6333:6333\"\n      - \"127.0.0.1:6334:6334\"\n    volumes:\n      - .\u002Fqdrant_storage:\u002Fqdrant\u002Fstorage\n    environment:\n      - QDRANT__SERVICE__API_KEY=${QDRANT_API_KEY}\n```\n\nLier les ports à `127.0.0.1` empêche toute exposition directe sur Internet ; seul le reverse proxy y accède.",{"title":59,"body":60},"Générer la clé API et démarrer le conteneur","Créez le fichier `.env` avec votre clé :\n\n```bash\necho \"QDRANT_API_KEY=$(openssl rand -hex 32)\" > .env\n```\n\nDémarrez Qdrant :\n\n```bash\ndocker compose up -d\n```",{"title":62,"body":63},"Vérifier la santé de l'instance","Attendez quelques secondes puis vérifiez l'endpoint de santé :\n\n```bash\ncurl -s http:\u002F\u002Flocalhost:6333\u002Fhealthz\n# Attendu : {\"title\":\"qdrant - vector search engine\",\"version\":\"...\"}\n```",{"title":65,"body":66},"Créer votre première collection","Créez une collection de test avec des vecteurs de dimension 384 (format typique de `all-MiniLM-L6-v2`) :\n\n```bash\ncurl -s -X PUT http:\u002F\u002Flocalhost:6333\u002Fcollections\u002Ftest \\\n  -H 'Content-Type: application\u002Fjson' \\\n  -H \"api-key: $(grep QDRANT_API_KEY .env | cut -d= -f2)\" \\\n  -d '{\"vectors\":{\"size\":384,\"distance\":\"Cosine\"}}'\n```",{"type":38,"title":68,"body":69},"Sécuriser l'accès : clé API et TLS","Qdrant n'active aucune authentification par défaut : une instance exposée sans clé API permettrait à n'importe qui de lire, modifier ou supprimer toutes vos collections. La variable d'environnement `QDRANT__SERVICE__API_KEY` est la première ligne de défense ; le reverse proxy avec TLS est la seconde.\n\nPour Caddy, la configuration minimale est :\n\n```\nvectors.mondomaine.com {\n    reverse_proxy localhost:6333\n}\n```\n\nCaddy obtient et renouvelle automatiquement le certificat Let's Encrypt. Pour nginx, ajoutez dans votre bloc server :\n\n```nginx\nlocation \u002F {\n    proxy_pass http:\u002F\u002F127.0.0.1:6333;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n}\n```\n\nActivez TLS avec Certbot : `certbot --nginx -d vectors.mondomaine.com`.",{"type":52,"title":71,"steps":72},"Tester l'authentification et le reverse proxy",[73,76,79],{"title":74,"body":75},"Vérifier que l'accès sans clé est refusé","```bash\ncurl -s https:\u002F\u002Fvectors.mondomaine.com\u002Fcollections\n# Attendu : {\"status\":{\"error\":\"Unauthorized\",...}}\n```",{"title":77,"body":78},"Appel authentifié avec la clé API","```bash\ncurl -s https:\u002F\u002Fvectors.mondomaine.com\u002Fcollections \\\n  -H \"api-key: VOTRE_CLE\"\n# Attendu : {\"result\":{\"collections\":[]},\"status\":\"ok\",...}\n```",{"title":80,"body":81},"Vérifier le certificat TLS","```bash\ncurl -sv https:\u002F\u002Fvectors.mondomaine.com\u002Fhealthz 2>&1 | grep 'SSL connection\\|issuer'\n# Attendu : lignes confirmant Let's Encrypt et TLS 1.3\n```",{"type":52,"title":83,"steps":84},"Créer une collection et insérer des vecteurs avec le client Python v1",[85,88,91,94],{"title":86,"body":87},"Installer le client officiel","```bash\npip install qdrant-client>=1.7\n```",{"title":89,"body":90},"Connexion avec clé API","```python\nfrom qdrant_client import QdrantClient\n\nclient = QdrantClient(\n    url=\"https:\u002F\u002Fvectors.mondomaine.com\",\n    api_key=\"VOTRE_CLE\",\n)\n```",{"title":92,"body":93},"Créer une collection avec VectorParams","```python\nfrom qdrant_client.models import Distance, VectorParams\n\nclient.recreate_collection(\n    collection_name=\"documents\",\n    vectors_config=VectorParams(size=384, distance=Distance.COSINE),\n)\n```\n\n`size` doit correspondre à la dimension des embeddings de votre modèle. `Distance.COSINE` convient pour la majorité des modèles de phrase (sentence transformers).",{"title":95,"body":96},"Insérer des points avec payload et interroger","```python\nfrom qdrant_client.models import PointStruct\n\n# Insérer des vecteurs\nclient.upsert(\n    collection_name=\"documents\",\n    points=[\n        PointStruct(\n            id=1,\n            vector=[0.1, 0.2, ...],  # vecteur de taille 384\n            payload={\"title\": \"Guide Qdrant\", \"lang\": \"fr\"},\n        ),\n    ],\n)\n\n# Rechercher les 5 plus proches voisins\nresults = client.search(\n    collection_name=\"documents\",\n    query_vector=[0.1, 0.21, ...],\n    limit=5,\n    with_payload=True,\n)\nfor r in results:\n    print(r.score, r.payload)\n```",{"type":38,"title":98,"body":99},"Optimiser les performances : tuning HNSW","L'algorithme HNSW (Hierarchical Navigable Small World) est le cœur de la recherche rapide dans Qdrant. Trois paramètres gouvernent le compromis vitesse\u002Fprécision\u002Fmémoire.",{"type":101,"title":102,"headers":103,"rows":108},"comparison","Paramètres HNSW clés",[104,105,106,107],"Paramètre","Valeur par défaut","Plage recommandée","Impact",[109,114,119],[110,111,112,113],"m","16","16–64","Connexions par nœud — plus élevé = recall supérieur, plus de RAM",[115,116,117,118],"ef_construct","100","100–400","Qualité de la construction de l'index — plus élevé = index de qualité supérieure, construction plus lente",[120,121,122,123],"ef","128 (à la requête)","64–512","Qualité de la recherche — plus élevé = recall supérieur, requête plus lente",{"type":125,"title":126,"body":127},"tip","Configurer HNSW à la création de la collection","Passez les paramètres HNSW directement dans `recreate_collection` :\n\n```python\nfrom qdrant_client.models import HnswConfigDiff\n\nclient.recreate_collection(\n    collection_name=\"documents\",\n    vectors_config=VectorParams(size=384, distance=Distance.COSINE),\n    hnsw_config=HnswConfigDiff(m=32, ef_construct=200),\n)\n```\n\nPour une recherche équilibrée sur un corpus de 500 000 vecteurs, `m=32` et `ef_construct=200` offrent un bon recall (>0,97) sans surcharger la RAM. Augmentez `ef` à la requête pour les cas où la précision prime sur la latence.",{"type":42,"title":129,"items":130},"Réduire l'empreinte mémoire : quantization scalaire et binaire",[131,132,133,134],"**Quantization scalaire (uint8)** : compresse chaque coordonnée float32 (4 octets) en uint8 (1 octet), soit une réduction de RAM d'environ 4×. Légère perte de précision compensée par l'oversampling. Activez-la avec `ScalarQuantizationConfig(type=ScalarType.INT8, quantile=0.99, always_ram=True)`.","**Quantization binaire** : va jusqu'à 32× de réduction en binarisant chaque dimension. Idéale pour des modèles entraînés pour la quantization binaire (ex. Cohere `embed-english-v3.0`). Plus rapide mais recall plus faible sans oversampling.","**Paramètre `on_disk`** : stockez les vecteurs originaux sur disque (`on_disk=True`) et ne gardez en RAM que l'index quantifié. Indispensable sur un VPS à mémoire contrainte.","**Oversampling** : avec `oversampling=2.0` à la requête, Qdrant récupère 2× plus de candidats depuis l'index quantifié puis les rerange avec les vecteurs originaux — recall proche du full-precision pour un coût modéré.",{"type":52,"title":136,"steps":137},"Sauvegarder et restaurer avec les snapshots Qdrant",[138,141,144,147],{"title":139,"body":140},"Créer un snapshot d'une collection","```bash\ncurl -s -X POST https:\u002F\u002Fvectors.mondomaine.com\u002Fcollections\u002Fdocuments\u002Fsnapshots \\\n  -H \"api-key: VOTRE_CLE\"\n# Retourne le nom du snapshot : {\"result\":{\"name\":\"documents-...-...\",\"creation_time\":\"...\"}}\n```",{"title":142,"body":143},"Lister les snapshots disponibles","```bash\ncurl -s https:\u002F\u002Fvectors.mondomaine.com\u002Fcollections\u002Fdocuments\u002Fsnapshots \\\n  -H \"api-key: VOTRE_CLE\"\n```",{"title":145,"body":146},"Télécharger le snapshot","```bash\ncurl -O https:\u002F\u002Fvectors.mondomaine.com\u002Fcollections\u002Fdocuments\u002Fsnapshots\u002FNOM_DU_SNAPSHOT \\\n  -H \"api-key: VOTRE_CLE\"\n```\n\nCopiez ensuite le fichier `.snapshot` vers un stockage objet (ex. Scaleway Object Storage, Backblaze B2) pour une sauvegarde hors site.",{"title":148,"body":149},"Restaurer depuis un snapshot","```bash\ncurl -s -X PUT https:\u002F\u002Fvectors.mondomaine.com\u002Fcollections\u002Fdocuments\u002Fsnapshots\u002Fupload \\\n  -H \"api-key: VOTRE_CLE\" \\\n  -H 'Content-Type: multipart\u002Fform-data' \\\n  -F snapshot=@documents-snapshot.snapshot\n```\n\nLa collection est recréée à partir du snapshot avec toutes ses données et sa configuration HNSW d'origine.",{"type":125,"title":151,"body":152},"Monitoring avec Prometheus et Grafana","Qdrant expose un endpoint `\u002Fmetrics` au format Prometheus sur le port 6333. Les métriques utiles pour la production : `app_requests_total` (débit), `app_requests_duration_seconds` (latence p50\u002Fp99), `collection_vector_count` (taille du corpus) et les erreurs gRPC.\n\nAjoutez la cible dans votre `prometheus.yml` :\n\n```yaml\nscrape_configs:\n  - job_name: qdrant\n    static_configs:\n      - targets: ['localhost:6333']\n    metrics_path: \u002Fmetrics\n    bearer_token: VOTRE_CLE\n```\n\nSous Grafana, importez le dashboard communautaire Qdrant (ID 18278) pour visualiser la latence p99 et le taux d'erreur en temps réel.",{"type":42,"title":154,"items":155},"Dépannage courant",[156,157,158,159,160],"**Connection refused sur le port 6333** : vérifiez que le conteneur tourne (`docker compose ps`) et que le port n'est pas bloqué par `ufw` — `ufw allow from 127.0.0.1 to any port 6333`. Si le port est lié à `0.0.0.0` au lieu de `127.0.0.1`, corrigez le `compose.yml` et relancez.","**Erreur OOM (Out of Memory) \u002F conteneur tué** : réduisez `ef_construct` (ex. 100 → 64) ou activez la quantization scalaire pour diminuer l'empreinte RAM de l'index. Activez `on_disk: true` pour les vecteurs originaux. Vérifiez la consommation réelle avec `docker stats qdrant`.","**Lenteur au démarrage ou au premier chargement** : l'index HNSW est chargé depuis le disque au premier accès. Utilisez un SSD NVMe (pas un disque rotatif) et préchauffez la collection après démarrage avec une requête de recherche vide.","**Unauthorized 403** : la clé API passée dans le header `api-key` ne correspond pas à `QDRANT__SERVICE__API_KEY`. Vérifiez l'absence d'espaces ou de sauts de ligne dans la variable d'environnement.","**Recall dégradé après activation de la quantization binaire** : augmentez `oversampling` à `3.0` ou `4.0` et activez `rescore=True` pour reranker les candidats avec les vecteurs originaux.",{"type":38,"title":162,"body":163},"Associer Qdrant à Ollama pour une stack RAG entièrement autonome","Faites tourner Ollama sur le même VPS pour la génération des embeddings (`ollama pull mxbai-embed-large`) et l'inférence (`ollama pull llama3.1:8b`). Votre pipeline RAG fonctionne alors de bout en bout sans aucun appel d'API externe : question de l'utilisateur → embedding Ollama → recherche Qdrant → fragments top-k → génération Ollama → réponse fondée sur les faits.\n\nAjoutez LiteLLM en frontal pour exposer à votre application un endpoint unifié compatible avec l'API OpenAI — et changez de modèle sans modifier une seule ligne de code. Un VPS avec 8 Go de RAM héberge confortablement Qdrant + Ollama (modèle 7B quantifié) + LiteLLM pour un corpus de quelques centaines de milliers de vecteurs.","Lancez votre base vectorielle Qdrant pour l'IA","Le VPS Cloud ServOrbit offre la mémoire et les disques SSD qu'il faut pour héberger Qdrant et alimenter vos pipelines RAG et vos moteurs de recherche sémantique, avec SSL et authentification sous votre contrôle.","Déployer sur VPS Cloud","\u002Fvps-cloud",[169,187,205],{"id":170,"slug":171,"slugs":172,"title":176,"excerpt":177,"readTime":178,"views":18,"isPinned":19,"noindex":19,"publishedAt":179,"updatedAt":180,"category":181,"categories":182,"featuredImage":30,"bgImage":31,"posterImage":184,"relatedSolution":185},56,"heberger-postgresql-vps",{"fr":171,"en":173,"ar":174,"es":175},"postgresql-on-a-vps-a-reliable-and-controlled-database","postgresql-على-خادم-vps-قاعدة-بيانات-موثوقة-ومتحكم-بها","alojar-postgresql-en-un-vps","PostgreSQL sur VPS : base fiable et contrôlée","Hébergez PostgreSQL sur VPS : configuration prod, sauvegardes pgBackRest, haute disponibilité streaming, comparatif RDS\u002FSupabase\u002FNeon et dépannage OOM.",9,"2026-04-25T00:00:00+00:00","2026-10-21T15:21:37+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[183],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-postgresql-vps-poster.svg",{"categorySlug":25,"appSlug":186},"postgresql-stack",{"id":188,"slug":189,"slugs":190,"title":194,"excerpt":195,"readTime":178,"views":196,"isPinned":19,"noindex":19,"publishedAt":197,"updatedAt":198,"category":199,"categories":200,"featuredImage":30,"bgImage":31,"posterImage":202,"relatedSolution":203},57,"heberger-mysql-vps",{"fr":189,"en":191,"ar":192,"es":193},"hosting-mysql-on-a-vps","استضافة-mysql-على-خادم-vps","alojar-mysql-en-un-vps","Héberger MySQL sur un VPS : guide complet","Installez MySQL 8.4 LTS sur un VPS : prérequis, sécurisation, performances InnoDB, accès distant sécurisé, sauvegardes automatisées et dépannage.",0,"2026-04-24T00:00:00+00:00","2026-11-09T20:55:18+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[201],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-mysql-vps-poster.svg",{"categorySlug":25,"appSlug":204},"mysql-stack",{"id":206,"slug":207,"slugs":208,"title":212,"excerpt":213,"readTime":214,"views":196,"isPinned":19,"noindex":19,"publishedAt":215,"updatedAt":216,"category":217,"categories":218,"featuredImage":30,"bgImage":31,"posterImage":220,"relatedSolution":221},58,"heberger-redis-vps",{"fr":207,"en":209,"ar":210,"es":211},"hosting-redis-on-a-vps","استضافة-redis-على-خادم-vps","alojar-redis-en-un-vps","Héberger Redis sur un VPS : guide complet","Déployez Redis sur votre VPS Cloud : prérequis RAM\u002FCPU, sécurité (ACL, TLS), persistance RDB\u002FAOF, dépannage et haute disponibilité.",10,"2026-04-23T00:00:00+00:00","2026-09-08T21:59:59+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[219],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-redis-vps-poster.svg",{"categorySlug":25,"appSlug":222},"redis-stack",true,1794270730582]