Pourquoi auto-héberger Elasticsearch sur un VPS
Elasticsearch brille là où une recherche simple ne suffit plus : scoring fin, agrégations imbriquées, analyse multilingue, géo-requêtes, et stack ELK pour centraliser vos logs. Les offres cloud managées (Elastic Cloud, OpenSearch Service) deviennent rapidement coûteuses dès qu'on dépasse quelques gigaoctets indexés. Sur votre VPS, vous maîtrisez la version, les plugins d'analyse (comme l'analyseur français ou ICU), la rétention de vos logs, et vous évitez les frais de transfert sortant. C'est aussi le moyen de garder des données sensibles strictement sur votre infrastructure.
Les bénéfices d'un Elasticsearch maison
- Recherche full-text avancée : scoring BM25, synonymes, analyseurs linguistiques personnalisés
- Agrégations et facettes complexes pour le e-commerce ou l'analytique
- Stack ELK complète (Logstash/Beats + Kibana) pour centraliser vos logs sans surcoût
- Contrôle total de la version, des plugins et des index lifecycle policies
- Pas de facturation au volume indexé ni de frais d'egress
- Snapshots vers votre propre stockage objet pour une reprise après incident
Prérequis réalistes
Elasticsearch tourne sur une JVM et est gourmand en RAM : ne descendez pas sous 4 Go pour un test, visez 8 Go (2-4 vCPU) pour un usage production léger, et 16 Go dès que vous indexez plusieurs millions de documents ou ajoutez Kibana. Réglez le heap JVM à 50 % de la RAM (sans dépasser 32 Go). Côté système, augmentez vm.max_map_count=262144, désactivez le swap, prévoyez un SSD rapide, Docker + Compose, et un sous-domaine es.votredomaine.ma.
Déploiement pas à pas
Préparer le noyau et le système
Avant tout : sysctl -w vm.max_map_count=262144 (et persistez-le dans /etc/sysctl.conf). Désactivez le swap ou réservez la mémoire avec bootstrap.memory_lock=true. Ces réglages évitent les crashs au démarrage.
Définir le service Docker avec heap maîtrisé
Dans docker-compose.yml, utilisez docker.elastic.co/elasticsearch/elasticsearch:8.13.0, fixez ES_JAVA_OPTS=-Xms4g -Xmx4g, montez un volume nommé pour /usr/share/elasticsearch/data et n'exposez le port 9200 que sur 127.0.0.1.
Activer la sécurité native
Depuis la 8.x, la sécurité TLS est activée par défaut. Lancez docker compose up -d, puis générez le mot de passe elastic avec bin/elasticsearch-reset-password -u elastic. Conservez-le dans un gestionnaire de secrets.
Exposer via reverse proxy HTTPS
Placez Nginx ou Caddy devant le port 9200 pour servir es.votredomaine.ma en HTTPS public, avec une authentification basique supplémentaire côté proxy si l'API doit être jointe depuis l'extérieur.
Configurer les snapshots
Enregistrez un repository de type s3 ou fs (PUT _snapshot/backup) pointant vers un stockage objet, puis créez une Snapshot Lifecycle Policy (SLM) pour des sauvegardes quotidiennes automatiques avec rétention.
Ajouter Kibana (optionnel)
Ajoutez un service kibana:8.13.0 dans le même Compose, branché sur le réseau Docker interne, et exposez-le derrière le proxy sur kibana.votredomaine.ma pour explorer vos index et bâtir des dashboards.
Mettez en place des Index Lifecycle Management (ILM) policies dès le départ : phases hot/warm/cold qui réduisent automatiquement le nombre de répliques et forcent le merge des segments sur les vieux index. Sur un VPS où l'espace disque est compté, c'est ce qui empêche vos logs de saturer le SSD et garde les requêtes rapides sur les données chaudes.