[{"data":1,"prerenderedAt":192},["ShallowReactive",2],{"seo-verification":3,"blog-self-host-questdb-vps-fr":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-self-host-questdb-vps-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":20,"publishedAt":21,"updatedAt":22,"category":23,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":130,"ctaBody":131,"ctaButton":132,"ctaUrl":133,"relatedPosts":134},568,"self-host-questdb-vps",{"fr":10,"en":12,"ar":13,"es":14},"self-host-questdb-vps-time-series-database","استضافة-questdb-على-vps-قاعدة-سلاسل-زمنية","autoalojar-questdb-vps-base-series-temporales","QuestDB sur VPS : base de séries temporelles en SQL","Installez QuestDB sur un VPS : une base de séries temporelles open source qui ingère vite et s'interroge en SQL, avec console web et API REST.",7,0,false,true,"2026-11-06T00:00:00+00:00","2026-11-08T01:13:02+00:00",{"id":17,"name":24,"slug":25,"color":26,"icon":27},"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":17,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-questdb-vps-poster.svg",{"categorySlug":34,"appSlug":35},"bases-de-donnees","questdb","Des mesures horodatées, on en produit partout : capteurs, temps de réponse d'une API, cours de marché, événements d'une application. Les ranger dans une base relationnelle classique fonctionne au début, puis les tables grossissent et les agrégats par heure deviennent lents. QuestDB est une base de données de séries temporelles open source (licence Apache-2.0) conçue pour ce cas : elle reçoit les données en continu et les rend interrogeables tout de suite en SQL. Ce guide l'installe sur un VPS avec Docker Compose, la protège par mot de passe, y envoie des données depuis curl et Python, puis couvre l'interrogation, l'import CSV, la rétention et la sauvegarde.",[38,42,52,83,86,102,106,109,112,115,118,121,124,127],{"type":39,"title":40,"body":41},"h2","Pourquoi une base de séries temporelles","Une série temporelle est une suite de valeurs datées : la température d'une sonde toutes les dix secondes, le nombre de commandes par minute. On l'écrit beaucoup, on la modifie rarement, et on l'interroge presque toujours par intervalle de temps.\n\nQuestDB est construit autour de cet usage. Chaque table a une colonne de temps désignée et se découpe en partitions (par jour ou par heure), ce qui garde rapides les requêtes sur une période et rend la suppression des anciennes données immédiate. Son SQL reste du SQL, enrichi de quelques mots-clés propres au temps.",{"type":43,"title":44,"items":45},"ul","Ce que QuestDB apporte",[46,47,48,49,50,51],"**SQL des séries temporelles** — `SAMPLE BY`, `LATEST ON` et `ASOF JOIN` en plus du SQL standard.","**Ingestion continue** — InfluxDB Line Protocol sur HTTP, avec des clients officiels pour Python, Go, Java, Node.js, Rust et .NET.","**Console web** — éditeur SQL, import de CSV par glisser-déposer, graphiques des résultats.","**API REST** — requêtes, import et export CSV en HTTP.","**Protocole PostgreSQL** — vos pilotes et outils PostgreSQL habituels.","**Partitions de temps** — requêtes rapides sur une période, suppression des anciennes données en une commande.",{"type":53,"title":54,"headers":55,"rows":58},"comparison","QuestDB face à une table PostgreSQL classique",[5,56,57],"QuestDB","PostgreSQL seul",[59,63,67,71,75,79],[60,61,62],"Conçu pour","Mesures horodatées en continu","Données relationnelles générales",[64,65,66],"Agréger par intervalle","SAMPLE BY 1h","date_trunc et GROUP BY",[68,69,70],"Dernière valeur par série","LATEST ON","Sous-requête ou DISTINCT ON",[72,73,74],"Aligner deux flux dans le temps","ASOF JOIN","Jointure latérale à écrire",[76,77,78],"Supprimer l'historique ancien","DROP PARTITION","DELETE puis VACUUM",[80,81,82],"Ingestion","Line Protocol, CSV, SQL","SQL et COPY",{"type":39,"title":84,"body":85},"Prérequis","Un VPS Ubuntu 24.04 avec 2 Go de RAM au minimum et 20 Go de disque, Docker et le plugin Compose installés, et un nom (sous-domaine) qui pointe vers le VPS pour le HTTPS. QuestDB tourne sur la JVM : prévoyez 4 Go de RAM si vous ingérez beaucoup de données ou lancez de grosses requêtes.",{"type":87,"title":88,"steps":89},"steps","Installer QuestDB avec Docker Compose",[90,93,96,99],{"title":91,"body":92},"Préparer le répertoire et le mot de passe","Créez le répertoire de l'application et un fichier `.env` qui porte le mot de passe de l'utilisateur `admin`.\n```bash\nmkdir -p \u002Fopt\u002Fquestdb && cd \u002Fopt\u002Fquestdb\necho \"ADMIN_PASSWORD=$(openssl rand -hex 16)\" > .env\nchmod 600 .env\n```",{"title":94,"body":95},"Écrire le docker-compose.yml","Les ports ne sont publiés que sur la boucle locale : seul nginx atteint la console et l'API. `QDB_HTTP_USER` et `QDB_HTTP_PASSWORD` protègent toute l'API HTTP, `QDB_PG_PASSWORD` remplace le mot de passe d'usine du protocole PostgreSQL. L'ingestion sur TCP, sans authentification en version open source, est coupée, et `QDB_TELEMETRY_ENABLED` désactive la télémétrie anonyme.\n```yaml\nservices:\n  questdb:\n    image: questdb\u002Fquestdb:10.1.0\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:9000:9000\"\n      - \"127.0.0.1:8812:8812\"\n    environment:\n      QDB_HTTP_USER: \"admin\"\n      QDB_HTTP_PASSWORD: \"${ADMIN_PASSWORD}\"\n      QDB_PG_USER: \"admin\"\n      QDB_PG_PASSWORD: \"${ADMIN_PASSWORD}\"\n      QDB_LINE_TCP_ENABLED: \"false\"\n      QDB_HTTP_SETTINGS_READONLY: \"true\"\n      QDB_TELEMETRY_ENABLED: \"false\"\n    volumes:\n      - questdb-data:\u002Fvar\u002Flib\u002Fquestdb\n\nvolumes:\n  questdb-data: {}\n```",{"title":97,"body":98},"Démarrer et vérifier","Le démarrage prend quelques secondes. Sans identifiants, l'API répond 401 ; avec, elle renvoie la version installée.\n```bash\ndocker compose up -d\ncurl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' 'http:\u002F\u002F127.0.0.1:9000\u002Fexec?query=SELECT%201'\ncurl -u admin:VOTRE_MOT_DE_PASSE 'http:\u002F\u002F127.0.0.1:9000\u002Fexec?query=SELECT%20build()'\n```",{"title":100,"body":101},"Publier en HTTPS avec nginx","Dans le vhost de votre domaine (certificat obtenu par certbot), proxifiez vers le port local. Relevez `client_max_body_size` pour les imports CSV.\n```nginx\nlocation \u002F {\n    proxy_pass http:\u002F\u002F127.0.0.1:9000;\n    proxy_set_header Host $host;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    client_max_body_size 256m;\n}\n```",{"type":103,"title":104,"body":105},"tip","Sans QDB_HTTP_USER, l'API est ouverte à tous","Sans utilisateur déclaré, QuestDB accepte toute requête HTTP : quiconque connaît l'adresse peut lire vos données **et** créer, modifier ou supprimer des tables en SQL. Gardez l'authentification active, changez le mot de passe d'usine du protocole PostgreSQL, et ne publiez jamais les ports 9000, 8812 ou 9009 directement sur l'IP publique : passez toujours par le reverse proxy HTTPS.",{"type":39,"title":107,"body":108},"Envoyer des données","Le plus simple est l'InfluxDB Line Protocol sur HTTP : une ligne par mesure, avec le nom de la table, des étiquettes et des valeurs. La table et ses colonnes sont créées à la première écriture.\n```bash\ncurl -u admin:VOTRE_MOT_DE_PASSE -X POST \\\n  --data-binary 'capteurs,sonde=s1 temperature=21.5' \\\n  https:\u002F\u002Fvotre-domaine\u002Fwrite\n```\n\nDepuis votre code, un client officiel regroupe les lignes et gère les reprises. En Python, après `pip install questdb` :\n```python\nfrom questdb.ingress import Sender, TimestampNanos\n\nconf = \"https::addr=votre-domaine:443;username=admin;password=VOTRE_MOT_DE_PASSE;\"\nwith Sender.from_conf(conf) as sender:\n    sender.row(\n        \"capteurs\",\n        symbols={\"sonde\": \"s1\"},\n        columns={\"temperature\": 21.5},\n        at=TimestampNanos.now(),\n    )\n```",{"type":39,"title":110,"body":111},"Interroger vos séries en SQL","Dans la console web ou par l'API REST (`\u002Fexec?query=…`), le SQL standard fonctionne, et les extensions de temps évitent les requêtes compliquées.\n```sql\n-- Moyenne horaire par sonde\nSELECT timestamp, sonde, avg(temperature)\nFROM capteurs\nSAMPLE BY 1h;\n\n-- Dernière valeur connue de chaque sonde\nSELECT * FROM capteurs LATEST ON timestamp PARTITION BY sonde;\n```\n\nUn programme qui tourne sur le VPS lui-même peut aussi se connecter par le protocole PostgreSQL sur `127.0.0.1:8812`, base `qdb`, utilisateur `admin` et le même mot de passe.",{"type":39,"title":113,"body":114},"Bien modéliser une table de séries temporelles","La création automatique à la première écriture suffit pour démarrer. Pour une table appelée à durer, déclarez-la vous-même : vous choisissez les types, la colonne de temps et le découpage.\n```sql\nCREATE TABLE capteurs (\n  timestamp TIMESTAMP,\n  sonde SYMBOL,\n  temperature DOUBLE\n) TIMESTAMP(timestamp) PARTITION BY DAY WAL\nDEDUP UPSERT KEYS(timestamp, sonde);\n```\n\nTrois choix comptent. **La colonne de temps désignée** (`TIMESTAMP(...)`) est celle sur laquelle QuestDB trie et partitionne : toutes les extensions de temps s'appuient sur elle. **Le type `SYMBOL`** convient aux étiquettes répétées (nom de sonde, code d'appareil, symbole boursier) : la valeur est stockée une fois et référencée, ce qui économise le disque et accélère les filtres. **Le partitionnement** (`PARTITION BY DAY` ou `HOUR`) se choisit selon le volume : une partition doit rester d'une taille raisonnable, et c'est l'unité que vous supprimerez plus tard.\n\nLa clause `DEDUP UPSERT KEYS` rend l'ingestion idempotente : si un client renvoie la même mesure après une coupure réseau, la ligne est remplacée au lieu d'être dupliquée.",{"type":39,"title":116,"body":117},"Importer et exporter des fichiers CSV","La console accepte les CSV par glisser-déposer. En ligne de commande, `\u002Fimp` importe un fichier dans une table et `\u002Fexp` exporte le résultat d'une requête.\n```bash\ncurl -u admin:VOTRE_MOT_DE_PASSE -F data=@mesures.csv 'https:\u002F\u002Fvotre-domaine\u002Fimp?name=mesures'\ncurl -u admin:VOTRE_MOT_DE_PASSE -G --data-urlencode 'query=SELECT * FROM mesures' https:\u002F\u002Fvotre-domaine\u002Fexp > export.csv\n```",{"type":39,"title":119,"body":120},"Rétention, disque et sauvegarde","Rien n'expire tout seul. Supprimez les partitions anciennes en SQL et planifiez la commande si besoin. Pour une sauvegarde cohérente, figez l'état de la base le temps de copier le volume `questdb-data`.\n```sql\nALTER TABLE capteurs DROP PARTITION\nWHERE timestamp \u003C dateadd('d', -90, now());\n\nCHECKPOINT CREATE;\n-- copiez le volume questdb-data, puis :\nCHECKPOINT RELEASE;\n```",{"type":39,"title":122,"body":123},"Mettre à jour QuestDB","Lisez les notes de version avant de changer de version majeure, puis remplacez le tag de l'image et redémarrez : les données du volume sont conservées.\n```bash\ncd \u002Fopt\u002Fquestdb\n# changez le tag de l'image dans docker-compose.yml, puis :\ndocker compose pull && docker compose up -d\n```",{"type":39,"title":125,"body":126},"Erreurs fréquentes et dépannage","**401 sur chaque requête.** L'utilisateur ou le mot de passe ne correspond pas à `QDB_HTTP_USER` et `QDB_HTTP_PASSWORD`. Vérifiez le contenu du fichier `.env`, puis redémarrez le conteneur après toute modification : les variables ne sont lues qu'au démarrage.\n\n**413 lors d'un import CSV.** Le fichier dépasse la limite de nginx. Relevez `client_max_body_size` dans le vhost, rechargez nginx, ou découpez le fichier.\n\n**Le conteneur redémarre en boucle.** Lisez `docker compose logs questdb`. La cause la plus fréquente est la mémoire : QuestDB tourne sur la JVM et un VPS de 1 Go ne suffit pas. Passez à 2 Go au minimum.\n\n**Le disque se remplit.** Rien n'expire par défaut : planifiez la suppression des anciennes partitions et surveillez la taille du volume `questdb-data` avec `docker system df -v`.\n\n**Une application du VPS n'arrive pas à se connecter en PostgreSQL.** Utilisez `127.0.0.1:8812`, la base `qdb`, l'utilisateur `admin` et le mot de passe du `.env` : le mot de passe d'usine `quest` est refusé.",{"type":39,"title":128,"body":129},"Installation en un clic depuis le Marketplace ServOrbit","Sur un VPS ServOrbit, QuestDB s'installe depuis le Marketplace : le script déploie le conteneur officiel, génère le mot de passe de l'utilisateur `admin`, active l'authentification sur l'API HTTP et le protocole PostgreSQL, coupe la télémétrie et configure nginx en HTTPS, sur un sous-domaine de votre domaine ou sur le sous-domaine gratuit du VPS. Le mot de passe s'affiche dans votre espace client.","Vos séries temporelles sur votre VPS","Un VPS ServOrbit Ubuntu 24.04 avec 2 Go de RAM suffit pour démarrer QuestDB. Installation en un clic depuis le Marketplace, HTTPS sur votre domaine ou sur le sous-domaine gratuit du VPS, mot de passe généré pour vous.","Installer QuestDB","\u002Fapplications\u002Fbases-de-donnees\u002Fquestdb",[135,157,174],{"id":136,"slug":137,"slugs":138,"title":142,"excerpt":143,"readTime":144,"views":18,"isPinned":19,"noindex":19,"publishedAt":145,"updatedAt":146,"category":147,"categories":152,"featuredImage":30,"bgImage":31,"posterImage":154,"relatedSolution":155},64,"heberger-clickhouse-vps",{"fr":137,"en":139,"ar":140,"es":141},"hosting-clickhouse-on-a-vps","استضافة-clickhouse-على-خادم-vps","alojar-clickhouse-en-un-vps","Héberger ClickHouse sur un VPS","Hébergez ClickHouse sur votre VPS : base analytique en colonnes pour vos logs, métriques et dashboards. Guide Docker, tuning mémoire et SSL.",9,"2026-04-17T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":148,"name":149,"slug":34,"color":150,"icon":151},6,"Bases de données","bg-teal-500\u002F10 text-teal-400","database",[153],{"id":148,"name":149,"slug":34,"color":150,"icon":151},"\u002Fblog\u002Fcovers\u002Fheberger-clickhouse-vps-poster.svg",{"categorySlug":34,"appSlug":156},"clickhouse",{"id":158,"slug":159,"slugs":160,"title":164,"excerpt":165,"readTime":148,"views":18,"isPinned":19,"noindex":20,"publishedAt":166,"updatedAt":167,"category":168,"categories":169,"featuredImage":30,"bgImage":31,"posterImage":171,"relatedSolution":172},565,"self-host-greptimedb-vps",{"fr":159,"en":161,"ar":162,"es":163},"self-host-greptimedb-vps-observability-sql","استضافة-greptimedb-على-vps-قاعدة-بيانات-المراقبة","autoalojar-greptimedb-vps-observabilidad-sql","GreptimeDB sur VPS : métriques, logs et traces en SQL","Installez GreptimeDB sur un VPS : une base d'observabilité qui réunit métriques, logs et traces, interrogeables en SQL, en PromQL et depuis Grafana.","2026-11-04T00:00:00+00:00","2026-11-04T16:30:20+00:00",{"id":17,"name":24,"slug":25,"color":26,"icon":27},[170],{"id":17,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-greptimedb-vps-poster.svg",{"categorySlug":34,"appSlug":173},"greptimedb",{"id":175,"slug":176,"slugs":177,"title":181,"excerpt":182,"readTime":144,"views":183,"isPinned":19,"noindex":19,"publishedAt":184,"updatedAt":185,"category":186,"categories":187,"featuredImage":30,"bgImage":31,"posterImage":189,"relatedSolution":190},56,"heberger-postgresql-vps",{"fr":176,"en":178,"ar":179,"es":180},"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.",1,"2026-04-25T00:00:00+00:00","2026-10-21T15:21:37+00:00",{"id":148,"name":149,"slug":34,"color":150,"icon":151},[188],{"id":148,"name":149,"slug":34,"color":150,"icon":151},"\u002Fblog\u002Fcovers\u002Fheberger-postgresql-vps-poster.svg",{"categorySlug":34,"appSlug":191},"postgresql-stack",1794101011489]