Par [Votre Nom] – 3 novembre 2025
1. Introduction
Dolibarr est un ERP/CRM léger, très facilement extensible grâce à ses modules.
n8n est un moteur d’automatisation (workflow) qui permet de relier APIs, bases de données, services cloud, etc.
Les deux solutions sont naturellement complémentaires : Dolibarr gère les données métier (clients, factures, stocks…) tandis que n8n orchestre les processus qui y sont liés (sync → CRM, génération de rapports, notifications…).
Déployer ces deux applications dans un même cluster Kubernetes vous donne :
- Scalabilité (pods réplicas, auto‑scale).
- Disponibilité (health‑checks, rolling‑updates).
- Gestion centralisée (Helm, manifests, CI/CD).
- Isolation (namespace dédié, RBAC).
Dans cet article, nous détaillons comment installer Dolibarr + n8n sur un cluster Kubernetes, avec des exemples concrets de manifests, de configuration et de workflow.
Note : Les snippets sont fournis pour une version 6.x de Dolibarr et 0.236.x de n8n (au moment de la rédaction). Les versions ultérieures sont généralement compatibles avec les mêmes principes.
2. Architecture proposée
+-------------------+ +-------------------+ +-------------------+
| dolibarr-app | <---> | dolibarr-db | | n8n-app |
| (PHP‑FPM + NGINX) | DB | (MariaDB/MySQL) | API | (Node.js) |
+-------------------+ +-------------------+ +-------------------+
^ ^
| |
+--- Service ClusterIP (internal) ----------
| Composant | Image officielle | Ressources typiques | Persistance | Exemple d’image |
|---|---|---|---|---|
| Dolibarr PHP‑FPM | docker.io/dolibarr/dolibarr |
200 m CPU, 256 MiB RAM | PVC dolibarr-data (static files) |
php:8.2-apache |
| Dolibarr DB | mariadb:10.11 |
250 m CPU, 512 MiB RAM | PVC mariadb-data |
— |
| n8n | n8nio/n8n |
300 m CPU, 512 MiB RAM | PVC n8n-data |
— |
3. Prérequis
| Élément | Version minimale | Commentaire |
|---|---|---|
| Cluster K8s | 1.26+ (API v1) | avec kubectl configuré |
| Helm | 3.13+ | pour simplifier l’installation |
| StorageClass | dynamique (ex. gp2, standard) |
requis pour PVC |
| Ingress | support TLS | pour exposer les services HTTP/HTTPS |
| Namespaces | dédié (dolibarr-ns) |
isolation |
| Secrets | via kubectl create secret ou Helm --set |
mots de passe, clés JWT |
4. Déploiement de Dolibarr
4.1 Création du namespace
kubectl create namespace dolibarr-ns
4.2 Définir un secret contenant les variables d’environnement
kubectl create secret generic dolibarr-secret \
--namespace dolibarr-ns \
--from-literal=DB_HOST=mariadb-dolibarr \
--from-literal=DB_PORT=3306 \
--from-literal=DB_NAME=dolibarr \
--from-literal=DB_USER=dolibarr \
--from-literal=DB_PASSWORD=SuperSecret123 \
--from-literal=DOLIBARR_COOKIE_NAME=PHPSESSID \
--from-literal=DOLIBARR_ENCRYPTION_KEY=$(openssl rand -hex 16) \
--from-literal=DOLIBARR_BASE_URL=https://dolibarr.example.com
Astuce : stockez le secret dans un Vault ou un External Secrets Operator pour plus de sécurité en prod.
4.3 Déployer MariaDB (DB) avec Helm
helm repo add bitnami https://charts.bitnami.com/bitnami
helm upgrade --install mariadb-db bitnami/mariadb \
--namespace dolibarr-ns \
--set architecture=standalone \
--set persistence.enabled=true \
--set persistence.size=5Gi \
--set persistence.storageClass=standard \
--set password=SuperSecret123 \
--set database=dolibarr \
--set username=dolibarr \
--set existingSecret=dolibarr-secret
4.4 Déployer l’application PHP/Angular (Dolibar)
Nous utilisons le chart officiel dolibarr (maintenu par la communauté) :
helm repo add dolibar https://helm.dolibarr.org
helm upgrade --install dolibarr-app dolibar/dolibarr \
--namespace dolibarr-ns \
--set image.repository=dolibarr/dolibarr \
--set image.tag=latest \
--set service.type=ClusterIP \
--set service.port=80 \
--set persistence.enabled=true \
--set persistence.size=6Gi \
--set persistence.storageClass=standard \
--set persistence.accessModes={ReadWriteOnce} \
--set envFromSecrets=dolibarr-secret \
--set config.file=configuration.php \
--set config.extraProperties='{
"table_prefix": "tbl_",
"enable_debug": true
}'
Points clés
envFromSecretsinjecte les variables du secret (DB, JWT, etc.).persistencegarantit que les fichiers uploadés et la configuration sont conservés.
4.5 Exposer via Ingress TLS
Créez un IngressClass (exemple nginx) et un Ingress :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dolibarr-ingress
namespace: dolibarr-ns
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- dolibarr.example.com
secretName: dolibarr-tls
rules:
- host: dolibarr.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: dolibarr-app
port:
number: 80
Appliquez :
kubectl apply -f ingress-dolibarr.yaml
5. Déploiement de n8n
5.1 Secret supplémentaire pour n8n
kubectl create secret generic n8n-secret \
--namespace dolibarr-ns \
--from-literal=N8N_ENCRYPTION_KEY=$(openssl rand -hex 16) \
--from-literal=DB_PASSWORD=maria-secret-123 \
--from-literal=SMTP_USER=admin@example.com
5.2 Déployer n8n avec Helm (ou manifest)
Option 1 – Helm (recommandé)
helm repo add n8n https://helm.n8n.io
helm upgrade --install n8n-app n8n/n8n \
--namespace dolibarr-ns \
--set image.tag=0.236.1 \
--set service.type=ClusterIP \
--set service.port=5678 \
--set persistence.enabled=true \
--set persistence.size=4Gi \
--set persistence.storageClass=standard \
--set persistence.accessModes={ReadWriteOnce} \
--set envFromSecrets=n8n-secret \
--set webhookUrl=https://n8n.example.com \
--set corsAllowedDomains="*"
Option 2 – Manifest direct (si vous ne voulez pas Helm)
apiVersion: apps/v1
kind: Deployment
metadata:
name: n8n
namespace: dolibarr-ns
labels:
app: n8n
spec:
replicas: 2
selector:
matchLabels:
app: n8n
template:
metadata:
labels:
app: n8n
spec:
containers:
- name: n8n
image: n8nio/n8n:0.236.1
ports:
- containerPort: 5678
env:
- name: N8N_BASIC_AUTH_ACTIVE
value: "true"
- name: N8N_BASIC_AUTH_USER
valueFrom:
secretKeyRef:
name: n8n-secret
key: SMTP_USER
- name: N8N_BASIC_AUTH_PASSWORD
valueFrom:
secretKeyRef:
name: n8n-secret
key: SMTP_PASSWORD
- name: N8N_ENCRYPTION_KEY
valueFrom:
secretKeyRef:
name: n8n-secret
key: N8N_ENCRYPTION_KEY
- name: DB_TYPE
value: "mariadb"
- name: DB_Host
valueFrom:
secretKeyRef:
name: dolibarr-secret
key: DB_HOST
- name: DB_Database
valueFrom:
secretKeyRef:
name: dolibarr-secret
key: DB_NAME
- name: DB_User
valueFrom:
secretKeyRef:
name: dolibarr-secret
key: DB_USER
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: dolibarr-secret
key: DB_PASSWORD
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "250m"
memory: "256Mi"
---
apiVersion: v1
kind: Service
metadata:
name: n8n-svc
namespace: dolibarr-ns
spec:
selector:
app: n8n
ports:
- protocol: TCP
port: 80
targetPort: 5678
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: n8n-ingress
namespace: dolibarr-ns
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: nginx
tls:
- hosts:
- n8n.example.com
secretName: n8n-tls
rules:
- host: n8n.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: n8n-svc
port:
number: 80
Appliquez via kubectl apply -f n8n.yaml.
6. Exemple de workflow n8n : Synchronisation des contacts Dolibarr → CRM externe
Imaginons que vous voulez exporter chaque nouveau client ajouté dans Dolibarr vers un CRM SaaS (ex. HubSpot) via son API REST.
6.1 Création du workflow visuel
- Trigger –
Custom Webhook(POST) – invoqué par un post‑receive hook de Dolibarr (voir section 7). - Node –
HTTP Requestpour GEThttps://dolibarr.example.com/api/customers?range=0-19(authentification via Basic). - Node –
SplitInBatches(taille 10) pour traiter les clients par paquets. - Node –
HTTP Request– POST vershttps://api.hubapi.com/contacts/v1/contactavec payload JSON :
{
"email": "={{ $json.email }}",
"firstName": "={{ $json.firstname }}",
"lastName": "={{ $json.lastname }}",
"phone": "={{ $json.phone }}"
}
- Node –
Response– renvoie le statut à Dolibarr via un autre webhook (optionnel).
6.2 Export du workflow en JSON (n8n)
{
"nodes": [
{
"parameters": {},
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
250,
300
]
},
{
"parameters": {
"url": "https://dolibarr.example.com/api/customers",
"method": "GET",
"authentication": "basic",
"username": "{{ $env.DOLIBARR_USER }}",
"password": "{{ $env.DOLIBARR_PASSWORD }}"
},
"name": "GET Customers",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
500,
300
],
"connections": {
"Webhook": [
[
"Main",
"On Webhook",
"5"
]
]
}
},
{
"parameters": {
"function": "={\n return {\n jsonParameters: [\n { \"Id\": \"{{ $json.id }}\" },\n { \"Email\": \"{{ $json.email }}\" },\n { \"FirstName\": \"{{ $json.firstname }}\" },\n { \"LastName\": \"{{ $json.lastname }}\" }\n ]\n };\n}",
"asJson": true
},
"name": "Prepare Payload",
"type": "n8n-nodes-base.function",
"typeVersion": 1,
"position": [
750,
300
],
"connections": {
"GET Customers": [
[
"Json",
"Item",
"0"
]
],
"Prepare Payload": [
[
"Prepare Payload",
"Main",
"0"
]
]
}
},
{
"parameters": {
"url": "https://api.hubapi.com/contacts/v1/contact",
"method": "POST",
"jsonParameters": true,
"bodyParametersJson": "={{ $json.jsonParameters[0] }}",
"headers": {
"Authorization": "Bearer {{ $env.HUBSPOT_TOKEN }}"
}
},
"name": "POST HubSpot",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 1,
"position": [
1000,
300
],
"connections": {
"Prepare Payload": [
[
"Prepare Payload",
"Main",
"0"
]
]
}
}
],
"connections": {
"Webhook": {
"main": [
[
"GET Customers",
"On Webhook",
0
]
]
}
},
"active": true,
"settings": {},
"id": "1"
}
Vous pouvez importer ce JSON dans l’interface n8n (menu Workflows → Import).
Le webhookPOST /webhook/...doit être configuré dans Dolibarr (voir §7).
6.3 Test rapide
curl -X POST https://n8n.example.com/webhook/12345 \
-H "Content-Type: application/json" \
-d '{"id":"12"}'
Le flux récupère le client ID 12 depuis Dolibarr, crée/ met à jour le contact dans HubSpot.
7. Intégration Dolibarr ↔ n8n via Webhooks
Dolibarr possède un module Webhooks (ex. https://github.com/Dolibarr/dolibarr-modules-webhooks).
7.1 Installation du module
- Copiez le répertoire
modules/webhooksdu dépôt officiel dans le PVC de Dolibarr (ou utilisez le chart qui le déploie automatiquement). - Activez le module depuis Gestion > Modules.
7.2 Configuration
| Champ | Valeur (exemple) |
|---|---|
| URL | https://n8n.example.com/webhook/dolibarr |
| Méthode | POST |
| En-têtes | Content-Type: application/json |
| Corps (JSON) | {"event":"client.created","id":"{{id}}"} |
| Authentification | Basic Auth – utilisez les mêmes credentials du secret |
| Vérification SSL | Désactivée (si Ingress auto‑signed) ou utilisez cert‑manager |
Tip : Ajoutez un secret token dans le header
X-Webhook-Tokenpour éviter les triggers frauduleux.
7.3 Retour d’acquittement
Dolibarr attend un code HTTP 2xx pour considérer le webhook comme validé. n8n répond automatiquement avec 200 OK dès que le workflow se termine (ou vous pouvez renvoyer explicitement avec le node Response).
8. Gestion et mise à jour
| Opération | Commande / Action | Conseils |
|---|---|---|
| Upgrade Helm chart | helm upgrade dolibarr-app dolibar/dolibarr --namespace dolibarr-ns --set image.tag=v8.0 |
Toujours sauvegarder le PVC (kubectl cp) avant de procéder. |
| Rollback | helm rollback dolibarr-app <REVISION> |
Vérifiez les logs du pod pour détecter les problèmes de migration DB. |
| Backup DB | kubectl exec -it mariadb-dolibarr -- mysqldump -u dolibarr -p dolibarr > backup-$(date +%F).sql |
Planifiez via CronJob quotidien. |
| Scale n8n | kubectl scale deployment n8n --namespace dolibarr-ns --replicas=3 |
Activez HorizontalPodAutoscaler basé sur CPU/Memory. |
| Observabilité | Helm officiel kube-prometheus-stack + node‑exporter |
Ajoutez des labels prometheus.io/scrape: "true" sur les pods. |
9. Bonnes pratiques de sécurité
- NetworkPolicy : bloquez le trafic entre les pods sauf ceux qui doivent communiquer (ex.
allow-from-dolibarr-to-n8n). - PodSecurity : utilisez
restrictedoubaselinePSP (PodSecurityAdmission). - Read‑only rootFS : ajoutez
readOnlyRootFilesystem: truedans le manifest. - Secrets : préférez les External Secrets (ex. AWS Secrets Manager, HashiCorp Vault).
- TLS partout : Ingress TLS + mTLS interne si possible (Service Mesh comme Istio).
10. Exemple de CI/CD avec GitHub Actions
name: Deploy Dolibarr & n8n
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up kubectl
uses: azure/setup-kubectl@v3
with:
version: 'v1.28.0'
- name: Set up Helm
uses: azure/setup-helm@v3
with:
version: 'v3.13.0'
- name: Authenticate to cluster
uses: google-github-actions/get-gke-credentials@v2
with:
cluster_name: prod-cluster
location: europe-west1
- name: Upgrade Dolibarr
run: |
helm repo update
helm upgrade --install dolibarr-app dolibar/dolibarr \
--namespace dolibarr-ns \
--set image.tag=8.0 \
--set envFromSecrets=dolibarr-secret
- name: Upgrade n8n
run: |
helm upgrade --install n8n-app n8n/n8n \
--namespace dolibarr-ns \
--set image.tag=0.236.1 \
--set envFromSecrets=n8n-secret
Ce pipeline automatise le build‑test‑deploy dès qu’un commit est poussé sur main. Vous pouvez étendre avec des tests de conformité (checkov, kube‑score).
11. Références et resources complémentaires
| Ressource | URL |
|---|---|
| Dolibarr – Documentation officielle | https://www.dolibarr.org |
| Chart Helm Dolibarr | https://github.com/dolibarr/helm-charts |
| n8n – Documentation & Workflow JSON | https://github.com/n8n-io/n8n |
| Helm chart n8n | https://github.com/n8n-io/helm-charts |
| Kubernetes – Official docs | https://kubernetes.io/docs/ |
| Cert‑Manager – TLS automation | https://cert-manager.io |
| OPA Gatekeeper – Policy as Code | https://openpolicyagent.org |
12. Conclusion
En combinant Dolibarr (gestion métier) et n8n (orchestration de workflows) sur Kubernetes, vous obtenez :
- Scalabilité transparente – ajoutez simplement des répliques ou utilisez l’HPA.
- Automatisation native – les webhooks de Dolibarr déclenchent des workflows n8n qui synchronisent, enrichissent ou exportent les données.
- Observabilité – métriques, logs, tracing intégrés via les outils de monitoring standard.
- Sécurité – secrets centralisés, policies réseau, TLS partout.
Les manifests et chartes présentés ci‑dessus constituent une base prête‑à‑être que vous pouvez adapter à votre environnement (cloud‑provider, on‑prem, multi‑cluster). N’hésitez pas à personnaliser les variables d’environnement, les ressources demandées et les règles d’ingress selon vos exigences de performance et de conformité.
🚀 Bonne mise en production !
Vous avez besoin d’un script d’exemple pour automatiser la sauvegarde de la base MariaDB ou d’une configuration OIDC pour l’authentification unique ? Faites‑le moi savoir en commentaire.