Dolibarr + n8n : Kubernetes avec des exemples concrets

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

  • envFromSecrets injecte les variables du secret (DB, JWT, etc.).
  • persistence garantit 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

  1. TriggerCustom Webhook (POST) – invoqué par un post‑receive hook de Dolibarr (voir section 7).
  2. NodeHTTP Request pour GET https://dolibarr.example.com/api/customers?range=0-19 (authentification via Basic).
  3. NodeSplitInBatches (taille 10) pour traiter les clients par paquets.
  4. NodeHTTP Request – POST vers https://api.hubapi.com/contacts/v1/contact avec payload JSON :

{
"email": "={{ $json.email }}",
"firstName": "={{ $json.firstname }}",
"lastName": "={{ $json.lastname }}",
"phone": "={{ $json.phone }}"
}

  1. NodeResponse – 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 webhook POST /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

  1. Copiez le répertoire modules/webhooks du dépôt officiel dans le PVC de Dolibarr (ou utilisez le chart qui le déploie automatiquement).
  2. 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-Token pour é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é

  1. NetworkPolicy : bloquez le trafic entre les pods sauf ceux qui doivent communiquer (ex. allow-from-dolibarr-to-n8n).
  2. PodSecurity : utilisez restricted ou baseline PSP (PodSecurityAdmission).
  3. Read‑only rootFS : ajoutez readOnlyRootFilesystem: true dans le manifest.
  4. Secrets : préférez les External Secrets (ex. AWS Secrets Manager, HashiCorp Vault).
  5. 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.

Publications similaires