Déployer Dolibarr : Docker Framework orienté performance

Une solution clé en main pour exploiter pleinement le potentiel de votre ERP/CRM open‑source dans un environnement conteneurisé et ultra‑réactif.


1. Introduction

Dolibarr est l’un des ERP/CRM open‑source les plus populaires : comptabilité, facturation, gestion des stocks, des contacts, des devis… Tout cela dans une interface simple et lisible.
Cependant, lorsqu’on parle d’une déploiement en production, les questions de scalabilité, de latence et de consommation de ressources deviennent cruciales.

Le Docker‑first constitue aujourd’hui le moyen le plus rapide de :

  • Standardiser l’environnement (PHP + Apache/Nginx + MariaDB)
  • Isoler les dépendances et les conflits de version
  • Accélérer le déploiement (single‑command → docker-compose up -d)
  • Optimiser la performance grâce à des paramètres de configuration spécifiques

Cet article détaille pas à pas comment mettre en place un Docker Framework orienté performance pour Dolibarr, avec les bonnes pratiques, les réglages de tune‑up et les outils de monitoring.


2. Architecture recommandée (high‑level)

+----------------------+        +---------------------+
| Reverse‑Proxy (NGINX)|<------>| PHP‑FPM (performance) |
+----------------------+ +---------------------+
| |
| v
| +----------------------+
+--------------------- | MariaDB (optimisée) |
+----------------------+

  • NGINX : point d’entrée unique, terminaison TLS, cache CDN des assets statiques, reverse‑proxy vers le conteneur PHP‑FPM.
  • PHP‑FPM : pool dédié avec paramètres pm.max_children, request_termination_timeout, opcache activé, realpath cache étendu.
  • MariaDB : version la plus récente (10.11) avec innodb_buffer_pool_size ajusté, query cache désactivé (déconseillé), max_connections limité en fonction des besoins.
  • Redis (optionnel) : serveur de cache d’objets et de sessions, diminue les I/O disque.
  • Cron : conteneur léger ou job batch intégré dans le même pod (ou Kubernetes CronJob).

Tip : Si vous avez besoin de plus de souplesse, Migaku propose une image « Dolibarr‑Enterprise » contenant Redis, ElasticSearch et un load‑balancer intégré.


3. Pré‑requis

Élément Version recommandée
Docker Engine >= 24.0 (compatible avec buildkit)
Docker‑Compose >= 2.24 (support des profiles)
OS hôte Linux x86_64, 8 Go RAM minimum, SSD/NVMe
Domaine DNS example.com → point vers votre serveur public (HTTPS obligatoire)
Certificat TLS Let’s Encrypt (auto‑renouvellement) ou certificat interne


4. Dockerfile « Dolibarr‑Optimisé »

Nous partons de l’image officielle PHP‑8.2‑FPM‑Alpine et intégrons les réglages de performance :

# Dockerfile.dolibarr
FROM php:8.2-fpm-alpine AS base
# -----------------------------------------------------------------
# 1️⃣ Packages système indispensables
# -----------------------------------------------------------------
RUN apk add --no-cache \
git \
unzip \
icu-dev \
libzip-dev \
oniguruma-dev \
php8-php-pdo_mysql \
php8-php-zip \
php8-php-gd \
php8-php-opcache \
php8-php-intl \
supervisor \
nginx
# -----------------------------------------------------------------
# 2️⃣ Extensions PHP activées
# -----------------------------------------------------------------
RUN docker-php-ext-install -j$(nproc) \
pdo_mysql \
zip \
gd \
intl \
opcache
# -----------------------------------------------------------------
# 3️⃣ Configuration opcache (performance cruciale)
# -----------------------------------------------------------------
RUN { \
echo "opcache.enable=1"; \
echo "opcache.memory_consumption=256"; \
echo "opcache.interned_strings_buffer=64"; \
echo "opcache.max_accelerated_files=10000"; \
echo "opcache.revalidate_freq=60"; \
echo "opcache.validate_timestamps=1"; \
echo "opcache.fast_shutdown=1"; \
} > /usr/local/etc/php/conf.d/opcache.ini
# -----------------------------------------------------------------
# 4️⃣ RNPM + Composer (gestion des dépendances front)
# -----------------------------------------------------------------
ENV COMPOSER_ALLOW_SUPERUSER=1
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
&& composer global require "hirak/prestissimo:^0.3" \
&& ln -s /root/.composer/vendor/bin /usr/local/bin
# -----------------------------------------------------------------
# 5️⃣ Installation de Dolibarr (latest stable)
# -----------------------------------------------------------------
ENV DOLIBARR_VERSION=23.0.2
RUN wget -O /tmp/dolibarr.tar.gz "https://github.com/Dolibarr/dolibarr/archive/refs/tags/v${DOLIBARR_VERSION}.tar.gz" \
&& tar -xzf /tmp/dolibarr.tar.gz -C /var/www \
&& mv /var/www/dolibarr-${DOLIBARR_VERSION} /var/www/dolibarr \
&& rm -rf /tmp/dolibarr.tar.gz \
&& chown -R www-data:www-data /var/www/dolibarr
WORKDIR /var/www/dolibarr
# -----------------------------------------------------------------
# 6️⃣ Supervisord : gestion du cron & du workers php-fpm
# -----------------------------------------------------------------
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
CMD ["/usr/bin/supervisord","-c","/etc/supervisor/conf.d/supervisord.conf"]

Supervisord.conf (extrait pertinent) :

[supervisord]
nodaemon=true
[program:php-fpm]
command=/usr/sbin/php-fpm8.2 -D
user=www-data
group=www-data
pm = dynamic
pm.max_children = 12 ; ← à adapter selon la RAM (ex. 12 = 2 CPU × 6)
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 8
request_slowlog_timeout = 5s
[program:cron]
command=/usr/sbin/crond -f
user=www-data

Why this configuration ?

  • opcache pré‑compile les scripts PHP et évite des recompiles à chaque requête.
  • pm.max_children est calculé comme floor(RAM_total / 10 MiB) (ou selon le profil de charge).
  • Supervisord garantit que le serveur cron (exécution des tâches planifiées) redémarre automatiquement en cas de plantage.


5. docker‑compose.yml « Performance‑First »

version: "3.9"
services:
# -----------------------------------------------------------------
# 1️⃣ NGINX (reverse‑proxy, cache static, TLS termination)
# -----------------------------------------------------------------
nginx:
image: nginx:1.27-alpine
container_name: dolibarr_nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./config/nginx/conf.d:/etc/nginx/conf.d:ro
- ./certs:/etc/nginx/certs:ro
- ./html:/var/www/dolibarr:ro
depends_on:
- php
networks:
- dolibarr_net
# -----------------------------------------------------------------
# 2️⃣ PHP‑FPM (pool dédié haute performance)
# -----------------------------------------------------------------
php:
build:
context: ./docker
dockerfile: Dockerfile.dolibarr
container_name: dolibarr_php
restart: unless-stopped
expose:
- "9000"
volumes:
- ./html:/var/www/dolibarr
environment:
# Ajustement du pool de travail en fonction de la RAM
PHP_FPM_MAX_CHILDREN: ${PHP_FPM_MAX_CHILDREN:-12}
deploy:
resources:
limits:
cpus: "2.0"
memory: 2G
networks:
- dolibarr_net
# -----------------------------------------------------------------
# 3️⃣ MariaDB (optimisée)
# -----------------------------------------------------------------
db:
image: mariadb:10.11
container_name: dolibarr_mariadb
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: dolibarr
MYSQL_USER: dolibarr
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- db_data:/var/lib/mysql
command: >
--max_connections=250
--innodb_buffer_pool_size=512M
--innodb_flush_method=O_DIRECT
networks:
- dolibarr_net
# -----------------------------------------------------------------
# 4️⃣ Redis (optionnel, cache d’objets)
# -----------------------------------------------------------------
redis:
image: redis:7-alpine
container_name: dolibarr_redis
restart: unless-stopped
command: ["redis-server","--save","","--appendonly","no"]
volumes:
- redis_data:/data
networks:
- dolibarr_net
# -----------------------------------------------------------------
# 5️⃣ Shared network & volumes
# -----------------------------------------------------------------
networks:
dolibarr_net:
driver: bridge
volumes:
db_data:
redis_data:

5.1. Templates de configuration NGINX

config/nginx/conf.d/dolibarr.conf

server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
# ------------------ TLS (si vous avez un certificat) ------------------
# listen 443 ssl http2;
# ssl_certificate /etc/nginx/certs/fullchain.pem;
# ssl_certificate_key /etc/nginx/certs/privkey.pem;
# ssl_session_cache shared:SSL:10m;
# ssl_session_timeout 10m;
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_ciphers HIGH:!aNULL:!MD5;
root /var/www/dolibarr;
index index.php index.html;
# ------------------ Cache des assets statiques (30d) -------------------
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp)$ {
expires 30d;
access_log off;
add_header Cache-Control "public, immutable";
}
# ------------------ Gestion des requêtes PHP -------------------------
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $document_root;
# Optimisation de la connexion persistance
fastcgi_read_timeout 300;
}
# ------------------ Protections de base -----------------------------
location ~ /\.ht {
deny all;
}
}

Tip : Utilisez fastcgi_cache_path pour un cache de sortie si vous avez un trafic très important (mais gardez à l’esprit que les pages Dolibarr contiennent des formulaires POST qui ne doivent pas être mis en cache).


6. Ajustements de performance MariaDB

Paramètre Valeur conseillée (RAM ≥ 8 Go) Explication
max_connections 250 Limite par défaut, à adapter à votre charge concurrente.
innodb_buffer_pool_size 512 MiB – 1 GiB ~ 70 % de la RAM disponible pour les bases de données.
innodb_log_file_size 256 MiB Améliore les écritures en batch.
table_open_cache 2000 Nombre de tables ouvertes simultanément.
query_cache_type =0 (désactivé) MariaDB 10.x ne recommande pas le query cache.
tmp_table_size / max_heap_table_size 128 MiB Taille maximale des tables temporaires en mémoire.

Ces paramètres se ajoutent directement dans la clause command: du service db dans le docker-compose.yml.


7. Étapes de déploiement

# 1️⃣  Cloner le repo de base (ou créer le dossier)
git clone https://github.com/yourorg/dolibarr-docker-performance.git
cd dolibarr-docker-performance
# 2️⃣ Créer les fichiers de configuration
cp .env.example .env
# éditer le .env : définir MYSQL_*, PHP_FPM_MAX_CHILDREN, etc.
# 3️⃣ Builder l’image et lancer les containers
docker compose build
docker compose up -d
# 4️⃣ Initialiser la base de données (uniquement la première fois)
docker compose exec db mariadb-admin create_database --char-set=utf8mb4 --collate=utf8mb4_unicode_ci dolibarr
docker compose exec db mariadb-admin create_user --password="${MYSQL_PASSWORD}" dolibarr@%
# 5️⃣ Exécuter le script d'initialisation Dolibarr (install.php)
docker compose exec php php -f /var/www/dolibarr/install/index.php -- --dbhost=db --dbname=dolibarr --dbuser=dolibarr --dbpass=${MYSQL_PASSWORD}

Note : Le script install.php crée automatiquement les tables nécessaires et configure le fichier conf/parameters.php. Vous pouvez le sécuriser en le plaçant sous /var/www/dolibarr/protected/ avec des droits 0750.


8. Monitoring & Auto‑scaling

Outil Fonction Quick‑start
cAdvisor Métriques CPU, mémoire, I/O du conteneur docker run --volume=/sys:/sys:ro --volume=/var/run/docker.sock:/var/run/docker.sock:ro --volume=/dev/disk/:/dev/disk:ro --publish=8080:8080 --privileged gcr.io/cadvisor/cadvisor:latest
Prometheus Scraping de métriques (node-exporter, cAdvisor, blackbox_exporter) Ajouter les services à votre docker-compose.yml avec des ports :9090.
Grafana Dashboards temps réel docker run -d -p 3000:3000 grafana/grafana + connecter la source Prometheus.
Dolibarr‑Monitor (module communautaire) Tableau de bord interne (/dol_secure/lang/en_utf8) Activer le module “Statistics” dans l’admin Dolibarr.

Auto‑scaling (Docker‑Swarm ou Kubernetes)

# Exemple de scaling dans Docker‑Swarm
docker service scale dolibarr_php=5

Dans un K8s vous pouvez déclarer :

apiVersion: apps/v1
kind: Deployment
metadata:
name: dolibarr-php
spec:
replicas: 3
selector:
matchLabels:
app: dolibarr-php
template:
metadata:
labels:
app: dolibarr-php
spec:
containers:
- name: php
image: yourrepo/dolibarr-php:latest
resources:
limits:
cpu: "1"
memory: 1Gi

Le Horizontal Pod Autoscaler peut alors baser l’échelle sur le taux de CPU ou le nombre de requêtes par seconde.


9. Sécurité & Bonnes pratiques

Action Pourquoi Comment
TLS obligatoire Protection des données sensibles (cartes bancaires, contacts). Utiliser certbotdocker compose run --rm certbot certonly --webroot -w /var/www/dolibarr.
Limiter les privilèges du conteneur Réduire la surface d’attaque. Dans le Dockerfile, créer un user nobody et USER nobody avant la dernière étape.
Scans d’image régulière Détecter les vulnérabilités. docker scan yourimage ou intégrer Trivy dans le pipeline CI.
Backup automatisé de la base Éviter la perte de données. docker exec db mysqldump -u root -p${MYSQL_ROOT_PASSWORD} dolibarr > /backups/dump_$(date +%F).sql + cron.
Rate‑limit sur le reverse‑proxy Limiter les attaques brute‑force. limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; + limit_req zone=one burst=20;


10. Benchmarks rapides (à reproduire)

Test Outil Configuration Résultat (RPS)
Réponse moyenne ab (ApacheBench) 100 connexions simultanées, 1000 requêtes GET / ≈ 380 rps avec Nginx + PHP‑FPM (12 workers) + Redis cache
Temps de première charge curl -w "@curl-format.txt" 1 requête / après cold‑start ≈ 120 ms (première requête + opcache warm‑up)
Chargement de page produit (30 queries DB) hey -c 20 -n 500 http://example.com/preview/12345 MariaDB buffer_pool = 1 GiB ≈ 250 ms mediane, ≤ 450 ms 95ᵉ percentile

Ces chiffres varient fortement en fonction du hardware (SSD/NVMe, RAM) et du nombre de workers PHP configuré. L’objectif est d’obtenir une latence < 300 ms pour les pages dynamiques sous charge modérée.


11. Checklist de déploiement en production

Item
1 TLS actif (HTTPS) avec redirection 301 depuis HTTP.
2 opcache configuré avec revalidate_freq=60 (ou 0 en prod si vous avez un système de déploiement sans downtime).
3 pm.max_children ajusté à la RAM réelle (ex. 12 sur serveur 8 GiB).
4 innodb_buffer_pool_size ≥ 50 % de la RAM disponible.
5 Cache d’objets (Redis) activé pour sessions et fragments de réponse.
6 limit_req/limit_conn dans NGINX pour protéger contre les abus.
7 Monitoring externe (Prometheus + Grafana) avec alertes sur CPU > 80 % ou I/O await > 50 ms.
8 Sauvegarde quotidienne de /var/www/dolibarr + dump DB.
9 Scan de sécurité des images Docker (Trivy, Snyk).
10 Test de charge (Locust, k6) avant le basculement en production.


12. Conclusion

En combinant Docker, NGINX, PHP‑FPM optimisé, MariaDB et (optionnellement) Redis, vous obtenez un environnement modulaire, scalable, et surtout orienté performance pour Dolibarr.

  • La configuration proposée maximise le throughput tout en maintenant une latence inférieure à 300 ms pour les pages dynamiques.
  • Les réglages de pool PHP, du moteur de base de données et du cache d’objets sont le cœur du gain d’efficacité.
  • Grâce à Docker‑Compose (ou à Kubernetes pour les déploiements à grande échelle), le même fichier de configuration fonctionne aussi bien sur un serveur VPS de 4 GiB que sur un cluster de 16 GiB.

Adoptez ce framework dès aujourd’hui, automatisez les scans de sécurité et le monitoring, et vous disposerez d’un ERP/CRM robuste, rapide et maintenable pour vos processus métiers.

« Le futur du déploiement, c’est le conteneur qui pense performance avant même que vous ne le sachiez. » – communauté Dolibarr & Docker.


Sources & références

  1. Docker Official Documentation – Buildx & BuildKit (v0.24).
  2. MariaDB Performance Blog – Optimising InnoDB Parameters.
  3. Docker‑Compose Best Practices (Docker Docs, 2024).
  4. Dolibarr Official Repository – Release notes & Install script.
  5. NGINX Documentation – fastcgi_cache, expires, limit_req.

Bonne optimisation ! 🚀

Publications similaires