Guide de déploiement

Neo4j sur VPS : base de données graphe, Cypher et GraphRAG

Déployer sur un VPS Cloud →

Tutoriel

Self-hosting

Neo4j sur VPS : base de données graphe, Cypher et GraphRAG

Certaines données ne tiennent pas bien dans des tables : qui connaît qui, quel service dépend de quel autre, quel document cite quel contrat. En SQL, chaque niveau de relation coûte une jointure. Neo4j, la base de données orientée graphe la plus répandue, stocke directement les nœuds et leurs relations et les interroge en Cypher. Ce guide installe Neo4j Community Edition sur un VPS avec Docker Compose, publie Neo4j Browser et la connexion Bolt en HTTPS sur un seul nom, puis connecte une application et pose les bases d'un GraphRAG.

7 min de lecture3 étapes
Sommaire· Ce que fait Neo4j1/12
  1. 01Ce que fait Neo4j
  2. 02Ce que Neo4j apporte
  3. 03Neo4j face aux autres options
  4. 04Prérequis
  5. 05Installer Neo4j avec Docker Compose
  6. 06Ne publiez jamais 7474 ni 7687 sur Internet
  7. 07Placer Neo4j derrière nginx en HTTPS
  8. 08Premières requêtes Cypher
  9. 09Connecter une application
  10. 10GraphRAG : donner des faits reliés à un assistant IA
  11. 11Sauvegarder et mettre à jour
  12. 12Installation en un clic sur ServOrbit

Ce que fait Neo4j

Neo4j enregistre des nœuds — un client, un produit, un serveur — porteurs d'étiquettes (:Person, :Product) et de propriétés, reliés par des relations orientées et nommées (:KNOWS, :BOUGHT, :DEPENDS_ON). Une relation est stockée comme un lien direct entre deux nœuds : la suivre ne demande aucune recherche d'index, quelle que soit la taille de la base.

On l'interroge en Cypher, un langage qui dessine le motif recherché : (a:Person)-[:KNOWS]->(b:Person). Les chemins de longueur variable (-[:KNOWS*1..3]->), les plus courts chemins et les agrégations s'écrivent en une ligne, là où SQL empile les jointures ou les requêtes récursives.

Ce que Neo4j apporte

  • Cypher — MATCH, MERGE, chemins de longueur variable et plus courts chemins, dans un langage lisible.
  • Neo4j Browser — une interface web qui exécute les requêtes et dessine le graphe obtenu.
  • API HTTP — une requête Cypher par appel POST, réponse en JSON, depuis n'importe quel langage.
  • Pilotes officiels en Bolt — Python, JavaScript, Java, Go et .NET.
  • Index et contraintes — unicité, recherche plein texte et index vectoriels pour les embeddings.
  • Transactions ACID — un graphe cohérent, même quand plusieurs applications y écrivent.

Neo4j face aux autres options

Faites défiler le tableau

Neo4jPostgreSQLQdrant
ModèleNœuds et relationsTables et jointuresVecteurs et métadonnées
RequêtesCypherSQLRecherche par similarité
Point fortRelations sur plusieurs niveauxTransactions et données en tablesRecherche sémantique
Rôle dans un RAGFaits reliés et sourcésDonnées métierPassages proches de la question
CoûtPrix du VPSPrix du VPSPrix du VPS

Prérequis

Un VPS Ubuntu 24.04 avec 2 Go de RAM et 20 Go de disque, Docker et le plugin Compose installés, nginx et Certbot sur l'hôte, et un sous-domaine qui pointe vers le VPS, par exemple neo4j.example.com. Neo4j est le plus rapide quand le graphe tient dans son cache de pages : prévoyez davantage de mémoire pour un graphe de plusieurs dizaines de millions de nœuds.

Installer Neo4j avec Docker Compose

  1. Préparer le répertoire et le mot de passe

    Le fichier .env porte le mot de passe de l'utilisateur neo4j. Le dossier backups recevra les sauvegardes : il appartient à l'utilisateur 7474, celui du conteneur.

    mkdir -p /opt/neo4j/backups && cd /opt/neo4j
    echo "NEO4J_PASSWORD=$(openssl rand -hex 16)" > .env
    chmod 600 .env
    chown 7474:7474 backups
  2. Écrire le fichier docker-compose.yml

    Les deux ports sont publiés sur la seule boucle locale : 7474 pour Neo4j Browser et l'API HTTP, 7687 pour Bolt. NEO4J_AUTH crée l'utilisateur neo4j avec votre mot de passe dès le premier démarrage, et l'adresse Bolt annoncée est celle que nginx publiera en HTTPS.

    services:
      neo4j:
        image: neo4j:2026.10.2-community
        restart: unless-stopped
        ports:
          - "127.0.0.1:7474:7474"
          - "127.0.0.1:7687:7687"
        environment:
          NEO4J_AUTH: neo4j/${NEO4J_PASSWORD}
          NEO4J_server_bolt_advertised__address: neo4j.example.com:443
          NEO4J_server_memory_heap_initial__size: 512m
          NEO4J_server_memory_heap_max__size: 512m
          NEO4J_server_memory_pagecache_size: 512m
        volumes:
          - neo4j-data:/data
          - neo4j-logs:/logs
    volumes:
      neo4j-data: {}
      neo4j-logs: {}
  3. Démarrer Neo4j

    Le premier démarrage prend une trentaine de secondes ; la racine répond ensuite par un petit document JSON qui donne la version et les adresses de connexion.

    docker compose up -d
    docker compose ps
    curl -s http://127.0.0.1:7474/

Ne publiez jamais 7474 ni 7687 sur Internet

Laissez les deux ports sur 127.0.0.1 : une base de données joignable directement depuis Internet est scannée en quelques heures. nginx porte le HTTPS sur 443, et la connexion Bolt du navigateur passe par le même nom en WebSocket. Gardez aussi NEO4J_AUTH : sans lui, l'utilisateur neo4j démarre avec le mot de passe d'usine neo4j, que tout le monde connaît.

Placer Neo4j derrière nginx en HTTPS

Neo4j Browser a besoin de deux choses : l'interface HTTP et une connexion Bolt, que le navigateur ouvre en WebSocket. nginx aiguille les deux sur le même nom : les requêtes ordinaires vers 7474, les demandes de WebSocket vers 7687.

map $http_upgrade $neo4j_backend {
    default   127.0.0.1:7474;
    websocket 127.0.0.1:7687;
}
server {
    listen 80;
    server_name neo4j.example.com;
    location / {
        proxy_pass http://$neo4j_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $http_connection;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 3600s;
    }
}
certbot --nginx -d neo4j.example.com

Ouvrez ensuite https://neo4j.example.com. Dans Neo4j Browser, saisissez neo4j+s://neo4j.example.com:443 comme Connect URL, l'utilisateur neo4j et votre mot de passe.

Premières requêtes Cypher

Dans Neo4j Browser, créez une contrainte d'unicité, quelques nœuds et leurs relations, puis suivez un chemin de deux niveaux au plus. MERGE ne crée un nœud ou une relation que s'il n'existe pas encore : la requête peut être rejouée sans doublon.

CREATE CONSTRAINT person_name IF NOT EXISTS FOR (p:Person) REQUIRE p.name IS UNIQUE;
MERGE (sara:Person {name: 'Sara'})
MERGE (yassine:Person {name: 'Yassine'})
MERGE (casa:City {name: 'Casablanca'})
MERGE (sara)-[:KNOWS]->(yassine)
MERGE (yassine)-[:LIVES_IN]->(casa);
MATCH (p:Person {name: 'Sara'})-[:KNOWS*1..2]->(f)-[:LIVES_IN]->(c:City)
RETURN f.name, c.name;

Le Browser dessine le résultat ; la commande :guide ouvre ses tutoriels intégrés, et :sysinfo affiche la taille de la base et l'occupation du cache.

Connecter une application

Depuis n'importe quel langage, l'API HTTP reçoit une requête Cypher en POST et répond en JSON, avec l'authentification HTTP de base. Une application installée sur le même VPS utilise plutôt un pilote officiel en Bolt, sur bolt://127.0.0.1:7687. Depuis votre poste de développement, un tunnel SSH rend le même port accessible sans l'ouvrir sur Internet.

curl -s -u neo4j:$NEO4J_PASSWORD \
  -H 'Content-Type: application/json' \
  -d '{"statement": "MATCH (p:Person) RETURN p.name LIMIT 5"}' \
  https://neo4j.example.com/db/neo4j/query/v2
from neo4j import GraphDatabase

driver = GraphDatabase.driver("bolt://127.0.0.1:7687", auth=("neo4j", "<mot-de-passe>"))
records, _, _ = driver.execute_query("MATCH (p:Person) RETURN p.name AS name")
print([r["name"] for r in records])
ssh -L 7687:127.0.0.1:7687 [email protected]

Utilisez le schéma bolt:// et non neo4j:// pour une connexion locale : le second demande la table de routage, qui annonce l'adresse publique sur le port 443.

GraphRAG : donner des faits reliés à un assistant IA

Un RAG classique retrouve des passages proches de la question. Un GraphRAG ajoute les relations : les entités extraites des documents (personnes, contrats, produits) deviennent des nœuds, reliés entre eux et aux passages qui les citent. Neo4j porte les deux dans la même base, grâce à ses index vectoriels.

CREATE VECTOR INDEX chunk_embedding IF NOT EXISTS
FOR (c:Chunk) ON c.embedding
OPTIONS {indexConfig: {`vector.dimensions`: 768, `vector.similarity_function`: 'cosine'}};

La recherche vectorielle trouve les passages pertinents, puis une requête Cypher suit leurs relations pour rassembler le contexte : l'assistant répond avec des faits reliés et la source de chacun. Les embeddings peuvent venir d'un modèle local servi par Ollama sur le même VPS.

Sauvegarder et mettre à jour

En Community Edition, la sauvegarde se fait base arrêtée, avec neo4j-admin database dump : quelques secondes d'interruption pour un graphe de taille moyenne. Programmez-la la nuit.

cd /opt/neo4j
docker compose stop neo4j
docker compose run --rm -v /opt/neo4j/backups:/backups neo4j \
  neo4j-admin database dump neo4j --to-path=/backups --overwrite-destination=true
docker compose start neo4j

Copiez ensuite backups/neo4j.dump hors du VPS. Pour mettre à jour, changez le numéro de version de l'image dans docker-compose.yml, puis docker compose pull && docker compose up -d, juste après une sauvegarde ; lisez les notes de version avant de changer de version majeure.

Installation en un clic sur ServOrbit

Depuis le Marketplace de votre espace client, Neo4j s'installe sur un VPS ServOrbit sans écrire une ligne : Neo4j Community Edition est déployé derrière un petit proxy qui sert Neo4j Browser, l'API HTTP et la connexion Bolt sur un seul port, le mot de passe de l'utilisateur neo4j est généré et affiché dans votre espace client, et l'ensemble est publié en HTTPS sur votre domaine ou sur le sous-domaine gratuit du VPS. Le port Bolt reste disponible en local, sur bolt://127.0.0.1:7687, pour vos applications.

Partager cet articleservorbit.com/ma-fr/blog/self-host-neo4j-vps