Dolibarr est un ERP/CRM open‑source très flexible, mais comme tout logiciel, il ne rend pleinement ses ressources que lorsqu’il est correctement configuré et adapté à votre contexte.
Cet article propose un guide complet pour personnaliser Dolibarr en mettant l’accent sur la performance. Nous aborderons les leviers les plus efficaces : architecture, configuration, requêtes, caches, extensions, scripts, déploiement et monitoring.
1. Choisir la bonne architecture d’hébergement
| Option | Points forts | Points faibles | recommmendations |
|---|---|---|---|
| Serveur dédié / VPS | Full control, ressources réservées, possibilité d’install RDBMS dédié | Coût, maintenance | Idéal pour > 10 000 lignes transactionnelles ou trafic important. |
| Partage d’hébergement (mutualisé) | Peu cher, installation simple | Ressources partagées, I/O limité | À éviter si le volume de transactions dépasse quelques centaines par jour. |
| Cloud (AWS, Azure, GCP) | Elasticité, bandes passantes élevées, stockage objet | Coûts variables, complexité de config réseau | Utiliser un instance de type "compute optimisé CPU" + RDS dédié pour les bases. |
| Docker / Kubernetes | Isolation, déploiement reproducible | Overhead de management si non maîtrisé | À envisager pour des environnements multi‑sites ou pour automatiser le scaling. |
Bon à savoir : Dolibarr fonctionne parfaitement avec MariaDB/MySQL et PostgreSQL. Le choix du SGBD est déterminant pour les performances de l’optimisation.
2. Optimiser la base de données
2.1 Choisir et paramétrer le SGBD
| Paramètre | Valeur conseillée (MariaDB) | Valeur conseillée (PostgreSQL) | Impact |
|---|---|---|---|
innodb_buffer_pool_size |
60‑80 % de la RAM si seul DB serveur | shared_buffers = 25‑30 % de RAM |
Accélère les scans de tables InnoDB / autovacuum less stress. |
max_connections |
151 (par défaut) → 300‑500 selon charge | max_connections = 200‑400 |
Plus de connexions simultanées évite les files d’attente. |
query_cache_type (MySQL) |
ON (mais à désactiver si version ≥ 8) |
N/A | Désactiver le query cache si version MySQL 8+, il a tendance à créer des goulots d’étranglement. |
work_mem (PostgreSQL) |
N/A | 8‑16 Mo (par connexion) | Augmente le traitement des jointures lourdes. |
autovacuum |
— | autovacuum_vacuum_scale_factor = 0.01 |
Réduit les blocages de tables pendant les gros vidages. |
Tip : Utilisez le profilateur du SGBD (
EXPLAIN,SHOW PROCESSLIST,performance_schemaen MySQL oupg_stat_statementsen PostgreSQL) pour identifier les requêtes les plus coûteuses.
2.2 Indexation fine
- Index composés sur les champs de filtre les plus fréquents (ex.
client_id,status,date_create). - Index partiels (MySQL 8+ / PostgreSQL) pour les requêtes ponctuelles :
CREATE INDEX idx_invoice_status ON llx_element invoice(status)
WHERE status='paid'; - Ne pas sur‑indexer : chaque index supplémentaire ralentit les écritures. Limitez-en le nombre à ce qui est réellement utilisé dans les rapports et les écrans.
2.3 Optimiser les requêtes « gourmandes »
- **Éviter les SELECT *** : ne récupérer que les champs demandés.
- Limiter les
JOINinutiles avecLEFT JOINquand vous n’avez besoin que de lignes principales. - Paginer les résultats (
LIMIT … OFFSET …oucursoren PostgreSQL) pour éviter de charger des milliers de lignes.
3. Ajuster la configuration Dolibarr (php.ini & .htaccess)
| Directive | Valeur recommandée | Pourquoi |
|---|---|---|
memory_limit |
512 M – 2 G (selon volume) | Évite les débordements lors d’imports massifs. |
max_execution_time |
120‑300 s | Permet le traitement de longues batchs (ex. réconciliation comptable). |
upload_max_filesize |
200 M | Nécessaire pour les pièces jointes lourdes (factures PDF). |
post_max_size |
250 M | Alignement avec upload_max_filesize. |
opcache.enable |
1 |
Compile en mémoire les scripts PHP, réduit le temps d’interprétation. |
upload_tmp_dir |
/tmp/dolibarr_upload (et créer le dossier) |
Empêche les failles de sécurité liées à des uploads malveillants. |
session.gc_maxlifetime |
1800 (30 min) | Réduit la taille du répertoire de sessions, améliore le nettoyage. |
Dolibarr spécifique : Dans le fichier
conf/dolibar.conf.php, désactivez les modules inutiles (ex.module_eventpos,module_pointcloud). Un module désactivé ne charge pas ses classes, ce qui diminue la consommation mémoire et le temps d’inclusion.
4. Stratégie de caching
| Niveau | Méthode | Avantages | Mise en œuvre |
|---|---|---|---|
| PHP OPcache | opcache.enable=1 + cache d’opcodes |
Réduction du temps de compilation | Activer directement dans php.ini ou php.ini du pool FPM. |
| Cache HTTP | Varnish / Nginx FastCGI Cache | Cache des pagesigas (liste d’articles, historiques) | Configurer fastcgi_cache_key "$scheme$request_method$host$request_uri"; invalider après actions admin. |
| Cache système | Dolibarr Cache ($conf->global->cache_*) |
Stocke les résultats de recherche, les listes de contacts | Dans conf/settings.php : $conf->global->cache_ttl = 3600; (1 h) – réinitialiser manuellement en cas de mise à jour. |
| Base de données | Query Cache (MySQL) ou pg_stat_statements (PostgreSQL) | Réduit les re‑exécutions de requêtes récurrentes | Nécessite un monitor interne ou un outil externe. |
| Cache d’objets | Redis / Memcached (à installer séparément) | Stockage de sessions, files de verrou, ou des résultats de jointure lourde | Utiliser la fonction dolibarr_set_cache_* du core (ex. $db->fetch_object($result, 0, 'cache')). |
Bonne pratique : désactivez le cache lorsque vous effectuez des mises à jour majeures (
$conf->global->cache_ttl = 0puis réinitialisez à la valeur normale après).
5. Automatiser les tâches non‑critiques
Dolibarr possède plusieurs cron jobs :
cron.php(références de prix, promotions)cron_clean.php(nettoyage des anciens fichiers, archivage)cron_backup.php(copies de sauvegarde)
5.1 Planification optimale
| Tâche | Fréquence | Méthode | Astuce de performance |
|---|---|---|---|
cron.php (Calcul de stocks, prix) |
Quotidien, à minuit | php /chemin/dolibarr/cron.php |
Limiter le nombre d’itérations ($conf->cron->frequency = 86400;). |
cron_clean.php |
Hebdomadaire | php /chemin/dolibarr/cron_clean.php --delete-old-files |
Utiliser --delete-old-files avec --dry-run pour tester avant. |
cron_backup.php |
Hebdomadaire | php /chemin/dolibarr/cron_backup.php --compress |
Compresser les backups (--compress) et les envoyer sur stockage distant (S3). |
5.2 Runner via systemd
[Unit]
Description=Dolibarr Cron Jobs
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/php /var/www/dolibarr/cron.php
User=www-data
Group=www-data
[Install]
WantedBy=multi-user.target
Le passage à un service systemd évite les multiples appels simultanés et permet de garantir que chaque job se termine avant le lancement du suivant.
6. Personnalisation du code (sans toucher au cœur)
6.1 Utiliser les hooks (event_*)
Dolibarr propose plus de 250 hooks (hook拦截) qui permettent d’intercepter des points clés :
hookHeader(chargement du template)hookFormDocumentOpen(juste avant le traitement d’un formulaire)hookDisplayTabContent(affichage d’un onglet)
Exemple : injecter un
WHEREsupplémentaire dans les recherche de factures pour filtrer par client uniquement lorsqu’on travaille sur un compte spécifique, évitant ainsi de charger tout le jeu de data inutilement.
function dolibarr_hookDisplayTabContent($params) {
if ($params->tab->id == 'Invoices') {
$params->fields['filter_client'] = $_SESSION['user_token']; // Filtre dynamique
}
return $params;
}
6.2 Créer un module dédié léger
- Module « Performance » : Regroupez les fonctions de reporting lourds dans un module séparé qui se charge uniquement quand il est demandé (
$user->id==1par ex.). - Paramétrisation : ajoutez des paramètres (
$conf->myperf->enable_stats) pour désactiver les traitements lourds en production.
6.3 Utiliser la couche $db->... avec des Prepared statements
Dolibarr utilise déjà PDO, mais lorsqu’on ajoute des requêtes très spécifiques, assurez‑vous d’utiliser :
$sql = "SELECT id FROM llx_sales WHERE date_exp > ? AND status = ?";
$stmt = $db->prepare($sql);
$stmt->execute([$dateExp, 'paid']);
$ids = $stmt->fetchAll(PDO::FETCH_COLUMN);
- Pourquoi ? Évite le parsing répété et limite le risque de concaténation SQL qui déclencherait des scans full‑table.
7. Prototyper et mesurer les gains
| Outil | Usage | Mise en place |
|---|---|---|
| Google PageSpeed / WebPageTest | Temps de réponse des pages frontales | Capture avant/après des changements de cache ou de module. |
php‑benchmark (ab) ou wrk |
Charge simultanée de requêtes GET/POST | ab -n 500 -c 50 http://dolibarr.tld/index.php |
| MySQL/MariaDB Performance Schema ou pg_stat_statements | Identifier les requêtes lentes | Activer dans my.cnf (performance_schema=ON) ou postgresql.conf (track_counts=top). |
| Grafana + Prometheus | Visualiser le débit DB, latence PHP-FPM | Exporter les métriques via prometheus-dolibarr-exporter. |
| Xdebug Profiler | Analyse détaillée du temps passé dans chaque fonction | $ XDEBUG_PROFILE=1 php cron.php puis analyser le fichier via KCacheGrind. |
Règle d’or : Mesurez avant et après chaque modification. Une amélioration de 10‑20 % de latence ou une réduction de 0,5 s du temps moyen de requête est souvent le fruit d’une petite optimisation indexée ou d’un cache activé.
8. Exemple concret : Réduire le temps de génération de facture PDF
- Problème : La génération du PDF d’une facture avec 300 lignes de facturation prend 8 s.
- Diagnostic (via
Xdebug+performance_schema) →- 3 requêtes lourdes sur les tables
llx_invoice_line,llx_categorie,llx_product. - Aucun index sur
llx_invoice_line.status.
- 3 requêtes lourdes sur les tables
- Actions :
CREATE INDEX idx_invoice_line_status ON llx_invoice_line(status);- Ajouter
SELECT ... FROM llx_invoice_line li INNER JOIN llx_product p ON p.rowid = li.fk_product WHERE li.fk_invoice = ?;avec un prepared statement. - Activer le template cache des PDF (
$conf->global->pdf_caching = 1).
- Résultat : Le temps passe à 2,7 s (≈ 66 % de gain).
Ce cas montre comment un index ciblé combiné à un cache de rendu peut transformer un point de friction majeur.
9. Checklist rapide de performance Dolibarr
| ✅ | Action |
|---|---|
| 1 | Héberger sur un serveur dédié/VPS avec I/O SSD. |
| 2 | Choisir MariaDB/PostgreSQL et ajuster innodb_buffer_pool_size / shared_buffers. |
| 3 | Supprimer les modules inutiles dans conf/dolibar.conf.php. |
| 4 | Activer OPcache + config php.ini (memory, upload, max_execution_time). |
| 5 | Créer des index sur les colonnes filtrées et join‑clés. |
| 6 | Désactiver le SELECT * dans les custom scripts. |
| 7 | Utiliser les hooks pour injecter des filtres sans charger des tables entières. |
| 8 | Implémenter un cache de niveau application ($conf->global->cache_ttl). |
| 9 | Configurer les Cron via systemd ou un scheduler dédié (pas de sleep entre chaque appel). |
| 10 | Mettre en place un monitoring (Grafana/Prometheus) et mesurer avant/après chaque modification. |
10. Conclusion
Optimiser Dolibarr ne consiste pas seulement à « tirer le maximum de la machine », mais à adapter chaque couche (serveur, base, code, cache) au profil d’utilisation de votre entreprise. En suivant les principes décrits ci‑dessus :
- Architecture adaptée,
- Base de données correctement dimensionnée et indexée,
- Configuration PHP fine‑tuned,
- Caching multi‑niveau exploité,
- Personnalisation par hooks et modules légers,
- Mesure continue grâce à des outils de monitoring,
vous pouvez réduire de façon significative les temps de réponse, les charges serveur et les coûts d’infrastructure, tout en conservant la souplesse et la richesse fonctionnelle de Dolibarr.
Performance = (Code léger) + (Base bien configurée) + (Cache intelligent) + (Monitoring rigoureux.
Bonne optimisation ! 🚀