Guide de déploiement

Héberger Langfuse sur un VPS : observabilité LLM sans SaaS

Déployer sur un VPS Cloud →

Tutoriel

Héberger Langfuse sur un VPS : observabilité LLM sans SaaS

Intelligence Artificielle11 min de lecture7 étapes

Toute application propulsée par un LLM finit par soulever une question à laquelle ses développeurs ne peuvent pas répondre à partir des seuls logs : pourquoi cette réponse s'est-elle dégradée, quelle version de prompt a été la plus performante, et où part l'argent ? Langfuse (MIT, ~30 k étoiles sur GitHub, v3.212.0) est la réponse open source : une plateforme d'observabilité full-stack pour applications LLM, que vous déployez sur votre propre VPS et connectez à n'importe quel fournisseur de modèles en quelques minutes.

Sommaire· Pourquoi les applications LLM nécessitent une observabilité dédiée1/10
  1. 01Pourquoi les applications LLM nécessitent une observabilité dédiée
  2. 02Ce que Langfuse vous offre d'emblée
  3. 03Sur quoi tourne Langfuse (et pourquoi il lui faut 4 Go de RAM)
  4. 04Déployer Langfuse sur votre VPS en six étapes
  5. 05Configuration post-installation : reverse proxy nginx, TLS et variables d'environnement clés
  6. 06Associez-le à LiteLLM pour une visibilité complète sur les coûts de l'IA
  7. 07Intégration SDK : tracer vos agents LLM en Python et TypeScript
  8. 08Coûts LLM affichés à $0.00 dans la vue Tracing v4 — ce qui se passe et comment contourner
  9. 09Dépannage : cinq erreurs fréquentes après l'installation
  10. 10Langfuse vs Langsmith vs Helicone

Pourquoi les applications LLM nécessitent une observabilité dédiée

Les outils d'APM traditionnels (Datadog, New Relic) capturent la latence HTTP et les taux d'erreur, mais ils sont aveugles à ce qui se passe à l'intérieur d'un appel LLM. Une réponse qui arrive en 800 ms peut malgré tout être factuellement fausse, vague au point d'être inutile, ou trois fois plus coûteuse que celle de la veille parce qu'une régression de prompt est passée entre les mailles de la revue de code. Langfuse résout ce problème en traitant chaque interaction LLM comme une trace structurée : il enregistre le prompt complet (y compris le message système et l'historique de conversation), la complétion, le modèle utilisé, le décompte de tokens, la ventilation de la latence par span, ainsi que tous les scores d'évaluation que votre équipe y attache. Vous pouvez ensuite filtrer, comparer et reproduire n'importe quelle trace, individuellement ou de façon agrégée.

Ce que Langfuse vous offre d'emblée

  • Traçage LLM full-stack : prompt, complétion, latence, coût et nombre de tokens — y compris les spans imbriqués pour les chaînes d'agents (LangChain, LlamaIndex, Dify).
  • Hub de gestion des prompts : versionnez vos prompts, préparez des variantes, faites des tests A/B en production et promouvez la gagnante sans déploiement de code.
  • Framework d'évaluation : lancez du LLM-as-a-judge, des files d'annotation humaine ou des fonctions de scoring personnalisées sur n'importe quelle trace ou dataset.
  • Analytique des coûts : suivez la consommation de tokens par modèle, endpoint, utilisateur et session — changez de fournisseur en vous appuyant sur des données concrètes, pas sur des suppositions.
  • Gestion des datasets : capturez les traces de production comme jeux de tests de référence pour l'évaluation hors ligne et la détection de régressions.
  • SDK natif pour Python et TypeScript, plus une intégration automatique avec LiteLLM, LangChain, LlamaIndex, Dify, Haystack et VercelAI.

Sur quoi tourne Langfuse (et pourquoi il lui faut 4 Go de RAM)

Langfuse v3 se présente comme une stack Docker Compose à six services : langfuse (frontend Next.js + API), langfuse-worker (tâches d'arrière-plan et évaluations), postgres (état de l'application), clickhouse (analytique des traces — stockage en colonnes optimisé pour les séries temporelles à forte cardinalité), redis (file d'attente et cache) et minio (stockage d'objets compatible S3 pour les pièces jointes média). ClickHouse justifie le minimum de 4 Go : son compilateur JIT et son moteur d'exécution vectorielle ont besoin de marge. Sur un VPS peu sollicité, la stack complète tourne au repos autour de 1,5–2 Go ; sous une charge de production modérée, prévoyez 4 Go, et 8 Go pour un traçage soutenu à haut débit. Les six services démarrent d'un seul docker compose up -d et sont gérés par AWX dans le flux en un clic de ServOrbit.

Déployer Langfuse sur votre VPS en six étapes

  1. Commandez un VPS Power (8 GB de RAM)

    Langfuse réclame au moins 4 Go de RAM : au catalogue, le premier plan qui les dépasse est le VPS Power (4 vCPU, 8 GB), à installer sous Ubuntu 24.04 — de quoi absorber aussi un trafic de production permanent. Choisissez un domaine ou sous-domaine que vous contrôlez — les cookies de session NextAuth de Langfuse exigent un véritable domaine en HTTPS.

  2. Installation en un clic depuis le Marketplace

    Ouvrez votre panneau de contrôle ServOrbit, allez dans Marketplace → Intelligence Artificielle → Langfuse, puis cliquez sur Déployer. Saisissez votre domaine lorsque cela vous est demandé. Docker Compose télécharge les six images et les démarre ; l'interface web est prête sur le port 3000 en 60 à 90 secondes (l'initialisation de ClickHouse au premier démarrage est la plus longue).

  3. Ouvrez l'interface web et créez votre premier projet

    Rendez-vous sur https://votre-domaine.com. Langfuse affiche l'écran d'inscription au premier démarrage. Créez votre compte administrateur, puis allez dans Paramètres → Projets → Créer un projet. Copiez la Clé publique et la Clé secrète depuis les paramètres du projet — vous en aurez besoin dans votre application.

  4. Instrumentez votre application Python ou TypeScript

    En Python : pip install langfuse, définissez LANGFUSE_HOST=https://votre-domaine.com, LANGFUSE_PUBLIC_KEY et LANGFUSE_SECRET_KEY, puis décorez vos appels LLM avec @observe() ou utilisez langfuse.trace(). En TypeScript : npm install langfuse, initialisez le client avec votre host et vos clés. Les traces apparaissent dans le tableau de bord quelques secondes après le premier appel.

  5. Activez le traçage automatique si vous utilisez LiteLLM

    Si LiteLLM fait déjà partie de votre stack (ce qui est probable si vous utilisez la stack IA de ServOrbit), ajoutez success_callback = ["langfuse"] à litellm_config.yaml et définissez les trois variables d'environnement Langfuse. Chaque appel LLM relayé par le proxy — sur l'ensemble des modèles en aval — est tracé automatiquement, avec les données de coût et de tokens jointes.

  6. Lancez votre première évaluation

    Allez dans Traces, filtrez un échantillon représentatif, cliquez sur « Ajouter au dataset ». Ouvrez Datasets → votre dataset → Lancer l'évaluation, choisissez le LLM-as-a-judge avec un modèle de prompt (« Évaluez la pertinence de cette réponse sur une échelle de 1 à 5 »), puis validez. Les scores apparaissent sur chaque trace de l'ensemble et alimentent le tableau de bord analytique agrégé.

  7. Se connecter la première fois

    L'URL ouvre l'écran Langfuse avec un lien « Sign up » : créez votre compte, puis votre organisation et votre premier projet dans l'assistant.

Configuration post-installation : reverse proxy nginx, TLS et variables d'environnement clés

L'installation Marketplace de ServOrbit configure nginx et le certificat TLS pour vous. Si vous partez d'une installation manuelle, voici les points critiques.

Reverse proxy nginx. Langfuse écoute sur le port 3000. Votre vhost nginx doit proxifier ce port et transmettre les en-têtes nécessaires à NextAuth :

server {
    listen 443 ssl;
    server_name votre-domaine.com;
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Si X-Forwarded-Proto n'est pas transmis, NextAuth génère des URLs de callback en http:// et les cookies de session ne s'attachent pas sur la réponse HTTPS — symptôme : boucle de redirection après la connexion.

Variables d'environnement clés. Le fichier .env de la stack Langfuse porte trois variables à personnaliser impérativement avant le premier démarrage :

- NEXTAUTH_SECRET : chaîne aléatoire longue (32 caractères minimum). Sans elle, les sessions ne persistent pas entre redémarrages.
- NEXTAUTH_URL : URL publique complète de votre instance (https://votre-domaine.com). Doit correspondre exactement au domaine nginx.
- LANGFUSE_INIT_ORG_ID, LANGFUSE_INIT_PROJECT_ID, LANGFUSE_INIT_PROJECT_PUBLIC_KEY, LANGFUSE_INIT_PROJECT_SECRET_KEY : optionnels, mais utiles pour provisionner une organisation et un projet au premier démarrage sans passer par l'interface.

TLS. Le déploiement ServOrbit utilise Let's Encrypt via certbot en mode DNS-01 — aucun port 80 à ouvrir. Si vous configurez le certificat manuellement, pointez les directives ssl_certificate et ssl_certificate_key vers les fichiers émis par certbot et activez le renouvellement automatique (certbot renew --quiet en cron).

Associez-le à LiteLLM pour une visibilité complète sur les coûts de l'IA

La stack IA de ServOrbit inclut déjà LiteLLM comme passerelle compatible OpenAI. Connectez Langfuse à LiteLLM avec trois variables d'environnement et vous obtenez une vue d'ensemble complète : LiteLLM applique les limites de débit et route entre les fournisseurs ; Langfuse enregistre chaque trace avec le prompt complet, la complétion, le modèle, les tokens et le coût. Ensemble, ils vous offrent une couche d'opérations IA privée et auditable — pas d'intermédiaire SaaS, aucune donnée qui quitte votre infrastructure.

Intégration SDK : tracer vos agents LLM en Python et TypeScript

Langfuse propose deux SDK officiels couvrant les principaux frameworks d'agents.

Python — décorateur @observe().
La façon la plus directe de tracer un agent :

from langfuse.decorators import observe, langfuse_context

@observe()
def run_agent(user_message: str) -> str:
    # chaque appel LLM imbriqué est automatiquement capturé
    response = openai_client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": user_message}]
    )
    return response.choices[0].message.content

Toutes les fonctions imbriquées décorées avec @observe() apparaissent comme des spans enfants dans la même trace. Pour attacher des métadonnées (identifiant utilisateur, tags de session) :

langfuse_context.update_current_trace(
    user_id="user-42",
    session_id="session-abc",
    tags=["production", "agent-v2"]
)

LangChain. L'intégration native s'active en une ligne :

from langfuse.callback import CallbackHandler
handler = CallbackHandler()  # lit LANGFUSE_* depuis l'env
chain.invoke({"input": query}, config={"callbacks": [handler]})

Chaque nœud du graphe LangGraph (ou de la chaîne LangChain) devient un span avec son propre décompte de tokens et son coût.

TypeScript / JavaScript.
Initialisation du client :

import Langfuse from "langfuse";
const lf = new Langfuse({
  publicKey: process.env.LANGFUSE_PUBLIC_KEY!,
  secretKey: process.env.LANGFUSE_SECRET_KEY!,
  baseUrl: process.env.LANGFUSE_HOST,
});

Création d'une trace et d'une génération :

const trace = lf.trace({ name: "agent-run", userId: "user-42" });
const generation = trace.generation({
  name: "llm-call",
  model: "gpt-4o",
  input: messages,
});
// … appel LLM …
generation.end({ output: result, usage: { input: 120, output: 45 } });
await lf.shutdownAsync(); // vider le buffer avant la fin du process

VercelAI SDK. Si vous utilisez le SDK VercelAI, l'intégration Langfuse s'active en ajoutant langfuseExporter comme SpanExporter dans la configuration OpenTelemetry — toutes les générations sont tracées sans modifier votre code métier.

Coûts LLM affichés à $0.00 dans la vue Tracing v4 — ce qui se passe et comment contourner

Un problème actif affecte la vue Tracing v4 de Langfuse (signalé dans l'issue #16077, 17 commentaires en août 2026) : la colonne Cost ($) affiche systématiquement $0.00 pour toutes les traces.

La cause est structurelle. La vue v4 lit le coût porté par l'observation racine de chaque trace, qui est de type SPAN — un span n'a pas de coût propre, il ne fait qu'encapsuler des générations enfants. Le coût réel est distribué sur les observations de type GENERATION enfantes, mais la vue ne les agrège pas : elle lit la racine, trouve zéro, et affiche zéro.

Vos données sont intactes. Le coût est bien enregistré sur chaque génération ; seul l'affichage de la vue principale est faux. Trois contournements fonctionnent en attendant le correctif officiel :

1. Onglet Analytics / Metrics — la vue agrégée calcule les coûts sur l'ensemble des générations, pas sur la racine. C'est la source fiable pour suivre votre consommation quotidienne ou par modèle.

2. Filtrer par type GENERATION dans Traces — ajoutez le filtre observation_type = GENERATION dans la vue Traces. Vous ne voyez plus les traces parentes, mais chaque ligne affiche son coût réel.

3. Ouvrir le détail d'une trace — le panneau latéral affiche la ventilation complète par span et génération, avec les coûts corrects. Utile pour diagnostiquer une trace précise.

Si vous observez ce comportement sur votre instance, vérifiez que vous êtes bien sur Langfuse v3.x avec Tracing v4 activé. L'issue est ouverte et suivie par l'équipe Langfuse.

Dépannage : cinq erreurs fréquentes après l'installation

1. Le container langfuse ne démarre pas — Error: NEXTAUTH_SECRET manquant.
Langfuse v3 refuse de démarrer sans cette variable. Vérifiez votre .env :

docker compose config | grep NEXTAUTH_SECRET

Si la ligne est absente ou vide, générez une valeur et redémarrez :

openssl rand -base64 32
# collez le résultat dans .env : NEXTAUTH_SECRET=<valeur>
docker compose up -d langfuse

2. Connexion à la base de données refusée — ECONNREFUSED postgres:5432.
C'est presque toujours un problème de timing au démarrage : langfuse tente de se connecter avant que postgres soit prêt à accepter des connexions. Vérifiez que votre docker-compose.yml déclare depends_on avec condition: service_healthy pour le service postgres. Si le problème persiste, inspectez les logs postgres :

docker compose logs postgres --tail=50

3. Les traces n'arrivent pas dans le tableau de bord.
Vérifiez dans cet ordre : (a) les variables d'environnement LANGFUSE_HOST, LANGFUSE_PUBLIC_KEY et LANGFUSE_SECRET_KEY sont-elles définies dans votre application ? (b) Le host pointe-t-il vers l'URL HTTPS publique et non vers localhost:3000 ? (c) Le SDK Python vide-t-il son buffer avant la fin du process (langfuse.flush() ou langfuse.shutdown()) ?

Un appel de test rapide depuis Python :

from langfuse import Langfuse
lf = Langfuse()
lf.trace(name="test-connection")
lf.flush()
print("Trace envoyée — vérifiez le dashboard.")

4. Boucle de redirection après la connexion.
Cause la plus fréquente : NEXTAUTH_URL ne correspond pas au domaine réellement utilisé, ou l'en-tête X-Forwarded-Proto n'est pas transmis par nginx. Vérifiez que NEXTAUTH_URL=https://votre-domaine.com (sans barre oblique finale) et que votre configuration nginx inclut proxy_set_header X-Forwarded-Proto $scheme;.

5. ClickHouse consomme toute la RAM.
Sous forte charge, ClickHouse peut dépasser son allocation initiale. Limitez sa consommation mémoire en ajoutant dans votre .env :

CLICKHOUSE_MAX_MEMORY_USAGE=2000000000

Cette valeur (2 Go) est un point de départ raisonnable pour un VPS de 8 Go hébergeant uniquement Langfuse. Ajustez selon le volume de traces.

Langfuse vs Langsmith vs Helicone

Langsmith (le produit hébergé de LangChain) et Helicone sont les principales alternatives SaaS. Les deux sont excellents — et tous deux vous imposent de faire transiter vos traces par leurs serveurs. Pour les équipes qui manipulent des prompts sensibles (juridiques, financiers, médicaux), ou pour les environnements de conformité qui interdisent toute sortie de données vers un tiers, l'auto-hébergement n'est pas une option. Langfuse vous offre le même ensemble de fonctionnalités (traçage, évaluations, gestion des prompts, analytique des coûts) sur une infrastructure que vous maîtrisez. La licence MIT signifie aussi que vous pouvez lire, modifier et auditer chaque ligne du code par lequel transitent vos traces.

Déployez Langfuse sur votre VPS

Obtenez une observabilité LLM complète en un clic — tracez chaque requête IA, gérez vos prompts et suivez vos coûts, sur une infrastructure que vous maîtrisez.

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