Guide de déploiement

Hasura sur VPS : une API GraphQL instantanée sur PostgreSQL

Déployer sur un VPS Cloud →

Tutoriel

Hasura sur VPS : une API GraphQL instantanée sur PostgreSQL

Self-hosting6 min de lecture4 étapes

É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.

Sommaire· Pourquoi une API générée plutôt qu'un backend écrit à la main1/10
  1. 01Pourquoi une API générée plutôt qu'un backend écrit à la main
  2. 02Ce que Hasura apporte
  3. 03Hasura face aux autres façons d'exposer PostgreSQL
  4. 04Prérequis
  5. 05Installer Hasura avec Docker Compose
  6. 06L'admin secret ne quitte jamais le serveur
  7. 07Créer une table et l'interroger
  8. 08Authentifier vos utilisateurs et poser les permissions
  9. 09Dépannage
  10. 10Installation en un clic depuis le Marketplace ServOrbit

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.

Hasura 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.

Ce que Hasura apporte

  • 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.

Hasura face aux autres façons d'exposer PostgreSQL

Faites défiler le tableau

HasuraAPI écrite à la mainPostgREST
API générée depuis le schémaOui, GraphQL et RESTNonOui, REST
Relations imbriquées en une requêteOuiSelon le codeOui, par embedding
Temps réelSouscriptions GraphQLÀ développerNon
PermissionsPar rôle, ligne et colonne, dans la consoleDans le codeRôles et RLS PostgreSQL
Logique métierActions et triggers en webhooksLibreFonctions SQL
Interface d'administrationConsole webNonNon

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.

Installer Hasura avec Docker Compose

  1. 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.

    mkdir -p /opt/hasura && cd /opt/hasura
    cat > .env <<EOF
    DB_PASSWORD=$(openssl rand -hex 16)
    ADMIN_SECRET=$(openssl rand -hex 24)
    EOF
    chmod 600 .env
  2. 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.

    services:
      postgres:
        image: postgres:17.11-alpine
        restart: unless-stopped
        environment:
          POSTGRES_DB: hasura
          POSTGRES_USER: hasura
          POSTGRES_PASSWORD: ${DB_PASSWORD}
        volumes:
          - hasura-pgdata:/var/lib/postgresql/data
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U hasura -d hasura"]
          interval: 10s
          retries: 10
      hasura:
        image: hasura/graphql-engine:v2.51.3
        restart: unless-stopped
        depends_on:
          postgres:
            condition: service_healthy
        ports:
          - "127.0.0.1:8103:8080"
        env_file: .env
        environment:
          HASURA_GRAPHQL_DATABASE_URL: postgres://hasura:${DB_PASSWORD}@postgres:5432/hasura
          HASURA_GRAPHQL_ADMIN_SECRET: ${ADMIN_SECRET}
          HASURA_GRAPHQL_ENABLE_CONSOLE: "true"
          HASURA_GRAPHQL_CONSOLE_ASSETS_DIR: /srv/console-assets
          HASURA_GRAPHQL_DEV_MODE: "false"
          HASURA_GRAPHQL_ENABLE_TELEMETRY: "false"
    volumes:
      hasura-pgdata: {}
  3. 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 /healthz répond OK quand le moteur est prêt.

    docker compose up -d
    curl -fsS http://127.0.0.1:8103/healthz   # OK
  4. 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.

    location / {
        proxy_pass http://127.0.0.1:8103;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

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.

Créer une table et l'interroger

Ouvrez https://api.example.com/console, 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 :

curl -s https://api.example.com/v1/graphql \
  -H "x-hasura-admin-secret: $ADMIN_SECRET" \
  -H 'content-type: application/json' \
  -d '{"query":"{ todos { id title done } }"}'

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 :

HASURA_GRAPHQL_JWT_SECRET={"type":"RS256","jwk_url":"https://auth.example.com/oidc/jwks"}
HASURA_GRAPHQL_UNAUTHORIZED_ROLE=anonymous

Relancez 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.

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 /opt/hasura/.env, puis rechargez la page.

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.

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.

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.

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.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet