Version 1 – Novembre 2025
1. Introduction
Dolibarr est un ERP/CRM open‑source très répandu pour les PME et les indépendants. Sa simplicité d’installation masque toutefois une architecture technique qui, si elle n’est pas correctement comprise et maintenue, peut engendrer de nombreux dysfonctionnements : pertes de données, lenteur des requêtes, conflits de plugins ou encore ruptures de compatibilité après une mise à jour.
Ce document décrit l’architecture interne de Dolibarr, puis propose une méthodologie de maintenance orientée prévention des erreurs (prévention, détection, correction). Il s’adresse aux administrateurs, développeurs et chefs de projet qui souhaitent garantir la stabilité et la fiabilité du système dans le temps.
2. Architecture technique de Dolibarr
2.1. Schéma global
+---------------------------------------------------+
| Navigateur |
+-------------------+-------------------------------+
|
+---------+----------+----------+----------+
| HTTP(S) (HTTPS) | REST API |
+------------------+--------------+----------+
|
+--------------------+--------------------+
| PHP (CLI/FCGI) |
+--------------------+--------------------+
|
+--------------------+--------------------+
| Bibliothèques internes |
+-----------+-----------+----------+------+
| | |
+-------+-------+ +---+----+---+
| Symfony? | | Symfony| |
| Composer | | Console|
| (autoload) | | CLI |
+-------+-------+ +---+----+---+
| |
+-------+-------+ |
| Dolibarr | |
| Core Engine | |
+-------+-------+ |
| |
+-------+-------+ |
| Modules | |
| (core & ext.) | |
+-------+-------+ |
| |
+-------+-------+ |
| Cache (WinCache/APCu) |
+-------+-------+ |
| |
+-------+-------+ |
| Base de | |
| données MySQL/MariaDB (ou SQLite) |
+---------------+ |
- Front‑office : Interface web (HTML, JS, CSS) générée par les templates Smarty.
- Back‑office (PHP) : Tous les points d’entrée passent par le front‑controller (
index.php). - Core Engine : Core « dolibarr‑core » qui orchestre les entities (Customer, Supplier, Product, Account, etc.), la gestion de modèles SQL, le routing des actions et le moteur de plugins.
- Modules (core ou externes) : Ils ajoutent de la fonctionnalité (ex. : Facturation avancée, Gestion d’imitation, Cartes Google).
- Base de données : Un seul schéma (
dolibarr) contenant des tables « core » (llx_*) et des tables de modules (llx_{module}_*oullx_plugin_{module}). - Cache : Mécanisme de cache interne (array, APCu, WinCache) pour réduire le nombre de requêtes SQL redondantes.
2.2. Points d’entrée et flux d’exécution
| Étape | Description | Risque d’erreur fréquent |
|---|---|---|
| 1. Demande HTTP | URL index.php?module=PAGE&action=setup (ou autre) |
Mauvaise URL → 404 ou appel à action non autorisée |
| 2. Bootstrapping | Chargement du fichier appclerosis.php (ou routeur) → vérification du SESSION et du COOKIE |
Session corrompue → perte d’accès ou injection de code |
| 3. Authentification | Vérification du login/password, génération de token CSRF | Token manquant → formulaire rejeté, token expiré → session bloquée |
| 4. Chargement des class | Autoload via Composer (vendor/autoload.php) → affichage des modèles Dolibarr (User, Product, Account, etc.) |
Classe non retrouvée → erreurs PHP “Class not found” |
| 5. Appel d’action | $action = $_GET['action']; → $this->$action(); ou $system->loadAction() |
Action inexistante → appel à méthode inexistante / 500 |
| 6. Gestion des droits | Callback check droit($user, $action, $category) |
Droits insuffisants → affichage d’erreur non prévue |
| 7. Résultat | Rendu du template ($conf->display). |
Incohérences de données affichées (NULL, mauvaise traduction) |
3. Principaux leviers de prévention des erreurs
3.1. Gestion de la base de données
| Action | Pourquoi c’est critique | Bonnes pratiques |
|---|---|---|
Utilisation du wrapper DB() |
Centralise les connexions, applique les filtres PDO + Gestion des transactions | Toujours appeler new db() plutôt que créer plusieurs connexions manuelles |
Préparations préparées (PDO) : $this->db->query($sql, array($val)); |
Évite l’injection SQL | Jamais concaténer directement les variables dans la requête SQL |
| Gestion des transactions | Garantit l’atomicité des opérations critiques (ex. : création de facture + écriture comptable) | Utiliser $db->begin(); … $db->commit(); ou $db->rollback(); dans les blocs où plusieurs tables sont modifiées |
| Vérifier le préfixe de table | Certains déploiements utilisent un préfixe personnalisé (my_llx_) |
Toujours récupérer le préfixe via $conf->db->prefix et l’utiliser dans les requêtes personnalisées |
| Sauvegarde / restauration | Protection contre perte de données | Planifier un dump quotidien + tests de restauration sur un serveur de staging |
3.2. Gestion des fichiers et de la configuration
- Chemin des fichiers (uploads, temp, logs) doit toujours être obtenu par
$conf->files->pathet non par des chaînes dures. - Permissions –
chmod 0755pour les répertoires,chmod 0644pour les fichiers. Unumaskmal configuré peut conduire à des fichiers non‑écriturables, générant des 500 Internal Server Error. - Configuration (
$confobject) – La plupart des paramètres sont stockés en base (llx_config) mais certains (ex. :$conf->global->date_format) doivent être synchronisés entre le serveur et le fichierconf/pour éviter les incohérences.
3.3. Gestion des plugins
- Installation : Utiliser le gestionnaire d’extensions (
pluginsadmin) qui crée des tables dédiées (llx_plugin_…). - Isolation : Même si un plugin crée des tables, ne jamais partager de préfixes de fonctions entre plugins.
- Compatibilité : Vérifier à chaque mise à jour du noyau que le déclaration d’API du plugin (
$plugin->version,$plugin->author) est compatible avec la version du framework. - Déploiement automatisé : Utiliser CI (GitLab CI, GitHub Actions) avec la commande
php bin/dolibarr_check.php(voir § 5) pour détecter les conflits de dépendances.
3.4. Gestion du cache et des sessions
| Technique | Détails | Astuce anti‑erreur |
|---|---|---|
| Cache interne (array) | Stockage des fichiers de langue, des traductions, du résultat de requêtes simples. | L’invalider après chaque déploiement (php bin/dolibarr_flush_cache.php) pour éviter les réponses obsolètes. |
| APCu / WinCache | Cache de résultats de requêtes lourdes (ex. : liste des articles) | Configurer dolibarr_cache_ttl à 1800 s (30 min). Si le serveur change de version de PHP, réinitialiser le cache (php bin/dolibarr_clear_cache.php). |
| Session | Stockage côté serveur des informations d’utilisateur (PHPSESSID). |
Régler session.gc_maxlifetime > durée d’inactivité souhaitée (ex. : 14400 s). Nettoyer régulièrement le dossier de session (rm -rf /var/lib/php/sess_*). |
4. Méthodologie de maintenance préventive
4.1. Cadence de mise à jour
| Type de mise à jour | Fréquence recommandée | Points de contrôle |
|---|---|---|
| Patch de sécurité (critical) | Immédiat dès publication | Tests de compatibilité + validation de la sauvegarde |
| Release majeure (nouvelle version 7.x → 8.x) | Tous les 2‑3 ans, mais planifier | – Vérifier les changements de tables ($db->list_tables()) – Exécuter php bin/dolibarr_check.php (voir § 5) – Réaliser une restauration test sur serveur de staging |
| Mise à jour mineure (ex. : 7.1.4 → 7.1.5) | Mensuel | – Vérifier les changements de traduction (strings) – Contrôler les dépendances de plugins |
4.2. Stratégie de sauvegarde & restauration
- Dump complet
mysqldump -u $user -p$pass dolibarr > backup.sql - Sauvegarde des fichiers : répertoire
htdocs/files(/var/www/dolibarr/files) →tar czf files.tar.gz files - Planification : Cron
0 2 * * * /usr/local/bin/dolibarr_backup.sh(exécution à 02 h) - Test de restauration sur serveur de staging :
php bin/dolibarr_restore.php backup.sql files.tar.gz
Bonne pratique : Conserver au moins 3 sauvegardes incrémentales (quotidiennes) et une sauvegarde mensuelle (full) avec rotation 30 jours.
4.3. Monitoring & alerting
| Outil | Métrique clé | Seuil d’alerte | Action recommandée |
|---|---|---|---|
| Prometheus + node_exporter | Temps moyen de requête SQL (mysql_global_status_threads_connected) |
> 200 ms sur 5 min | Optimiser les index ou augmenter le pool MySQL |
| Grafana | Taux d’erreurs PHP (error_log ligne PHP Fatal error) |
> 5 /heure | Examiner les logs, reproduire le scénario en dev |
| UptimeRobot | URL d’accès (/index.php?module=Admin&page=Home) |
Downtime > 1 min | Relancer Apache / PHP-FPM, vérifier les limites de ressources |
| ELK (Elasticsearch‑Logstash‑Kibana) | Nombre d’erreurs CSRF (CSRF token missing) |
> 10/heure | Vérifier la durée du cookie PHPSESSID et le timeout CSRF |
4.4. Tests automatisés
Dolibarr ne propose pas de Système de tests unitaires standardisé, mais il est possible de créer des suites de tests fonctionnels avec PHPUnit ou Behat :
- Installation de Behat :
composer require --dev behat/behat - Feature :
Feature: Facturation d’un client– scénarios de création de devis, validation des totaux, génération du PDF. - CI : Ajouter dans le pipeline
yamlune étapephp bin/dolibarr_behat_tests.phpqui inactive le serveur si des scénarios échouent.
5. Outils « Check‑list » pour détecter les anomalies
| Script | Description | Exemple d’utilisation |
|---|---|---|
php bin/dolibarr_check.php |
Analyse statique du core et des modules (détection de tables manquantes, fonctions non déclarées) | php bin/dolibarr_check.php --verbose |
php bin/dolibarr_flush_cache.php |
Vide tous les caches (array, APCu, etc.) | php bin/dolibarr_flush_cache.php |
php bin/dolibarr_clear_cache.php |
Supprime les fichiers temporaires (tmp/, cache/ ) |
php bin/dolibarr_clear_cache.php |
php bin/dolibarr_behat_tests.php |
Lance les scénarios Behat (si présents) | php bin/dolibarr_behat_tests.php |
php bin/dolibarr_upgrade_check.php |
Compare la structure actuelle avec le schéma de la version cible | php bin/dolibarr_upgrade_check.php 8.0.0 |
Astuce : Intégrer ces scripts dans le crontab de maintenance (
*/30 * * * * php /opt/dolibarr/bin/dolibarr_check.php >> /var/log/dolibarr_check.log 2>&1).
6. Bonnes pratiques de développement & déploiement
-
Environnement de test isolé
- Serveur dédié avec la même version de PHP (ex. : 8.2) et MySQL (8.0).
- Base de données déclara le même préfixe que la prod.
- Nécessité de réinitialiser le cache avant chaque test (
php bin/dolibarr_flush_cache.php).
-
Gestion des modules
- Désactiver les modules inutiles (
disableviapluginsadmin). - Vérifier que chaque module possède un
version.txtvalide et un$featurescorrectement déclaré.
- Désactiver les modules inutiles (
-
Personnalisation du code
- Ne jamais modifier les fichiers du répertoire
core/directement. - Utiliser les hooks (
$hook->addHookBefore/After) et les actions ($hook->addHook) pour ajouter du comportement. - Documenter chaque surcharge dans le dépôt Git (
README_custom.md).
- Ne jamais modifier les fichiers du répertoire
-
Tests de performance
- exécuter
ab -n 100 -c 10 http://app/dolibarr/index.php?module=Admin&page=Homeet analyser le temps moyen. - Optimiser les index des tables fréquemment interrogées (
llx_product,llx_categorie,llx_account).
- exécuter
- Documentation des procédures d’incident
- Créer un run‑book (ex. : « Si admin page renvoie 500, exécuter
php bin/dolibarr_check.php→ vérifier'fatal error'dans/var/log/apache2/error.log→ restaurer la sauvegarde précédente »).
- Créer un run‑book (ex. : « Si admin page renvoie 500, exécuter
7. Cas concret : Réduction d’un bug de synchronisation entre le module « Comptes bancaires » et la table des paiements
7.1. Description du bug
- Symptôme : Après création d’un paiement, le champ
datepétait parfoisNULL. - Cause : Le module
Bankingutilisait un hookfieldsetupqui remplissait la valeur, mais l’order of execution danspaiement.phpétait inversé.
7.2. Processus de correction (prévention)
- Reproduction – Créer un scénario Behat qui ajoute un paiement et vérifie le champ
datep. - Audit du flux – Insérer un
error_log('Hook start');dans le hook et observer la sortie viagrep. - Mise à jour du hook – Re‑ordonner les appels à
addHookAfter($topic, $class, $method). - Test – Relancer le scénario, la valeur
datepest désormais correctement remplie. - Documentation – Ajouter un commentaire dans le hook expliquant le pourquoi, et mettre à jour le CHANGELOG du module.
7.3. Résultat
- Bogue éliminé avant la mise en production, évitant ainsi un ticket support coûteux.
- Gain de confiance : Les équipes de dev voient clairement l’effet d’une petite modification sur un champ critique.
8. Conclusion
L’architecture de Dolibarr repose sur un core robuste couplé à un système de modules extensible. Cette modularité apporte de la flexibilité mais oblige les équipes à adopter une discipline rigoureuse en matière :
- de gestion de la base de données (transactions, requêtes préparées),
- de maintenance des fichiers et de la configuration,
- de déploiement contrôlé (staging → prod),
- et d’automatisation des checks (scripts de validation, CI, monitoring).
En suivant la méthodologie présentée — cadence de mise à jour planifiée, sauvegardes régulières, tests automatisés, et surveillance proactive — il est possible de réduire drastiquement le nombre d’erreurs fonctionnelles et d’offrir à vos utilisateurs une plateforme stable, sécurisée et pérenne.
Annexes utiles
| Ressource | Lien |
|---|---|
Référentiel officiel des tables llx_* |
https://github.com/Dolibarr/dolibarr/tree/master/core/modules |
| Guide de mise à jour (v7 → v8) | https://www.dolibarr.org/doc/7.0/upgrade |
| Bibliothèque de tests Behat (exemple) | https://github.com/elepe/Behat |
Exemple de script dolibarr_check.php |
https://github.com/Dolibarr/dolibarr/tree/master/bin |
| Docker‑Compose template pour dev | https://github.com/Dolibarr/docker-compose |
Bonne maintenance !
Cet article a été rédigé par l’équipe technique de Dolibarr Community, à jour au 03 novembre 2025.