[{"data":1,"prerenderedAt":187},["ShallowReactive",2],{"seo-verification":3,"blog-self-host-hasura-vps-fr":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-self-host-hasura-vps-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":122,"ctaBody":123,"ctaButton":124,"ctaUrl":125,"relatedPosts":126},505,"self-host-hasura-vps",{"fr":10,"en":12,"ar":13,"es":14},"self-host-hasura-graphql-engine-vps","استضافة-hasura-على-vps-واجهة-graphql","autoalojar-hasura-api-graphql-vps","Hasura sur VPS : une API GraphQL instantanée sur PostgreSQL","Installez Hasura sur un VPS avec Docker Compose : une API GraphQL et REST sur PostgreSQL, permissions par rôle, souscriptions temps réel et HTTPS.",6,0,false,"2026-10-27T00:00:00+00:00","2026-10-27T23:58:39+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-hasura-vps-poster.svg",{"categorySlug":34,"appSlug":35},"developpement","hasura","Écrire le même code CRUD pour chaque table, puis les mêmes contrôles d'accès, puis la même documentation d'API : c'est le travail que Hasura GraphQL Engine supprime. Ce moteur open source (licence Apache-2.0) se branche sur une base PostgreSQL et en expose aussitôt une API GraphQL complète, avec relations, filtres, agrégats et souscriptions temps réel, protégée par des permissions déclarées par rôle. Ce guide l'installe avec Docker Compose sur un VPS, à côté de sa propre base PostgreSQL, le publie en HTTPS derrière nginx et pose les règles de sécurité à ne pas oublier.",[38,42,52,87,90,106,110,113,116,119],{"type":39,"title":40,"body":41},"h2","Pourquoi une API générée plutôt qu'un backend écrit à la main","Dans la plupart des applications, une grande partie du code serveur ne fait que traduire des requêtes HTTP en SQL : lister, filtrer, paginer, créer, modifier, supprimer, en vérifiant à chaque fois que l'utilisateur a le droit de le faire. Ce code est répétitif, il faut le tester, et chaque nouvelle colonne oblige à le retoucher.\n\nHasura part du schéma de la base. Une table suivie devient un type GraphQL, une clé étrangère devient un champ imbriqué, et une règle de permission écrite une fois s'applique à toutes les requêtes. La logique propre à votre métier — un paiement, un envoi d'e-mail, un calcul — reste dans votre code, que Hasura appelle par webhook. Vous gardez la base PostgreSQL : rien n'est enfermé dans un format propriétaire.",{"type":43,"title":44,"items":45},"ul","Ce que Hasura apporte",[46,47,48,49,50,51],"**API GraphQL instantanée** — requêtes, mutations, filtres, tri, pagination et agrégats sur chaque table suivie.","**Relations** — les clés étrangères deviennent des champs imbriqués, interrogeables en une seule requête.","**Souscriptions temps réel** — un client s'abonne à une requête et reçoit les changements par WebSocket.","**Permissions par rôle** — règles par ligne et par colonne, alimentées par les claims d'un jeton JWT.","**Actions et triggers** — webhooks appelés par une mutation, par un changement de données ou selon un horaire cron.","**Console et endpoints REST** — administration web, explorateur GraphiQL, et conversion d'une requête en route REST.",{"type":53,"title":54,"headers":55,"rows":59},"comparison","Hasura face aux autres façons d'exposer PostgreSQL",[5,56,57,58],"Hasura","API écrite à la main","PostgREST",[60,65,70,74,79,84],[61,62,63,64],"API générée depuis le schéma","Oui, GraphQL et REST","Non","Oui, REST",[66,67,68,69],"Relations imbriquées en une requête","Oui","Selon le code","Oui, par embedding",[71,72,73,63],"Temps réel","Souscriptions GraphQL","À développer",[75,76,77,78],"Permissions","Par rôle, ligne et colonne, dans la console","Dans le code","Rôles et RLS PostgreSQL",[80,81,82,83],"Logique métier","Actions et triggers en webhooks","Libre","Fonctions SQL",[85,86,63,63],"Interface d'administration","Console web",{"type":39,"title":88,"body":89},"Prérequis","Un VPS Ubuntu 24.04 avec **1 Go de RAM** suffit pour démarrer : au repos, le moteur Hasura et PostgreSQL occupent ensemble environ 200 Mo. Prévoyez **2 Go** dès que la base grossit ou que les souscriptions se multiplient. Il vous faut Docker avec le plugin Compose, et un **nom de domaine** pointant vers le VPS, avec nginx et un certificat HTTPS : votre API sera appelée par des navigateurs et des applications mobiles, elle doit répondre sur une adresse stable et chiffrée.",{"type":91,"title":92,"steps":93},"steps","Installer Hasura avec Docker Compose",[94,97,100,103],{"title":95,"body":96},"Préparer les secrets","Créez le répertoire de l'application et un fichier `.env` portant le mot de passe de la base et l'**admin secret**, la clé maîtresse de l'API. Le fichier n'est lisible que par root.\n```bash\nmkdir -p \u002Fopt\u002Fhasura && cd \u002Fopt\u002Fhasura\ncat > .env \u003C\u003CEOF\nDB_PASSWORD=$(openssl rand -hex 16)\nADMIN_SECRET=$(openssl rand -hex 24)\nEOF\nchmod 600 .env\n```",{"title":98,"body":99},"Créer le fichier Compose","Ce `docker-compose.yml` démarre PostgreSQL sur le réseau interne de la stack, sans port publié, puis Hasura une fois la base prête. Le port de Hasura n'est publié que sur la boucle locale ; la console est servie depuis l'image, sans appel au CDN de l'éditeur, et la télémétrie est coupée.\n```yaml\nservices:\n  postgres:\n    image: postgres:17.11-alpine\n    restart: unless-stopped\n    environment:\n      POSTGRES_DB: hasura\n      POSTGRES_USER: hasura\n      POSTGRES_PASSWORD: ${DB_PASSWORD}\n    volumes:\n      - hasura-pgdata:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U hasura -d hasura\"]\n      interval: 10s\n      retries: 10\n  hasura:\n    image: hasura\u002Fgraphql-engine:v2.51.3\n    restart: unless-stopped\n    depends_on:\n      postgres:\n        condition: service_healthy\n    ports:\n      - \"127.0.0.1:8103:8080\"\n    env_file: .env\n    environment:\n      HASURA_GRAPHQL_DATABASE_URL: postgres:\u002F\u002Fhasura:${DB_PASSWORD}@postgres:5432\u002Fhasura\n      HASURA_GRAPHQL_ADMIN_SECRET: ${ADMIN_SECRET}\n      HASURA_GRAPHQL_ENABLE_CONSOLE: \"true\"\n      HASURA_GRAPHQL_CONSOLE_ASSETS_DIR: \u002Fsrv\u002Fconsole-assets\n      HASURA_GRAPHQL_DEV_MODE: \"false\"\n      HASURA_GRAPHQL_ENABLE_TELEMETRY: \"false\"\nvolumes:\n  hasura-pgdata: {}\n```",{"title":101,"body":102},"Démarrer la stack","Au premier démarrage, Hasura crée ses tables de métadonnées dans le schéma `hdb_catalog` et connecte la base comme source `default`. Le point `\u002Fhealthz` répond `OK` quand le moteur est prêt.\n```bash\ndocker compose up -d\ncurl -fsS http:\u002F\u002F127.0.0.1:8103\u002Fhealthz   # OK\n```",{"title":104,"body":105},"Publier en HTTPS derrière nginx","Ajoutez un bloc `server` pour votre domaine, avec un certificat Let's Encrypt. Les en-têtes `Upgrade` et `Connection` sont indispensables : les souscriptions passent par WebSocket.\n```nginx\nlocation \u002F {\n    proxy_pass http:\u002F\u002F127.0.0.1:8103;\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection \"upgrade\";\n    proxy_set_header Host $host;\n    proxy_set_header X-Forwarded-Proto $scheme;\n}\n```",{"type":107,"title":108,"body":109},"tip","L'admin secret ne quitte jamais le serveur","Sans `HASURA_GRAPHQL_ADMIN_SECRET`, la console et toute l'API sont ouvertes à quiconque connaît l'adresse. Avec lui, il donne **tous les droits** : lecture et écriture de toutes les tables, exécution de SQL, modification des métadonnées. Gardez-le pour la console et vos scripts d'administration, et ne le placez jamais dans le code d'un frontend ou d'une application mobile.",{"type":39,"title":111,"body":112},"Créer une table et l'interroger","Ouvrez `https:\u002F\u002Fapi.example.com\u002Fconsole`, saisissez l'admin secret, puis, dans l'onglet **Data**, créez une table `todos` avec les colonnes `id` (entier auto-incrémenté), `title` (texte) et `done` (booléen). Cliquez sur **Track** : la table apparaît aussitôt dans l'explorateur de l'onglet **API**. Depuis un script d'administration, la même requête s'envoie avec l'admin secret :\n```bash\ncurl -s https:\u002F\u002Fapi.example.com\u002Fv1\u002Fgraphql \\\n  -H \"x-hasura-admin-secret: $ADMIN_SECRET\" \\\n  -H 'content-type: application\u002Fjson' \\\n  -d '{\"query\":\"{ todos { id title done } }\"}'\n```",{"type":39,"title":114,"body":115},"Authentifier vos utilisateurs et poser les permissions","Vos utilisateurs ne doivent pas utiliser l'admin secret : ils présentent un jeton JWT émis par votre fournisseur d'identité (Logto, Authentik, Zitadel, Auth0…). Indiquez à Hasura où trouver les clés de vérification, et quel rôle donner aux requêtes sans jeton, dans le fichier `.env` :\n```bash\nHASURA_GRAPHQL_JWT_SECRET={\"type\":\"RS256\",\"jwk_url\":\"https:\u002F\u002Fauth.example.com\u002Foidc\u002Fjwks\"}\nHASURA_GRAPHQL_UNAUTHORIZED_ROLE=anonymous\n```\n\nRelancez la stack avec `docker compose up -d` : le service `hasura` lit ce fichier par `env_file`. Le jeton doit porter les claims `x-hasura-default-role`, `x-hasura-allowed-roles` et `x-hasura-user-id`. Dans l'onglet **Permissions** de chaque table, définissez alors ce que chaque rôle peut lire, insérer ou modifier — par exemple, le rôle `user` ne voit que les lignes où `user_id` vaut `X-Hasura-User-Id`.",{"type":39,"title":117,"body":118},"Dépannage","**La console affiche « invalid x-hasura-admin-secret »** : le secret saisi ne correspond pas à la valeur du `.env`. Vérifiez-la avec `grep ADMIN_SECRET \u002Fopt\u002Fhasura\u002F.env`, puis rechargez la page.\n\n**Hasura redémarre en boucle** : la base n'est pas joignable. `docker compose logs hasura` affiche l'erreur de connexion ; vérifiez que le mot de passe de l'URL `HASURA_GRAPHQL_DATABASE_URL` est bien celui de PostgreSQL. Si vous l'avez changé après le premier démarrage, PostgreSQL a gardé l'ancien : il ne lit `POSTGRES_PASSWORD` qu'à la création du volume.\n\n**Les souscriptions se coupent** : le reverse proxy ne transmet pas la mise à niveau WebSocket. Ajoutez les en-têtes `Upgrade` et `Connection` montrés plus haut, et augmentez `proxy_read_timeout` si vos clients restent longtemps inactifs.\n\n**Une table n'apparaît pas dans l'API** : elle existe dans la base mais n'est pas suivie. Cliquez sur **Track** dans l'onglet **Data**, ou suivez toutes les tables du schéma en une fois.",{"type":39,"title":120,"body":121},"Installation en un clic depuis le Marketplace ServOrbit","Le Marketplace ServOrbit installe Hasura sur votre VPS sans ligne de commande : il déploie PostgreSQL et le moteur Hasura, génère l'admin secret et le mot de passe de la base, connecte la base comme source `default` et publie l'API en HTTPS sur un sous-domaine de votre domaine ou sur le sous-domaine gratuit du VPS. L'admin secret s'affiche dans votre espace client ; il ne reste qu'à ouvrir la console et à créer vos tables.","Votre API GraphQL sur PostgreSQL, sur votre propre VPS","Un VPS ServOrbit Ubuntu 24.04 avec 1 Go de RAM suffit pour démarrer avec Hasura. Installation en un clic depuis le Marketplace, PostgreSQL inclus, admin secret généré pour vous, HTTPS sur votre domaine ou sur le sous-domaine gratuit du VPS.","Installer Hasura","\u002Fmarketplace\u002Fdeveloppement\u002Fhasura",[127,149,167],{"id":128,"slug":129,"slugs":130,"title":134,"excerpt":135,"readTime":136,"views":18,"isPinned":19,"publishedAt":137,"updatedAt":138,"category":139,"categories":144,"featuredImage":30,"bgImage":31,"posterImage":146,"relatedSolution":147},56,"heberger-postgresql-vps",{"fr":129,"en":131,"ar":132,"es":133},"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":17,"name":140,"slug":141,"color":142,"icon":143},"Bases de données","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[145],{"id":17,"name":140,"slug":141,"color":142,"icon":143},"\u002Fblog\u002Fcovers\u002Fheberger-postgresql-vps-poster.svg",{"categorySlug":141,"appSlug":148},"postgresql-stack",{"id":150,"slug":151,"slugs":152,"title":156,"excerpt":157,"readTime":158,"views":18,"isPinned":19,"publishedAt":159,"updatedAt":160,"category":161,"categories":162,"featuredImage":30,"bgImage":31,"posterImage":164,"relatedSolution":165},60,"heberger-supabase-vps",{"fr":151,"en":153,"ar":154,"es":155},"hosting-supabase-on-a-vps","استضافة-supabase-على-خادم-vps","alojar-supabase-en-un-vps","Héberger Supabase sur un VPS en 2026","Self-hostez Supabase sur votre VPS : Postgres, Auth, Storage et API REST avec Envoy Gateway. Migration PG 15→17, Kong→Envoy, CVE GoTrue.",14,"2026-04-21T00:00:00+00:00","2026-10-09T22:36:10+00:00",{"id":17,"name":140,"slug":141,"color":142,"icon":143},[163],{"id":17,"name":140,"slug":141,"color":142,"icon":143},"\u002Fblog\u002Fcovers\u002Fheberger-supabase-vps-poster.svg",{"categorySlug":141,"appSlug":166},"supabase",{"id":168,"slug":169,"slugs":170,"title":174,"excerpt":175,"readTime":176,"views":18,"isPinned":19,"publishedAt":177,"updatedAt":178,"category":179,"categories":184,"featuredImage":30,"bgImage":31,"posterImage":186,"relatedSolution":30},282,"docker-compose-depends-on-healthcheck",{"fr":169,"en":171,"ar":172,"es":173},"depends-on-is-not-enough-postgresql-healthcheck-in-compose","depends-on-لا-يكفي-healthcheck-لـ-postgresql-في-compose","docker-compose-healthcheck-postgresql","depends_on ne suffit pas : healthcheck PostgreSQL dans Compose","Pourquoi `depends_on` seul ne garantit pas que PostgreSQL est prêt, et comment configurer un healthcheck fiable avec `service_healthy` pour éviter les races conditions.",8,"2026-08-19T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":180,"name":181,"slug":182,"color":183,"icon":182},3,"Déploiement","deploiement","bg-success\u002F10 text-success",[185],{"id":180,"name":181,"slug":182,"color":183,"icon":182},"\u002Fblog\u002Fcovers\u002Fdocker-compose-depends-on-healthcheck-poster.svg",1793145947829]