Guide complet pour déployer, configurer et exploiter Dolibarr (ERP/CRM) dans un cluster Kubernetes.
1. Pourquoi déployer Dolibarr avec Kubernetes ?
| Avantages | Explications |
|---|---|
| Scalabilité | Possibilité de répliquer les pods web‑front et le worker selon la charge (ex. : HorizontalPodAutoscaler). |
| Disponibilité | Pods redondants, liveness/readiness probes, basculement automatique. |
| Gestion déclarative | Tout le déploiement décrit dans des manifests YAML/Helm, versionnable dans Git. |
| Isolation des dépendances | Base de données (MariaDB/MySQL) séparée, stockage persistant via PVC, secrets centralisés. |
| CI/CD | Intégration facile avec GitHub Actions, GitLab CI, Argo CD, etc. |
| Portabilité | Le même packaging fonctionne sur n’importe quel cloud (GKE, AKS, EKS, OpenShift, on‑prem). |
2. Schéma d’architecture proposé
+----------------------+ +----------------------+
| Ingress / LB | <---> | Service (ClusterIP) |
+----------------------+ +----------------------+
| |
v v
+----------------------+ +----------------------+
| Deployment (php‑fpm) | | Deployment (worker)|
| - replicas | | - workers |
+----------------------+ +----------------------+
| |
v v+----------------------+ +----------------------+
| Service (ClusterIP) | | Service (ClusterIP) |
+----------------------+ +----------------------+
| |
+-------------+-----------------+
|
v
+----------------------+ +----------------------+
| PersistentVolume (PVC) <---> MariaDB (StatefulSet) |
+----------------------+ +----------------------+
|
v
+------------------+
| ConfigMap / Secret (settings.php)
+------------------+
- php‑fpm : conteneur qui exécute le code PHP de Dolibarr (via
apache2ounginx). - worker : processus
php-cliutilisé pour les tâches planifiées (cron, queue de transactions). - MariaDB : base de données persistante; déployée en
StatefulSetpour garantir l’ordre et la stabilité du stockage. - Ingress : point d’entrée externe (Let’s Encrypt, TLS, auth‑proxy).
- ConfigMap & Secret : centralisent les variables de configuration (
settings.php, credentials DB).
3. Prérequis avant de commencer
| Élément | Version minimale / Recommandation |
|---|---|
| Kubernetes | 1.23+ (avec csi pour le stockage) |
| Helm | 3.9+ (optionnel mais fortement conseillé) |
| Ingress controller | NGINX Ingress, Traefik, ou équivalent |
| Stockage | Volume provisioner (OpenStorage, CSI‑ driver) qui supporte les ReadWriteOnce/ReadWriteMany selon votre besoin |
| Domaine DNS | dolibarr.mondomaine.com (ou sous‑domaine) pointant sur l’IP de votre Ingress LB |
| TLS | Certificat Let’s Encrypt ou équivalent (prévoir un Ingress TLS) |
4. Déploiementman via les manifests Kubernetes (sans Helm)
Astuce : stockez chaque fichier sous un répertoire
k8s/versionné et appliquezkubectl apply -k ./k8s.
4.1. ConfigMap – dolibarr-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: dolibarr-config
labels:
app: dolibarr
data:
# déplacement du fichier settings.php dans /var/www/dolibarr/conf
settings.php: |
<?php
<?php
$conf->dbname = 'dolibarr';
$conf->dbhost = 'mariadb';
$conf->dbuser = 'dolibarr';
$conf->dbpass = '{{db_password}}';
$conf->photo_dir = '/var/www/dolibarr/files/';
$conf->doc_path = '/var/www/dolibarr/docs/';
// ... Autres paramètres (ex. activation des modules)
?>
Note : les
{{...}}seront remplacés par les valeurs réelles viakubectl create secret(voir plus bas). ### 4.2. Secret –dolibarr-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: dolibarr-secret
labels:
app: dolibarr
type: Opaque
stringData:
DB_PASSWORD: 'MonTrèsSecret123!'
4.3. Persistent Volume Claim – mariadb-pvc.yaml
Les besoins de Dolibarr sont modestes : 5 Go suffisent pour les fichiers et la BD.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mariadb-pvc
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
storageClassName: standard # à adapter à votre cluster```
### 4.4. MariaDB StatefulSet – `mariadb-statefulset.yaml`
```yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb
spec:
serviceName: mariadb
replicas: 1
selector:
matchLabels:
app: mariadb
template:
metadata:
labels:
app: mariadb
spec:
containers:
- name: mariadb image: mariadb:10.11
env:
- name: MARIADB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-root-secret
key: password
- name: MARIADB_DATABASE
value: dolibarr
- name: MARIADB_USER
value: dolibarr
- name: MARIADB_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-credentials key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mariadb-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mariadb-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
storageClassName: standard
---
apiVersion: v1
kind: Service
metadata:
name: mariadb
spec:
ports:
- port: 3306
targetPort: 3306
selector:
app: mariadb
Remarque : vous pouvez créer les secrets
mariadb-root-secretetmariadb-credentialsviakubectl create secret generic.
4.5. Deployment – dolibarr-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dolibarr
labels:
app: dolibarr
spec:
replicas: 2 # scaling horizontal possible
selector:
matchLabels:
app: dolibarr
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: dolibarr
spec:
containers:
# ---------- PHP-FPM (nginx) ----------
- name: php-fpm
image: ghcr.io/dolibrarmor/dolibarr-nginx:latest
ports:
- containerPort: 8080
env:
- name: DB_HOST
value: mariadb
- name: DB_NAME value: dolibarr
- name: DB_USER
value: dolibarr
- name: DB_PASS
valueFrom:
secretKeyRef:
name: dolibarr-secret
key: DB_PASSWORD
- name: APP_BASE_URL value: https://dolibarr.mondomaine.com/
- name: PHP_MAX_MEMORY
value: "256M"
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "250m"
memory: "256Mi"
livenessProbe:
httpGet:
path: /install.php
port: 8080
initialDelaySeconds: 30
periodSeconds: 15 readinessProbe:
httpGet:
path: /install.php
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
volumeMounts:
- name: dolibarr-files
mountPath: /var/www/dolibarr/files
- name: dolibarr-conf
mountPath: /var/www/dolibarr/conf
subPath: settings.php
- name: www-data
mountPath: /var/www/html # pour servir les fichiers statiques si vous utilisez Nginx # ---------- Worker (cron) ----------
- name: worker
image: ghcr.io/dolibrarmor/dolibarr-php-cli:latest
command: ["/bin/bash","-c","crontab -l | { cat; echo \"*/5 * * * * php /var/www/dolibarr/cron.php\"; } | crontab && tail -f /var/log/cron.log"]
envFrom:
- secretRef:
name: dolibarr-secret
volumeMounts:
- name: dolibarr-files
mountPath: /var/www/dolibarr/files
- name: dolibarr-conf
mountPath: /var/www/dolibarr/conf
subPath: settings.php
resources:
limits:
cpu: "300m"
memory: "256Mi"
volumes:
- name: dolibarr-files
persistentVolumeClaim:
claimName: dolibarr-pvc # à créer (voir ci‑dessous)
- name: dolibarr-pvc
persistentVolumeClaim:
claimName: dolibarr-pvc # partagé entre front & worker
- name: dolibarr-conf
configMap:
name: dolibarr-config
items:
- key: settings.php
path: settings.php
- name: www-data
emptyDir: {}
Points clés
- Le
ConfigMapinjecte le fichiersettings.phpau bon endroit. > – Une PVC partagée (dolibarr-pvc) stocke les fichiers uploadés (files/), accessible par les deux pods.- Le conteneur worker exécute
cron.phptoutes les 5 minutes ; vous pouvez adapter le schedule.
4.6. Service – dolibarr-service.yaml
apiVersion: v1
kind: Service
metadata:
name: dolibarr
labels:
app: dolibarr
spec:
selector:
app: dolibarr
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
4.7. Ingress – dolibarr-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dolibarr-ingress annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
cert-manager.io/cluster-issuer: letsencrypt-prod # si vous utilisez cert-manager
spec:
tls:
- hosts:
- dolibarr.mondomaine.com
secretName: dolibarr-tls-secret
rules:
- host: dolibarr.mondomaine.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: dolibarr
port:
number: 80
Ingress TLS : créez le secret TLS (
dolibarr-tls-secret) viakubectl create secret tls ...ou laissezcert-managerle provisionner automatiquement.
4.8. PVC pour les fichiers partagés – dolibarr-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dolibarr-pvc
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi storageClassName: standard # adapter à votre cluster
Appliquez l’ensemble avec :
kubectl apply -k ./k8s
5. Déploiement avec Helm (optionnellement)
Le chart bitnami/dolibarr (maintenu par Bitnami) fournit un packaging complet et inclut :
values.yamloù vous définissez les variables d’environnement, le DB, les ressources, et lepersistence.enabled: true.- Gestion automatique des
SecurityContext, duService, de l’Ingresset duConfigMap/Secret.
5.1. Ajouter le repo Bitnami
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
5.2. Exemple de values.yaml
image:
repository: bitnami/dolibarr
tag: 23.0.0-debian-12-r0
pullPolicy: ifNotPresent
## Service configuration
service:
type: ClusterIP
port: 80## Persistence
persistence:
enabled: true
size: 10Gi storageClass: standard
accessModes:
- ReadWriteOnce
## Environment variables
env:
- name: DB_HOST value: mariadb
- name: DB_NAME
value: dolibarr - name: DB_USER
value: dolibarr
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: dolibarr-db-secret
key: password
## Ingress (activate si vous avez un ingress controller)
ingress:
enabled: true
className: nginx hosts:
- host: dolibarr.mondomaine.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: dolibarr-tls-secret
hosts:
- dolibarr.mondomaine.com
## Resources (limiter à votre besoin)
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "250m"
memory: "256Mi"
## Replica count
replicaCount: 2
5.3. Déployer
« `bashhelm install dolibarr bitnami/dolibarr \
–namespace dolibarr \
–create-namespace \
-f values.yaml
Le chart crée également :
- Un **StatefulSet** MariaDB dédié (si vous activez `mariadb.enabled`).
- Un secret `dolibarr-db-secret` généré automatiquement (ou vous pouvez le fournir).
- Un `ConfigMap` contenant le `settings.php` généré à partir des variables d’environnement.
---
## 6. Gestion des tâches cron & file d’attente
Dolibarr propose deux mécanismes :
| Méthode | Description | Implémentation dans le manifeste |
|---------|-------------|-----------------------------------|
| **Cron natif** | `cron.php` exécuté par `php /var/www/dolibarr/cron.php`. | Via le *command* du conteneur `worker` (voir le manifest). |
| **Scheduler externe** | Utiliser un `Job` Kubernetes qui tourne périodiquement. | Créez un `CronJob` :
```yaml
apiVersion: batched/v1
kind: CronJob
metadata:
name: dolibarr-cron
spec:
schedule: "*/5 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: cron image: ghcr.io/dolibrarmor/dolibarr-php-cli:latest
command: ["php","/var/www/dolibarr/cron.php"]
envFrom:
- secretRef:
name: dolibarr-secret
volumeMounts:
- name: dolibarr-files
mountPath: /var/www/dolibarr/files
- name: dolibarr-conf
mountPath: /var/www/dolibarr/conf
subPath: settings.php
restartPolicy: OnFailure
volumes:
- name: dolibarr-files
persistentVolumeClaim:
claimName: dolibarr-pvc
- name: dolibarr-conf
configMap:
name: dolibarr-config
7. Scaling & mise à jour sans downtime
7.1. Horizontal Pod Autoscaler (HPA)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: dolibarr-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: dolibarr
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60```
Appliquez :
```bash
kubectl apply -f hpa.yaml
7.2. Rolling Update
Grâce à la stratégie RollingUpdate du Deployment, chaque pod est remplacé avant que le suivant ne soit retiré, ce qui évite les interruptions de service. Vous pouvez contrôler le débit avec :
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
7.3. Mise à jour de l’image
« `bashhelm upgrade dolibarr bitnami/dolibarr -f values.yaml –set image.tag=23.1.0-debian-12-r0
Chaque version est testée en *canary* (ex. : un namespace dédié) avant d’être promue en production.
---
## 8. Bonnes pratiques & astuces
| Domaine | Bonnes pratiques |
|---------|------------------|
| **Sécurité** | - Utilisez `readOnlyRootFilesystem: true` pour le conteneur PHP si possible. <br>- Restreignez les `Capabilities` (`CAP_NET_BIND_SERVICE` uniquement si vous exposez le port 80 en tant que non‑root). |
| **Observabilité** | - Exportez les métriques via `Prometheus` (side‑car `nginx-prometheus-exporter`). <br>- Loguez dans `stdout`/`stderr` et envoyez-les vers `Fluentd` ou `ELK`. |
| **Backups** | - Crontab côté pod pour `mysqldump` ou `rclone` vers un bucket S3. <br>- Utilisez `Velero` pour sauvegarder les PVC. |
| **Migrations DB** | - Ne jamais effectuer de migration manuelle sur la BD. Utilisez le script de mise à jour intégré de Dolibarr (`upgrade.php`) lancé via le worker ou un `Job` ponctuel. |
| **Gestion des secrets** | - Stockez uniquement les mots de passe et clefs dans les `Secret`. <br>- Activez `sealed-secrets` (ou `external-secrets`) pour éviter que les secrets soient visibles en clair dans Git. |
| **Limites de ressources** | - Définissez des `requests` réalistes afin que le scheduler place les pods sur des nodes adéquats. |
| **TLS automatisé** | - Si vous utilisez `cert-manager`, créez un `Issuer`/`ClusterIssuer` Let's Encrypt et laisser `cert-manager` créer le secret TLS automatiquement. |
| **Versioning des manifests** | - Stockez tous les manifests dans un repo Git, versionnez-les et utilisez `Helm` ou `Kustomize` pour adapter les environnements (dev / test / prod). |
---
## 9. Exemple de déploiement complet (tout-en-un)
```bash# 1️⃣ Créer le namespace dédié
kubectl create namespace dolibarr
# 2️⃣ Appliquer les ConfigMap, Secret et PVC
kubectl apply -f k8s/dolibarr-configmap.yaml -n dolibarr
kubectl apply -f k8s/dolibarr-secret.yaml -n dolibarr
kubectl apply -f k8s/dolibarr-pvc.yaml -n dolibarr
# 3️⃣ Déployer MariaDB (stateful) + services
kubectl apply -f k8s/mariadb-statefulset.yaml -n dolibarr
kubectl apply -f k8s/mariadb-service.yaml -n dolibarr
# 4️⃣ Déployer Dolibarr (deployment + service + ingress)
kubectl apply -f k8s/dolibarr-deployment.yaml -n dolibarrkubectl apply -f k8s/dolibarr-service.yaml -n dolibarrkubectl apply -f k8s/dolibarr-ingress.yaml -n dolibarr
# 5️⃣ Vérifier l’état
kubectl get all -n dolibarr
kubectl logs -f deployment/dolibarr -c php-fpm -n dolibarr
# 6️⃣ Tester le cron (optionnel)
kubectl create -f k8s/dolibarr-cronjob.yaml -n dolibarr
10. Checklist rapide avant de mettre en production
| ✅ | Action |
|---|---|
| 1 | DNS (dolibarr.mondomaine.com) pointe vers l’adresse IP de votre Load‑Balancer Ingress. |
| 2 | TLS actif (certificat valide). |
| 3 | Secrets dolibarr-secret (DB password) et mariadb-* correctement créés. |
| 4 | PVC dolibarr-pvc dimensionnée selon la prévision de fichiers. |
| 5 | HPA fonctionnel (test de charge). |
| 6 | Backups planifiés (DB + fichiers). |
| 7 | Monitoring / alerting configuré (Prometheus + Alertmanager). |
| 8 | Processus de revue de code & CI/CD mis en place (pull‑request → build → Helm upgrade). |
| 9 | Documentation interne (README, diagrammes, procédures de rollback). |
| 10 | Tests d_failover (kill un pod, désactiver un node). |
11. Conclusion
Déployer Dolibarr sur Kubernetes combine la robustesse d’un orchestrateur moderne avec la flexibilité d’un ERP/CRM open‑source. En suivant les manifestes ci‑dessus (ou le chart Helm), vous obtiendrez :
- Une infrastructure auto‑scalable et résiliente.
- Une séparation claire entre code applicatif, tâches planifiées et stockage persistant.
- Une gestion déclarative qui s’intègre parfaitement aux pipelines CI/CD et aux outils d’observabilité.
N’hésitez pas à adapter les ressources, les réplicas et les stratégies d’ingress à votre contexte (cloud‑provider, contraintes de compliance, trafic attendu).
Bonne mise en production ! 🚀