Dolibarr en production : reverse proxy et bonnes pratiques pour réduire les erreurs

Par [Votre Nom] – 3 novembre 2025


1. Pourquoi placer un reverse‑proxy devant Dolibarr ?

Dolibarr est une suite de gestion d’entreprise (ERP/CRM) écrite en PHP. En production, il est rarement exécuté directement derrière le port 80/443 du serveur web :

Avantage du reverse‑proxy Impact concret sur Dolibarr
Terminaison TLS centralisée Un seul certificat, mise à jour simple.
Réécriture d’URL & routage Gestion des pretty URLs et redirection des requêtes d’API.
Load‑balancing Distribution sur plusieurs instances (horizontal scaling).
Cache & compression Réduction du temps de réponse, économies de bandwidth.
Protection du serveur d’application Masquage de la version PHP, désactivation d’options inutiles.
Journalisation fine Logs séparés par client, chaque requête peut être enrichie (IP,=user‑agent, etc.)

Dans la plupart des déploiements Docker/Kubernetes ou même sur un VPS, le reverse‑proxy devient le « point d’entrée » unique et le seul composant exposé publiquement.


2. Architecture type

┌───────────────────┐    HTTPS   ┌───────────────┐
│ Navigateur client │ ────────► │ Reverse‑proxy│
│ (Chrome, etc.) │ │ (NGINX/Apache)│
└───────────────────┘ └─────┬─────┬─────┘
│ │
│ HTTP (LAN)
▼ ▼
┌─────────────────────┐
│ Conteneur Dolibarr│
│ (PHP‑FPM + DB) │
└─────────────────────┘

Le reverse‑proxy écoute uniquement sur les ports 80 / 443. Tout le trafic est redirigé vers le conteneur qui exécute Dolibarr.


3. Choix du reverse‑proxy : Nginx ou Apache ?

Critère Nginx Apache
Gestion des requêtes statiques Very fast, low memory Correct, mais plus lourd
Configuration TLS Simple, ssl_certificate/ssl_certificate_key Possible, mais nécessite mod_ssl + mod_rewrite
Modifications « hot‑reload » nginx -s reload (léger) apachectl graceful (plus lourd)
Support du HTTP/2 & HTTP/3 Nativement Via modules (mod_http2)

Conclusion : En production, Nginx est généralement recommandé pour sa légèreté, son efficacité TLS et sa gestion simple des limites de connexion.


4. Configuration Nginx idiomatique pour Dolibarr

Note : Les snippets sont valables pour une installation Docker‑compose ou pour un serveur « bare‑metal ». Ajustez les chemins, versions et paramètres de sécurité en fonction de votre contexte.

4.1. Directive globale de sécurité

# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
http {
# --- Sécurité TLS (TLS 1.3 recommandé) ---
ssl_protocols TLSv1.3 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384";
# HSTS (30 jours, évolutif)
add_header Strict-Transport-Security "max-age=2592000; includeSubDomains; preload" always;
# Désactiver les en‑têtes inutiles
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
# Limiter la taille des requêtes (prévention DoS)
client_max_body_size 10M;
client_body_timeout 60s;
client_header_timeout 60s;
# Cache
gzip on;
gzip_vary on;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
# Journalisation détaillée
log_format dolibarr_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time';
access_log /var/log/nginx/dolibarr_access.log dolibarr_log;
error_log /var/log/nginx/dolibarr_error.log warn;
}

4.2. Bloc de virtualhost dédié à Dolibarr

# /etc/nginx/sites-available/dolibarr.conf
server {
listen 80;
listen 443 ssl http2;
server_name dolibarr.mondomaine.com;
# Certificate (Let's Encrypt ou interne)
ssl_certificate /etc/letsencrypt/live/dolibarr.mondomaine.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dolibarr.mondomaine.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/dolibarr.mondomaine.com/chain.pem;
# Redirection HTTP → HTTPS
if ($scheme = http) {
return 301 https://$host$request_uri;
}
# Root du conteneur (Docker) : /var/www/dolibarr
root /var/www/dolibarr;
index index.php index.html;
# --- Limiter l’accès aux fichiers sensibles ---
location ~* \.(php|log|env|sqlite|htaccess)$ {
deny all;
access_log off;
log_not_found off;
}
# --- Gestion des requêtes PHP avec PHP‑FPM ---
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/run/php-fpm/dolibarr.sock; # socket du service PHP‑FPM
fastcgi_param SCRIPT_FILENAME $root$fastcgi_script_name;
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_keep_conn on;
}
# --- Tous les autres chemins (HTML, assets, etc.) ---
location / {
try_files $uri $uri/ /index.php$args;
}
# --- Logs dédiés ---
access_log /var/log/nginx/dolibarr.access.log dolibarr_log;
error_log /var/log/nginx/dolibarr.error.log warn;
}

Points clés à retenir

Élément Pourquoi c’est important
client_max_body_size Empêche les uploads de fichiers trop gros qui satureraient la mémoire du conteneur.
deny all sur les extensions sensibles Bloque les tentatives de lecture de fichiers de configuration, de logs ou la base SQLite.
X-Frame-Options & X-XSS-Protection Protection contre les Clickjacking et les attaques XSS.
HSTS Oblige le navigateur à utiliser toujours HTTPS, même après le premier accès.
log_format détaillé Le temps de réponse (rt=) facilite la détection de requêtes lentes ou bloquantes.


5. Bonnes pratiques « anti‑erreurs »

5.1. Limitation du nombre de connexions

# Dans le bloc server {}
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 100; # 100 connexions simultanées par IP

Alors que beaucoup de visiteurs provenant d’une même adresse IP ne dépasseront pas 100 connexions, cela protège contre les abusive DoS depuis un même poste.

5.2. Délai d’attente des backends (timeouts)

proxy_connect_timeout   3s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;

Ces valeurs doivent être supérieures à la configuration PHP‑FPM (request_terminate_timeout) et à la durée maximale d’une requête d’upload de fichier.

5.3. Gestion des erreurs HTTP → Redirection vers une page d’erreur stylée

error_page 404 /errors/404.html;
location = /errors/404.html {
internal;
root /var/www/dolibarr;
}

Dolibarr possède déjà un répertoire errors/ avec des templates HTML. Utilisez‑les pour éviter les « pages blanches ».

5.4. Désactiver le autoindex et filtrer les fichiers .htaccess

server_tokens off;                # Ne pas afficher la version Nginx
location ~ /\.ht {
deny all;
log_not_found off;
}

5.5. Sécuriser les sessions PHP

  • Placez session.save_path sur un volume partagé (exemple : /var/lib/php/sessions) accessible uniquement par l’utilisateur du conteneur.
  • Ajoutez dans php.ini :

session.cookie_httponly = 1
session.cookie_secure = 1 ; obligatoire si vous avez HSTS
session.gc_maxlifetime = 2592000 ; 30 jours


6. Monitoring & alerting des erreurs en production

Outil Ce qu’il collecte Configuration minimale
Prometheus + node_exporter Métriques Nginx (nginx_connections_*, nginx_http_current_connections) Règle up{job="nginx"} == 1
Grafana Dashboard de latence (rt), taux d’erreurs 5xx Panel “If error > 5% → Alert”
ELK (Filebeat + Logstash + Kibana) Centralisation des logs Nginx et PHP‑FPM Filtre nginx_error → Severity ERROR
Healthcheck HTTP Vérifie que /status.php (ou /index.php) renvoie 200 Script cron qui ping toutes les 5 s et envoie un webhook en cas d’échec.

Tip : Ajoutez dans le bloc server :

# expose un endpoint léger pour le healthcheck
location = /nginx_status {
stub_status on;
allow 127.0.0.1;
deny all;
}

Ce endpoint est ensuite interrogé par votre solution de monitoring (Prometheus exporter nginx-prometheus-exporter).


7. Tests de configuration et validation avant le déploiement

  1. Syntax Check
    sudo nginx -t
  2. Reload sans perte de connexion
    sudo systemctl reload nginx
  3. Curl de points critiques
    curl -I -s -o /dev/null -w "%{http_code} %{url_effective}\n" https://dolibarr.mondomaine.com/
    # → Doit renvoyer 200 ou 308 (si redirection)
  4. Vérification du titre de la page
    curl -s https://dolibarr.mondomaine.com/ | grep -i "<title>"
  5. Test de charge minimal (ab ou wrk)
    wrk -t10 -c100 -d30s https://dolibarr.mondomaine.com/
  6. Audit des en‑têtes HTTP
    curl -I https://dolibarr.mondomaine.com/
    # Recherchez X-Content-Type-Options, X-Frame-Options…


8. Exemple complet d’un docker‑compose.yml

version: "3.9"
services:
nginx:
image: nginx:latest
container_name: dolibarr_nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./conf:/etc/nginx/conf.d
- ./html:/var/www/dolibarr
- ./logs/nginx:/var/log/nginx
depends_on:
- php
php:
image: php:8.2-fpm-alpine
container_name: dolibarr_php
restart: always
environment:
PHP_INI_SCAN_DIR: /conf.d
volumes:
- ./html:/var/www/dolibarr
- ./logs/php-fpm:/var/log/php-fpm
command: ["php-fpm", "--fpm-config", "/usr/local/etc/php-fpm.conf"]
db:
image: mariadb:10.11
container_name: dolibarr_mariadb
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: dolibarr
MYSQL_USER: dolibarr
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- ./data/db:/var/lib/mysql
- ./conf/mysql:/etc/mysql/conf.d
networks:
default:
driver: bridge

Le fichier conf/nginx/default.conf est exactement celui présenté à la section 4.2, monté dans le conteneur nginx.


9. Checklist de mise en production

Action
1 Générer un certificat Let’s Encrypt pour dolibarr.mondomaine.com.
2 Chiffrer les communications internes (docker network) avec tls ou IPsec si besoin.
3 Activer HSTS (max-age=63072000 si vous avez confiance en vos utilisateurs).
4 Configurer le rate limiting (limit_req_zone) si le trafic public dépasse 500 rps.
5 Mettre en place un backup de la base de données (mariadb dump quotidien).
6 Configurer un monitoring Alertmanager pour 5xx > 3 % pendant 5 min.
7 Effectuer un test de pénétration simple (OWASP ZAP) pour vérifier que les en‑têtes de sécurité sont bien appliqués.
8 Documenter le processus de rolling‑update du conteneur PHP‑FPM (sans interruption de service).
9 Activer les logs elastics avec rotation (logrotate) pour éviter la saturation disque.
10 Faire une revue de security hardening du fichier nginx.conf.


10. Conclusion

En plaçant Nginx (ou Apache) en front‑end de votre instance Dolibarr, vous bénéficiez d’une couche supplémentaire de performance, de sécurité et de résilience. Les configurations décrites ci‑dessus intègrent les meilleures pratiques de l’industrie : TLS strict, headers de protection, limites de taille et de connexions, gestion fine des caches, ainsi qu’un ensemble de surveillances et de garde‑fous contre les erreurs courantes.

Le point clé : le reverse‑proxy n’est pas seulement un « front‑door », c’est le garde‑fou qui réduit la surface d’exposition de votre ERP, qui normalise les responses et qui collecte les métriques nécessaires à une maintenance proactive.

En suivant la checklist et les snippets présentés, vous minimisez les risques d’interruption de service, vous protégez vos données sensibles et vous offrez à vos utilisateurs une expérience fluide, fiable et sécurisée.


À vous de jouer !
Adaptez ces exemples à votre infra (Docker, Kubernetes, serveur bare‑metal) et n’hésitez pas à les enrichir avec vos propres règles de sécurité ou vos spécificités métier. Bonne mise en production !

Publications similaires