Ce que PostHog fait que les alternatives SaaS ne permettent pas
Mixpanel, Amplitude et Heap sont des outils cloud : vos données partent sur leurs serveurs, leur politique de rétention fixe ce que vous pouvez conserver, et le sampling s'active automatiquement dès que votre volume dépasse certains seuils. PostHog self-hosted supprime ces trois contraintes. Les événements restent dans votre base ClickHouse, sur votre disque ou votre object storage — aucune copie ne part à l'extérieur. La rétention n'a pas de plafond imposé : vous choisissez vous-même quand purger les anciennes données. Le sampling n'existe pas : chaque événement est enregistré, même lors de pics de trafic. Ajoutez à cela la conformité RGPD sans DPA à négocier avec un tiers, la possibilité de modifier le code source, et un accès direct aux données brutes dans ClickHouse pour vos propres analyses SQL.
Comparatif rapide : PostHog self-hosted vs Mixpanel Cloud
Faites défiler le tableau
| Critère | PostHog self-hosted | Mixpanel Cloud |
|---|---|---|
| Prix mensuel (1M events/mois) | ~$15–20 (coût VPS) | ~$25–100+ |
| Données hébergées chez vous | Oui | Non |
| Conformité RGPD simplifiée | Oui (pas de DPA tiers) | Partielle (DPA requis) |
| Sampling automatique | Aucun | Activé au-delà des paliers |
| Session recordings incluses | Oui | Option payante |
| Feature flags & A/B testing | Oui, inclus | Payant (plan Growth+) |
| Accès aux données brutes SQL | Oui (ClickHouse direct) | Non |
Prérequis serveur
PostHog embarque ClickHouse, Kafka, Redis et PostgreSQL dans la même stack Docker Compose. C'est la solution d'analytics la plus gourmande en ressources de cette catégorie, et sous-dimensionner le VPS provoque des crashs de ClickHouse ou des timeouts Kafka dès les premiers événements. Prévoyez au minimum 4 vCPU et 8 Go de RAM pour un usage léger (moins d'un million d'events par mois). Pour une charge plus soutenue — 1 à 5 millions d'events par mois — visez 8 vCPU et 16 Go de RAM. Côté stockage, ClickHouse est très efficace en compression, mais les session recordings s'accumulent vite : prévoyez 50 Go de SSD minimum, et ajoutez un object storage externe (S3 ou MinIO) dès que vous activez les recordings. Côté logiciel : Docker Engine 24+ et Docker Compose v2, un nom de domaine avec un enregistrement A pointant vers le VPS, et les ports 80 et 443 ouverts dans votre pare-feu.
Installer PostHog avec Docker Compose
Installer Docker sur le VPS
Connectez-vous en SSH, puis installez Docker avec le script officiel :
curl -fsSL https://get.docker.com | sh. Ajoutez votre utilisateur au groupe docker pour éviter sudo :usermod -aG docker $USER. Vérifiez avecdocker compose versionque Compose v2 est disponible.Cloner le dépôt PostHog et préparer l'environnement
Clonez le dépôt officiel :
git clone https://github.com/PostHog/posthog.git && cd posthog. Copiez le fichier d'environnement exemple :cp .env.example .env. Ouvrez.envdans un éditeur pour configurer les variables essentielles.Configurer les variables d'environnement
Dans
.env, renseignez au minimum :SECRET_KEY(générez une clé aléatoire de 50 caractères avecpython3 -c "import secrets; print(secrets.token_hex(25))"),SITE_URL=https://posthog.votre-domaine.com,DISABLE_SECURE_SSL=false(outruesi vous testez en HTTP local sans certificat). Laissez les valeurs dePOSTGRES_*,REDIS_*etCLICKHOUSE_*avec leurs défauts Docker pour un déploiement simple.Démarrer la stack et attendre la migration
Lancez tous les services en arrière-plan :
docker compose -f docker-compose.yml up -d. La première fois, PostHog exécute automatiquement les migrations de base de données — cela prend 2 à 5 minutes selon la puissance du serveur. Suivez la progression avecdocker compose logs -f webjusqu'à voirPostHog server is now listening on port 8000.Accéder à l'interface et créer votre compte
Accédez à
http://localhost:8000(ou via votre domaine si le DNS est déjà configuré). L'assistant de premier lancement vous guide pour créer le compte administrateur, nommer votre organisation, et créer votre premier projet. Notez laProject API Keyaffichée — vous en aurez besoin pour brancher le SDK.
Configurer un reverse proxy nginx pour HTTPS
Installer nginx et Certbot
Sur la machine hôte (hors Docker) :
apt install -y nginx certbot python3-certbot-nginx. Assurez-vous que votre domaineposthog.votre-domaine.compointe bien vers l'IP du VPS avant cette étape — Certbot doit pouvoir valider via HTTP.Créer le vhost nginx
Créez
/etc/nginx/sites-available/posthogavec le contenu suivant :server { listen 80; server_name posthog.votre-domaine.com; location / { proxy_pass http://127.0.0.1:8000; 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; } }. Activez-le :ln -s /etc/nginx/sites-available/posthog /etc/nginx/sites-enabled/.Émettre le certificat TLS
Lancez
certbot --nginx -d posthog.votre-domaine.com. Certbot modifie automatiquement le vhost pour rediriger HTTP vers HTTPS et configure le renouvellement automatique. Testez le renouvellement aveccertbot renew --dry-run.Recharger nginx et vérifier
Appliquez la configuration :
nginx -t && systemctl reload nginx. Ouvrezhttps://posthog.votre-domaine.comdans un navigateur — vous devriez voir l'interface PostHog avec un certificat valide. Mettez à jourSITE_URLdans.envsi ce n'est pas déjà fait, puis redémarrez le service web :docker compose restart web.
Object storage pour les session recordings (S3 ou MinIO)
Comprendre pourquoi un object storage est nécessaire
Les session recordings génèrent de nombreux fichiers de petite taille (un par segment de session). Les stocker sur le disque local du VPS remplit rapidement le SSD et complique les sauvegardes. Un object storage compatible S3 — qu'il s'agisse d'AWS S3, de Cloudflare R2 ou de MinIO auto-hébergé — externalise ce stockage de façon élastique.
Déployer MinIO sur le même VPS (option auto-hébergée)
Si vous ne voulez pas dépendre d'un service externe, ajoutez MinIO à votre
docker-compose.yml:minio: image: minio/minio environment: MINIO_ROOT_USER: posthog MINIO_ROOT_PASSWORD: changeme-mot-de-passe-fort command: server /data --console-address ':9001' volumes: - ./minio-data:/data. Créez ensuite un bucket nomméposthogdans l'interface MinIO (port 9001).Configurer les variables d'environnement PostHog
Dans
.env, ajoutez :OBJECT_STORAGE_ENABLED=true,OBJECT_STORAGE_ENDPOINT=http://minio:9000(ou l'URL de votre bucket S3),OBJECT_STORAGE_ACCESS_KEY_ID=posthog,OBJECT_STORAGE_SECRET_ACCESS_KEY=changeme-mot-de-passe-fort,OBJECT_STORAGE_BUCKET=posthog. Redémarrez la stack :docker compose up -d.Vérifier avec un premier session recording
Dans les paramètres du projet PostHog, activez « Session recording ». Naviguez sur votre application pendant quelques secondes, puis retournez dans PostHog sous « Session Recordings ». Un enregistrement devrait apparaître en quelques minutes. Vérifiez dans MinIO (ou S3) que des fichiers ont bien été créés dans le bucket.
Envoyer vos premiers events depuis votre application
Installer le SDK JavaScript
Dans votre projet front-end :
npm install posthog-js. Si vous utilisez un framework comme React, Vue ou Next.js, importez et initialisez PostHog une seule fois au niveau racine de l'application.Initialiser avec votre clé de projet et l'URL de votre instance
Ajoutez l'initialisation :
import posthog from 'posthog-js'; posthog.init('phc_VOTRE_PROJECT_API_KEY', { api_host: 'https://posthog.votre-domaine.com', autocapture: true });. Remplacezphc_VOTRE_PROJECT_API_KEYpar la clé visible dans les paramètres du projet PostHog. Avecautocapture: true, PostHog enregistre automatiquement les clics, les soumissions de formulaires et les changements de page.Capturer des events personnalisés
Pour un event métier précis, appelez :
posthog.capture('commande_passee', { montant: 49.90, devise: 'EUR', produit: 'vps-cloud-4vcpu' });. Les propriétés associées à l'event seront disponibles dans les entonnoirs, les cohortes et les requêtes SQL ClickHouse.Vérifier dans le dashboard
Rendez-vous dans PostHog sous « Activity » ou « Events ». Les events apparaissent en temps quasi-réel (quelques secondes de latence). Si rien n'arrive au bout de deux minutes, vérifiez que
api_hostdans l'init correspond exactement à l'URL de votre instance, et que le certificat TLS est valide.
Activer les Feature Flags
Les feature flags permettent de déployer une fonctionnalité progressivement — d'abord pour 5 % des utilisateurs, puis 20 %, puis 100 % — sans recompiler ni redéployer l'application. Dans PostHog, rendez-vous sous « Feature Flags » et créez un nouveau flag avec une clé (mon-nouveau-module), une condition de rollout (pourcentage ou cohorte d'utilisateurs), et optionnellement des variantes pour un vrai test A/B. Côté application JavaScript, évaluez le flag : if (posthog.isFeatureEnabled('mon-nouveau-module')) { /* afficher la nouvelle fonctionnalité */ }. Pour une évaluation côté serveur (Python ou Node.js), utilisez le SDK backend correspondant avec la même PROJECT_API_KEY — l'évaluation se fait alors sans aller-retour client, ce qui évite le flash de contenu. PostHog enregistre automatiquement un event $feature_flag_called à chaque évaluation, ce qui vous permet de corréler l'activation d'un flag avec n'importe quelle métrique de votre dashboard.
Optimisation performance : désactivez les session recordings au démarrage
Si votre VPS est configuré avec le minimum de 4 vCPU / 8 Go de RAM, les session recordings mobilisent des ressources importantes côté ClickHouse dès les premières heures de trafic. Recommandation : laissez les recordings désactivés pendant les 30 premiers jours. Cela vous laisse le temps de valider la stabilité de la stack, d'affiner la configuration de l'object storage, et de monter en RAM si nécessaire. Activez-les ensuite dans les paramètres du projet — tous les recordings futurs seront capturés, et vous pouvez définir un taux d'échantillonnage pour n'enregistrer qu'un pourcentage de sessions et maîtriser l'espace disque.
Mettre à jour PostHog
L'équipe PostHog publie des mises à jour régulières. Pour mettre à jour : git pull origin master dans le répertoire du dépôt, puis docker compose pull pour récupérer les nouvelles images, et enfin docker compose up -d. Les migrations de base de données s'exécutent automatiquement au redémarrage du service web — une interruption de quelques dizaines de secondes est normale. Consultez les release notes avant chaque mise à jour majeure : certaines versions imposent une mise à jour intermédiaire (pas de saut de version).
Documentation officielle
Ce guide couvre l'installation de base sur VPS. Pour les sujets avancés — réplication ClickHouse, SSO SAML, webhooks, intégrations data warehouse, et les options de configuration de Kafka — référez-vous à la documentation officielle de PostHog. Elle reste la référence pour les mises à jour majeures et les cas d'usage spécifiques.