1. Introduction
Dolibarr est un ERP / CRM open‑source très populaire auprès des PME et des start‑ups grâce à sa simplicité d’usage, son extensibilité et son coût quasi nul. Mais, comme tout logiciel, il possède des limites lorsqu’il passe d’un environnement de test à 10 ou 100 sites, de quelques dizaines d’utilisateurs à plusieurs centaines.
Scalabilité : la capacité d’un système à augmenter ses performances, sa capacité de traitement et son stockage sans devoir revoir l’architecture de bout en bout.
Dans cet article, nous vous présentons :
- ✅ Les points de friction les plus courants dans Dolibarr. 2. 🔧 Les leviers techniques (code, configuration, infrastructure) pour y remédier.
- 📈 Les bonnes pratiques pour anticiper la croissance et préparer un scaling fonctionnel.
Objectif : passer de “ça marche” à “ça marche à 10 000 requêtes simultanées et plusieurs millions d’enregistrements sans faille”.
2. Les goulots d’étranglement typiques de Dolibarr
| Domaine | Symptomes d’échec | Racine du problème |
|---|---|---|
| Base de données | Temps de réponse > 2 s sur les listes de contacts, verrous bloquant les écritures simultanées | Requêtes non‑indexées, tables MyISAM, absence de partitionnement |
| Cache | Multiples requêtes identiques re‑exécutées, load CPU > 80 % | Aucun cache (ou seulement le cache du navigateur) |
| Application | Processus PHP “zombie”, dépassement du temps d’exécution, erreurs 500 | Logique métier lourde (ex : génération de devis avec 10 000 lignes), appels externes synchrones |
| Stockage | I/O disque élevé, latence sur les fichiers annexes (factures PDF, pièces jointes) | SGBD sur disque mécanique, sauvegarde/archivage non optimisé |
| Infrastructure | Saturation du CPU ou de la RAM sur le serveur web, temps d’attente réseau | Manque de ressources (CPU, RAM), utilisation d’un serveur partagé sans scaling horizontal |
Connaître ces goulots permet d’agir de façon ciblée.
— ## 3. Stratatégies de scalabilité : approche “là où ça compte le plus”
3.1 Optimisation du SGBD (MySQL / MariaDB)
| Action | Pourquoi | Comment le mettre en œuvre |
|---|---|---|
| Choisir InnoDB plutôt que MyISAM | Verrouillage transactionnel, réplication, crash‑safe | Dans my.cnf : default-storage-engine=InnoDB |
Indexer les colonnes de recherche fréquente (ex. fk_user, status, date) |
Accélère les SELECT … WHERE … |
ALTER TABLE llx_customer ADD INDEX idx_customer_status (status); |
| Partitionner les tables volumineuses (ex. journaux de paiement, factures) | Limite les scans complets, facilite la maintenance | ALTER TABLE llx_invoice PARTITION BY RANGE(id_facture) (…) ; |
| Activer le buffer pool (70‑80 % de la RAM si serveur dédié) | Cache d’instructions et de données | innodb_buffer_pool_size = 12G (exemple pour 16 GB RAM) |
| Activer le query cache (MySQL 5.6‑8.0, mais déconseillé) | Historique des requêtes fréquentes, mais attention à la bricole | Alternativement, privilégier Redis ou Memcached pour les résultats de requêtes |
Exemple de configuration MySQL optimale pour Dolibarr (serveur dédié)
[mysqld]
max_connections = 500 # si > 200 utilisateurs simultanés
innodb_buffer_pool_size = 60% RAM # 10 GB sur serveur 16 GB RAM
innodb_log_file_size = 2G
innodb_flush_method = O_DIRECT
table_open_cache = 2000
query_cache_type = 0 # désactivé, on utilise Redis
3.2 Mise en place d’un cache externe
Dolibarr ne possède pas de cache natif intégré, mais il interagit avec les principaux résultats de requêtes :
| Type de donnée | Cache recommandé | Implémentation rapide |
|---|---|---|
| Listes de contacts / produits | Redis (hashes) | Installez Redis, activez apc.enable_cli=1 et créez un petit module d’interfaçage (dolibarr-redis-cache) |
| Sessions PHP | Redis Session (ou memcached) |
Ajoutez session.save_handler = redis dans php.ini |
| Résultats de requêtes lourdes | OPcache + varnish (proxy HTTP) | Configurez Varnish en front‑end, TTL 5 min sur /list/* |
Cache « Redis » minimal
# installation sur Debian 12
apt-get install redis-server
systemctl enable redis-server
systemctl start redis-server
# config de php (apache)
echo "extension=redis.so" >> /etc/php/8.2/apache2/php.ini
echo "redis.host = 127.0.0.1" >> /etc/dolibarr/conf/conf.php
Astuce : Dolibarr permet d’ajouter des “hooks” PHP. Vous pouvez intercepter
getTableSqlResult()pour placer les résultats dans Redis avant de les renvoyer au client.
3.3 Architecture “Front‑End + Back‑End” (Horizontal Scaling)
| Niveau | Rôle | Technologies proposées |
|---|---|---|
| Load‑Balancer | Répartition du trafic HTTP | HAProxy, NGINX ou AWS ALB (mode L7) |
| Webservers (PHP‑FPM) | Exécution du code Dolibarr | 3–5 pods (Docker) scaldé via Kubernetes ou Docker Swarm |
| App‑Cache | Cache d’objets stateless | Redis ou Memcached partagé |
| DB | Stockage persistant | MySQL Galera Cluster ou MariaDB Cluster (multi‑master) |
| File storage | Documents attachés (PDF, pièces jointes) | MinIO (S3‑compatible) ou NFS partagé |
Resultat : chaque appel HTTP peut atterrir sur n’importe quel serveur web, tant que le cache partagé (Redis) et la base de données sont synchronisés.
Exemple de déploiement Docker‑Compose minimal
version: "3.8"
services:
db:
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: dolibarr
volumes:
- db_data:/var/lib/mysql
command: --wsrep-cluster-name="galera" --wsrep-cluster-address="gcomm://node1,node2,node3"
redis:
image: redis:7-alpine
volumes: ["redis_data:/data"]
web:
build: .
environment:
- REDIS_HOST=redis
- DB_HOST=db
depends_on: [db, redis]
ports: ["80:80"]
deploy:
replicas: 3
resources:
limits:
cpus: "0.75"
memory: 1G
volumes:
db_data:
redis_data:
Note : Dans ce schéma, le code source de Dolibarr doit être monté en read‑only (
read_only: true) afin d’éviter la duplication des écritures.
3.4 Optimisation du serveur web| Configuration | Impact |
|—————|——–|
| Nginx + PHP‑FPM via socket Unix | Réduction du nombre de connections TCP, latence plus faible |
| Gzip + Brotli | Diminution du volume de payload, meilleur temps de réponse |
| HTTP/2 + TLS 1.3 | Connexions multiples sans overhead supplémentaire |
| Compression des pages (output buffering) | Réduction du nombre de requêtes PHP ob_end_flush() |
Exemple Nginx (site-preset)
server {
listen 80;
server_name dolibarr.example.com;
root /var/www/dolibarr/htdocs;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
# Compression
gzip on;
gzip_types text/css application/javascript image/svg+xml;
gzip_proxied any;
}
4. Guide pas à pas : Passer à la scalabilité étape par étape
Prérequis : votre instance Dolibarr fonctionne déjà sur un serveur unique (monolithique).
Étape 1 – Audit des requêtes lentes
# MySQLslow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
# Puis analyser avec ptquery (Percona Toolkit)
pt-query-digest /var/log/mysql/mysql-slow.log
Corrigez les index manquants, regroupez les SELECT identiques dans des fonctions réutilisables.
Étape 2 – Mise en place du cache Redis (5 jours)
- Installez Redis sur un serveur dédié ou comme conteneur.
- Installez le module PHP
phpredis. - Créez un fichier
src/Kernels/Cache.phpqui encapsuleRedis::set/get. 4. Modifiez les modèles Product, Customer pour appeler ce cache avant chaquefetch()lourd.
Étape 3 – Séparation des services (10 jours)
Créez un fichier docker-compose.yml comme ci‑dessus, lancez docker compose up -d.
Testez le débit avec ab ou wrk :
wrk -t12 -c400 -d30s http://localhost/
Notez le Requests per second et la latence moyenne.
Étape 4 – Ajouter un Load‑Balancer externe (5 jours)
Déployez HAProxy en front de vos pods web.
Ajoutez un certificate TLS Let’s Encrypt via certbot.
Configurez un health‑check : GET /status.php → 200 OK.
Étape 5 – Passer à une base de données clusterisée (2 semaines)
Si vous avez > 200 000 enregistrements, migrez vers Galera Cluster.
Utilisez les scripts de migration mysqldump => mysqlimport sur chaque nœud.
Vérifiez la réplication avec :
SHOW GLOBAL STATUS LIKE 'wsrep_%';
Étape 6 – Automatisation du monitoring
- Prometheus + Grafana : créez des exporters pour PHP‑FPM, Redis, MySQL.
- Alertmanager : déclenche une alerte sur > 90 % CPU ou latence > 500 ms.
5. Bonnes pratiques « Scalabilité durable »
| Pratique | Raison | Astuce d’implémentation |
|---|---|---|
| Déployer les mises à jour de façon immutable | Réduit les dérives de configuration | Utilisez Docker image tag: v9.0.2-production |
| Séparer les environnements (dev, stg, prod) | Évite les impacts de charge réelle sur la prod | Docker‑Compose distincts ou Helm charts K8s |
| Versionner les schémas de base | Permet des roll‑backs rapides | Flyway ou Liquibase pour appliquer les migrations |
| Documenter les limites de charge attendues | Souvent oublié, pourtant indispensable | Tableau de SLA : 100 req/s, 5 ms latence, 99,9 % uptime |
| Test pré‑production avec la même charge que prévue | Découvre les bottlenecks réels | Utilisez k6, JMeter avec un script réaliste (catalogue + facturation) |
| Plan de sauvegarde et réplication | Réduit le risque de perte de données | mysqldump --single-transaction --quick | gzip > backup.sql.gz + réplication Redis |
6. Conclusion
Dolibarr n’est pas conçu d’emblée pour gérer « des millions de lignes », mais avec les bons leviers d’optimisation – indexes, cache externe, séparation des services et architecture de conteneurs – il est possible d’atteindre une scalabilité horizontale comparable à celle d’ERP professionnels.
Résumé des actions clés
1️⃣ Audit des requêtes lentes → index + requêtes optimisées.
2️⃣ Cache des listes de données via Redis.
3️⃣ Déploiement en conteneurs avec LB et DB clusterisée. > 4️⃣ Monitoring & alerting pour garder le contrôle en production.
En suivant ce plan en 6 étapes, vous passerez d’une petite installation « en local » à une plateforme robuste capable de supporter plusieurs dizaines de milliers d’utilisateurs simultanés et plusieurs millions d’enregistrements sans devoir changer d’architecture majeure.
Bonne scalabilité ! 🚀
À propos de l’auteur
Le contenu de cet article a été rédigé par [Nom], architecte cloud senior spécialisé en solutions ERP open‑source. Passé 10 ans dans la mise en production d’applications métier à forte intensité de transaction, il accompagne aujourd’hui les PME dans leur transformation digitale. Sources et lecture complémentaire
- Dolibarr Documentation officielle : https://www.dolibarr.org
- Percona Toolkit –
pt-query-digest: https://www.percona.com/doc/percona-toolkits/ - Kubernetes & Docker‑Compose best‑practices : https://kubernetes.io/docs/
- Redis – ‘Cache for Dolibarr’ tutorial : https://redis.io/topics/cache
Vous avez trouvé cet article utile ?
Partagez-le avec votre communauté, posez vos questions en commentaire et n’hésitez pas à m’envoyer votre propre version de cet article pour le faire évoluer en fonction des retours d’expérience.
Merci de votre lecture, et à très vite pour vos projets de scalabilité !
Mot‑clé : scalabilité Dolibarr, architecture microservices, cache Redis, MySQL optimisation, Docker‑Compose, monitoring Prometheus