📍 Article principal du cluster : Meilisearch 2026 : le guide complet. Ce tutoriel fait partie du cluster Meilisearch.
Quinze minutes pour passer d’un VPS vide à un Meilisearch de production accessible en HTTPS, prêt à indexer votre catalogue. Ce tutoriel détaille la procédure exacte sur Hetzner CX22 (4,51 €/mois) via Coolify v4, le PaaS open source qui transforme l’auto-hébergement en clic-souris. Méthode validée sur des installations à Dakar, Casablanca, Lagos et Tunis.
Prérequis
- Un VPS Hetzner CX22 ou OVH VPS-1 sous Ubuntu 22.04 LTS / Debian 12.
- Coolify v4 déjà installé (voir Guide Coolify).
- Un nom de domaine avec enregistrement DNS A pointant vers le VPS (par exemple
search.votre-entreprise.com). - Niveau attendu : intermédiaire.
- Temps estimé : 15 à 25 minutes.
Étape 1 — Créer le DNS et propager
Dans votre panel DNS (Cloudflare, OVH, Gandi, Namecheap), créez un enregistrement A : search.votre-entreprise.com → IP de votre VPS. TTL 300 secondes (5 minutes) pour faciliter d’éventuels ajustements. Vérifiez la propagation : dig +short search.votre-entreprise.com. Si Cloudflare est devant, désactivez le proxy (orange cloud → gris) le temps de l’émission Let’s Encrypt.
Étape 2 — Lancer le service Meilisearch dans Coolify
Dans l’interface Coolify : Resources → + New → Service. Recherchez « Meilisearch » dans le catalogue. Le template officiel Coolify déploie la dernière stable (v1.10 au moment de l’écriture) avec un volume persistant pré-configuré.
Nom du service : meilisearch-prod. Serveur : votre Hetzner CX22. Projet : Production (ou créez-le). Cliquez Continue.
Étape 3 — Configurer les variables d’environnement
Sur l’écran de configuration, définissez :
MEILI_ENV=production
MEILI_MASTER_KEY=générez-une-clé-de-32-caractères-minimum
MEILI_DB_PATH=/data/data.ms
MEILI_DUMP_DIR=/data/dumps
MEILI_HTTP_PAYLOAD_SIZE_LIMIT=100MB
MEILI_LOG_LEVEL=INFO
MEILI_NO_ANALYTICS=true
La MEILI_MASTER_KEY est la clé d’admin qui contrôle tout. Générez-la avec :
openssl rand -base64 48 | tr -d '/+=' | head -c 32
Notez-la dans votre coffre Vaultwarden (collection « Infrastructure ») immédiatement. Sans elle, vous perdez le contrôle administratif de l’instance.
Étape 4 — Domaine et HTTPS
Dans l’onglet Domains, saisissez https://search.votre-entreprise.com. Coolify configure son reverse proxy interne (Traefik 2.10) pour gérer le certificat Let’s Encrypt automatiquement. Activez Force HTTPS pour rediriger HTTP → HTTPS.
Le port interne est 7700 par défaut, Coolify le mappe automatiquement au 443 public. Aucune configuration réseau supplémentaire.
Étape 5 — Déployer et vérifier
Cliquez Deploy. Les logs en temps réel montrent : pulling getmeili/meilisearch:v1.10, creating volume, requesting Let’s Encrypt certificate, service healthy. Comptez 60 secondes au premier déploiement.
Test de fonctionnement :
curl https://search.votre-entreprise.com/health
# Retourne : {"status":"available"}
Avec votre master key :
curl -H "Authorization: Bearer VOTRE_MASTER_KEY" \
https://search.votre-entreprise.com/version
# Retourne : {"pkgVersion":"1.10.0","commitSha":"...","commitDate":"..."}
Étape 6 — Créer une API key search-only
Le master key ne doit jamais être utilisé côté front-end. Créez une API key publique avec scope search :
curl -X POST 'https://search.votre-entreprise.com/keys' \
-H 'Authorization: Bearer VOTRE_MASTER_KEY' \
-H 'Content-Type: application/json' \
--data '{
"description": "Frontend search-only key",
"actions": ["search"],
"indexes": ["*"],
"expiresAt": null,
"name": "frontend-public"
}'
La réponse contient "key": "..." — c’est cette clé que vous mettez dans votre code frontend Next.js, Astro ou Vue. Elle ne peut faire que des recherches en lecture, jamais modifier les index.
Étape 7 — Premier index et premier document
curl -X POST 'https://search.votre-entreprise.com/indexes' \
-H 'Authorization: Bearer VOTRE_MASTER_KEY' \
-H 'Content-Type: application/json' \
--data '{ "uid": "products", "primaryKey": "id" }'
curl -X POST 'https://search.votre-entreprise.com/indexes/products/documents' \
-H 'Authorization: Bearer VOTRE_MASTER_KEY' \
-H 'Content-Type: application/json' \
--data '[
{"id":1,"title":"Pagne wax indigo Faso","price":12500,"category":"tissus"},
{"id":2,"title":"Bazin riche Mali","price":18000,"category":"tissus"},
{"id":3,"title":"Sac en cuir Touareg","price":35000,"category":"maroquinerie"}
]'
curl 'https://search.votre-entreprise.com/indexes/products/search' \
-H 'Authorization: Bearer VOTRE_API_KEY_SEARCH' \
-H 'Content-Type: application/json' \
--data '{ "q": "pagne" }'
La réponse retourne le document 1 avec son score de pertinence. Si vous tapez « pagn » ou « pagnee », Meilisearch retourne aussi le document 1 grâce à la typo-tolérance native.
Étape 8 — Configurer les sauvegardes
Cron quotidien sur le VPS pour créer un dump et l’envoyer vers MinIO/B2 :
0 3 * * * curl -X POST -H 'Authorization: Bearer MASTER_KEY' \
https://search.votre-entreprise.com/dumps && \
rclone copy /var/lib/coolify/services/meilisearch-prod/data/dumps \
b2-vaultwarden:meilisearch-backups/$(date +\%F)/
Erreurs fréquentes
| Erreur | Cause | Solution |
|---|---|---|
| 401 Unauthorized partout | Header Authorization mal formé | Vérifier Bearer + clé sans espaces parasites |
| 413 Payload Too Large | Document > 100 Mo | Augmenter MEILI_HTTP_PAYLOAD_SIZE_LIMIT |
| Volume non persistant | Coolify volume mal mappé | Vérifier dans Storages que /data est mappé |
| Latence > 200 ms | RAM saturée | Passer au CCX13 (8 Go) |
| Master key visible dans GitHub | Push sans .env ignoré |
Révoquer la clé, en générer une nouvelle, pusher .gitignore |
| CORS bloque le frontend | Header Access-Control-Allow-Origin manquant |
Configurer Caddy/Traefik pour ajouter les CORS appropriés |
Adaptation au contexte ouest-africain
Trois ajustements pour les PME africaines. Latence acceptable : 95 ms ping Hetzner Falkenstein depuis Dakar via le câble ACE est bonne pour la recherche e-commerce ; pour de l’autocomplete sur chaque caractère, débouncer côté frontend à 300 ms évite la saturation. Paiement Hetzner : carte Visa émise par CBAO, BICIS ou Société Générale CI fonctionne directement. Wave Business carte virtuelle aussi. Stockage : 25 Go SSD inclus dans le CX22 tiennent largement 5 millions de documents typiques (catalogue produits, articles).
Tutoriels frères du cluster
- Intégrer Meilisearch dans Next.js — la suite logique côté front-end.
- Synchronisation Postgres → Meilisearch via Drizzle ORM
FAQ
Coolify ou docker-compose direct ? Coolify pour 95% des cas (gestion centralisée, HTTPS auto, redémarrages, monitoring). docker-compose direct si vous préférez tout contrôler manuellement et avez moins de 3 services.
Quelle taille pour 1 million de documents ? Hetzner CCX13 (15 €/mois, 8 Go RAM) tient confortablement 1 à 2 millions de documents avec recherches < 50 ms.
Comment monitorer la santé en continu ? Uptime Kuma sur l’endpoint /health toutes les 60 secondes, alerte Telegram ou Discord si réponse différente de {"status":"available"}.
Master key compromise — que faire ? Régénérer la MEILI_MASTER_KEY dans Coolify, redéployer (toutes les sessions sont invalidées), recréer les API keys dérivées, mettre à jour les secrets dans le frontend.
Peut-on migrer un dump entre versions ? Oui, Meilisearch supporte les dumps inter-versions depuis v1.0. Suivre le changelog pour les rares cas de breaking changes.
Pour aller plus loin
- 🔝 Retour au pilier : Guide complet Meilisearch 2026
- Documentation Meilisearch : meilisearch.com/docs
- Tutoriel suivant : Intégration Next.js