Version : 1.0 – 3 Novembre 2025
1. Introduction
Dolibarr est un ERP/CRM open‑source très répandu pour les PME et les associations. Sa simplicité d’installation et son architecture modulaire en font une solution idéale pour être mise en production rapidement.
Toutefois, comme tout logiciel serveur, la performance (cache, temps de réponse) et la sécurité (protection des données, durcissement de l’environnement) doivent être pensées dès le déploiement.
Cet article propose :
- Les mécanismes de cache les plus pertinents pour Dolibarr.
- Les bonnes pratiques d’administration en production.
- Une approche de sécurité « defense‑in‑depth » adaptée à Dolibarr.
2. Architecture de Déploiement Type
| Couche | Technologie recommandée | Rôle |
|---|---|---|
| Web server | Nginx (ou Apache) configuré en mode reverse‑proxy + PHP‑FPM | Serve les requêtes, termine TLS, distribue les appels à PHP‑FPM. |
| Exécution PHP | PHP 8.2 (ou 8.3) + PHP‑FPM | Interprète le code Dolibarr. |
| Cache d’opcodes | OPcache (extension PHP) | Cache les scripts compilés. |
| Cache de données | APCu (pour les sessions et variables temporaires) ou Redis (cache partagé multi‑instances) | Accélère les requêtes PHP qui manipulent des tableaux. |
| Cache HTTP | Varnish ou NGINX FastCGI Cache | Met en cache les pages publiques (catalogue, listes, etc.). |
| Base de données | MySQL 8 / MariaDB 10.6 ou PostgreSQL 15 | Persistance des données. |
| Stockage de fichiers | Répertoire dédié (files/), souvent en tmpfs ou sur un volume GFP (Growth‑FS) partagé |
Pièces jointes, fichiers générés. |
| Superviseur | systemd, Supervisor, ou pm2 (pour les workers background) | Assure la redémarrage automatique. |
| HTTPS | Let’s Encrypt (certificat auto‑renouvelé) + HSTS | Sécurisation du transport. |
Schéma simplifié
Client ── HTTPS ──► Nginx ──► PHP‑FPM ──► OPcache/APCu/Redis ──► MySQL/PostgreSQL
3. Mise en Place du Cache dans Dolibarr
3.1. Cache d’OPcache (PHP)
; php.ini
opcache.enable=1
opcache.enable_cli=0 ; on désactive sur la CLI
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1 ; 1 = vérifier la date des fichiers (production)
opcache.revalidate_freq=60 ; 60 s → rafraîchit le cache si un fichier change
opcache.fast_shutdown=1
Impact : compilation PHP évitée à chaque requête, réduction de 30‑50 % du temps de response.
3.2. Cache APCu (variables PHP)
Utilisé par défaut dans l’installation de plusieurs extensions Dolibarr (ex : dolibarr_cart) :
// Dans config.php ou un fichier d'init
$setup['SYS']['CACHE_TYPE'] = 'APCu';
$setup['SYS']['CACHE_APC_ENABLED'] = 1;
Bonne pratique : désactiver le cache de sessions stockées en fichiers (session.save_handler) au profit d’Redis ou APCu pour éviter les verrous PHP.
3.3. Cache HTTP (Varnish / NGINX FastCGI Cache)
3.3.1. Exemple de configuration NGINX FastCGI Cache
# /etc/nginx/conf.d/dolibarr-cache.conf
fastcgi_cache_path /var/cache/nginx/dolibarr levels=1:2 keys_zone=DOLI:100m inactive=60m use_temp_path=off;
fastcgi_cache_key $scheme$host$request_uri;
server {
listen 443 ssl http2;
server_name dolibarr.example.com;
ssl_certificate /etc/letsencrypt/live/dolibarr.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dolibarr.example.com/privkey.pem;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS $https;
# Active le cache uniquement pour les méthodes GET
if ($request_method !~ ^(GET|HEAD)$) {
set $fastcgi_no_cache 1;
}
# Cache les pages publiques (ex : /index.php?main=...), exclure l’admin
if ($request_uri ~* "main=List") {
set $fastcgi_no_cache 0;
}
fastcgi_cache_bypass $fastcgi_no_cache;
fastcgi_cache dolibarr_cache;
fastcgi_cache_valid 200 10m;
fastcgi_cache_use_stale error timeout updating;
}
}
Notes
- Exclusion : le dossier
adminne doit jamais être mis en cache (sécurité). - Headers : ajouter
Cache-Control: private, no-storeaux pages sensibles pour forcer le non‑cache des navigateurs.
3.3.2. Option Varnish (alternative)
vcl 4.0;
backend default {
.host = "127.0.0.1";
.port = "8080";
}
sub vcl_recv {
if (req.url ~ "^/admin") {
deny;
}
}
sub vcl_backend_response {
if (resp.status == 403) {
set beresp.ttl = 0s;
return (deliver);
}
}
Bonus : Varnish permet de configurer des bans (ban req.url == "/index.php" ) pour rafraîchir rapidement les pages critiques.
3.4. Cache des pièces jointes
- Stockage en dehors du webroot (
/var/www/dolibarr/files/) - Serveur de fichiers dédié (ex : MinIO en mode “gateway”) ou simplement Nginx
X-Accel-Redirectpour débloquer la lecture directement par le web server avec authentification.
location /files/ {
internal;
alias /var/www/dolibarr/files/;
# Authentification HTTP BASIC ou token URL signé
}
4. Bonnes Pratiques de Production
| Domaine | Action | Pourquoi |
|---|---|---|
| Mise à jour | Planifier des patches mensuels (Dolibarr + dépendances PHP) | Réduire la surface d’attaque. |
| Versionnage | Utiliser Git avec tag v7.5-production et CI/CD (GitLab CI) |
Garantir traçabilité et rollback rapide. |
| Configuration | Centraliser les paramètres sensibles (db.conf, dolibarrcfg.php) via Ansible ou Terraform |
Éviter les erreurs manuelles. |
| Tests | Suite d’intégration automatisée (PHPUnit, Behat) sur un environnement staging. | Détecter les régressions fonctionnelles avant mise en production. |
| Monitoring | – Prometheus + Grafana (latence, erreur 5xx) – ELK ou Graylog (logs) |
Détection précoce d’anomalies. |
| Sauvegarde | 1. DB : mysqldump --single-transaction (ou pg_dump). 2. Files : rsync vers un bucket S3 glacier. 3. Cron : quotidien + rétention 30 jours. |
Récupération en < 15 min. |
| Logs | error_log PHP → syslog; access.log Nginx → rotation (logrotate). |
Traçabilité des accès & erreurs. |
| Gestion des sessions | Utiliser Redis (session.save_handler = redis) avec TLS. |
Empêcher le vol de session. |
| Permissions | – Répertoire files/ en 0750 (propriétaire du Web) – config.php en 0640 (root uniquement) – dolibarr.conf en 0600 |
Limiter l’accès en écriture aux seules parties nécessaires. |
| Hardening PHP | Désactiver allow_url_fopen, expose_php, disable_functions critiques (exec, shell_exec, proc_open). |
Réduire les vecteurs d’attaque. |
| Sécurité du serveur | – Désactiver les comptes inutiles. – Appliquer Fail2Ban pour bloquer les tentatives de brute‑force (ex: /admin.php). |
Bloquer les attaques de force brute. |
5. Approche Sécurité « Défense en profondeur »
5.1. Sécurisation du réseau
| Action | Détails |
|---|---|
| Segmentation | Placer Dolibarr sur un VLAN dédié, uniquement accessible depuis le reverse‑proxy des applications métier. |
| Firewall | Bloquer tout port autre que 80/443 vers le serveur. Autoriser seulement les IP du load‑balancer interne si vous en avez un. |
| VPN | Autoriser les accès uniquement via un réseau VPN ou accès Zero‑Trust (ex: Cloudflare Access). |
5.2. Protection des applications
| Technique | Mise en œuvre |
|---|---|
| TLS 1.3 & HSTS | add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; |
| Headers de sécurité | Content-Security-Policy, X-Content-Type-Options: nosniff, X-Frame-Options: SAMEORIGIN. |
| CSRF Protection | Dolibarr possède déjà un token CSRF ($sess->protectontiplication) — assurez‑vous que la session est sécurisée (cookie Secure; HttpOnly). |
| Rate‑limiting | Utiliser limit_req_zone (NGINX) ou mod_evasive (Apache) pour limiter les appels POST /admin.php. |
| Scanning de vulnérabilités | Intégrer OWASP ZAP ou Nikto dans le pipeline CI/CD. |
| Gestion des droits | – Permissions minimalistes sur les tables SQL (ex.: SELECT/INSERT uniquement pour l’utilisateur dédié). – Revocation de FILE privilege si vous ne lisez pas de fichiers serveur. |
| Audits de configuration | – Désactiver display_errors en production (php.ini: display_errors = Off). – Activer log_errors et pointer vers un fichier dédié. |
5.3. Hardening de la base de données
| Paramètre | Valeur recommandée |
|---|---|
bind-address |
127.0.0.1 (ou uniquement l’IP du serveur web) |
max_connections |
Limité à la charge prévisionnelle (ex.: 150) |
sql_mode |
STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
innodb_file_per_table |
Activer pour économiser les IOPS |
| User | Un compte dédié dolibarr_user avec SELECT,INSERT,UPDATE uniquement sur les bases nécessaires. |
6. Checklist de Déploiement en Production
| ✅ | Action |
|---|---|
| 1 | Compiler/installer PHP 8.2 avec OPcache, APCu, pdo_mysql/pdo_pgsql. |
| 2 | Configurer php.ini – désactiver expose_php, allow_url_fopen, disable_functions. |
| 3 | Stocker config.php en chmod 0600 et hors du répertoire web. |
| 4 | Créer le virtual host NGINX avec TLS (Let’s Encrypt) et activer HSTS. |
| 5 | Configurer FastCGI cache (ou Varnish) – exclure /admin, /index.php?main=User. |
| 6 | Activer OPcache + Ajuster memory_consumption selon le nombre de fichiers. |
| 7 | Installer Redis et configurer session.save_handler = redis. |
| 8 | Créer la base de données avec un user limité. |
| 9 | Rendre read‑only le répertoire files/ pour le serveur web (chmod 750). |
| 10 | Mettre en place logrotate pour les logs PHP/Nginx. |
| 11 | Planifier des backups incrémentaux (DB + files) et tester la restauration. |
| 12 | Configurer Prometheus + Grafana et créer un dashboard “Dolibarr KPI”. |
| 13 | Intégrer Fail2Ban avec une jail dolibarr.conf (bannir /admin.php répété). |
| 14 | Exécuter OWASP ZAP scan et corriger toutes les vulnérabilités critiques. |
| 15 | Documenter les procédures de rollback et de mise à jour. |
7. Exemple de Script d’Initialisation (Ansible)
- name: Deploy Dolibarr – Production
hosts: dolibarr_srv
become: yes
vars:
dolibarr_version: "23.0.3"
php_version: "8.2"
db_name: "dolibarr"
db_user: "dolibarr_user"
db_pass: "{{ vault_db_pass }}"
tasks:
- name: Install required packages
apt:
name:
- nginx
- php-fpm
- php-{{ php_version }}-opcache
- php-{{ php_version }}-apcu
- php-{{ php_version }}-redis
- mariadb-client
- certbot
state: present
- name: Download Dolibarr source
get_url:
url: "https://github.com/Dolibarr/dolibarr/archive/refs/tags/v{{ dolibarr_version }}.tar.gz"
dest: "/tmp/dolibar-{{ dolibarr_version }}.tar.gz"
checksum: "sha256:{{ checksum_url }}"
- name: Extract & install
unarchive:
src: "/tmp/dolibar-{{ dolibarr_version }}.tar.gz"
dest: /var/www/
remote_src: yes
creates: /var/www/dolibarr
- name: Set permissions
file:
path: "{{ item.path }}"
owner: www-data
group: www-data
mode: "{{ item.mode }}"
loop:
- { path: /var/www/dolibarr, mode: "0755" }
- { path: /var/www/dolibarr/files, mode: "0750" }
- name: Configure nginx site
template:
src: dolibarr.conf.j2
dest: /etc/nginx/sites-available/dolibarr.conf
owner: root
group: root
mode: "0644"
notify: Reload nginx
- name: Enable PHP CLI cache settings
lineinfile:
path: /etc/php/{{ php_version }}/fpm/php.ini
regexp: '^opcache\\.'
line: 'opcache.enable=1'
state: present
notify: Restart php-fpm
- name: Create db and user
mysql_db:
name: "{{ db_name }}"
state: present
become_user: mysql
vars:
mysql_root_password: "{{ vault_mysql_root }}"
mysql_user: "{{ db_user }}"
mysql_password: "{{ db_pass }}"
mysql_host: "localhost"
- name: Copy config.php (secure)
template:
src: config.php.j2
dest: /var/www/dolibarr/htdocs/config.php
owner: www-data
group: www-data
mode: "0600"
(Le template dolibarr.conf.j2 inclut le bloc de cache FastCGI présenté plus haut).
8. Conclusion
Dolibarr peut être exécuté en production de façon fiable, rapide et sécurisée dès lors que l’on met en place :
- Un stack de cache complet – OPcache + APCu + (optionnel) FastCGI Cache/Varnish – afin de réduire la latence et de protéger le serveur de charge.
- Des bonnes pratiques d’administration – versionnage, sauvegardes, monitorage, permissions strictes – pour garder le système stable sur le long terme.
- Une approche de sécurité en profondeur – TLS, headers de sécurité, segmentations réseau, contrôles d’accès à la base de données, et audit continu des vulnérabilités.
En suivant la checklist et les exemples de configuration présentés, vous disposerez d’un déploiement Dolibarr résilient, performant et conforme aux exigences de sécurité des environnements d’entreprise modernes.
Bon déploiement ! 🚀