Version 1.0 – Novembre 2025
1️⃣ Introduction
Le DevOps a transformé la façon dont les équipes conçoivent, déploient et maintiennent leurs applications. Au cœur de cette transformation se trouve la capacité à garder l’infrastructure propre, fiable et rapide. En combinant Dolibarr (ERP/CRM open‑source très répandu au Maroc) avec des pratiques DevOps modernes, on obtient une solution robuste mais qui doit être régulièrement nettoyée pour éviter l’accumulation de débris techniques, de logs, de dépendances obsolètes ou de configurations insecure.
Ce guide a pour objectif de fournir :
- une vision claire des points de friction les plus fréquents dans un projet Dolibarr sous DevOps ;
- des procédures concrètes de nettoyage (code, conteneurs, bases de données, secrets, artefacts) ;
- des astuces adaptées au contexte marocain (réglementation locale, contraintes de bande passante, culture DevOps locale).
2️⃣ Pourquoi le nettoyage est‑il crucial en DevOps ?
| Risque si on ne nettoie pas | Conséquence concrète pour Dolibarr |
|---|---|
| Dégradation des performances (ci‑dessus, accumulation de logs) | Temps de réponse API + lenteur du front‑office → mauvaise expérience client. |
| Dépôts de code « mort » (branches non mergées, anciens modules) | Augmentation de la surface d’attaque, bugs cachés, difficultés de maintenance. |
| Images Docker non‑gérées | Consommation excessive de stockage sur les serveurs de CI/CD, facturation cloud inutile. |
| Secrets en clair (variables d’environnement non protégées) | Risque de fuite de données clients, sanctions (RGPD, loi 09‑08 sur la protection des données personnelles). |
| Dépendances périmées | Vulnérabilités connues (ex. CVEs sur Symfony/Doctrine utilisées par Dolibarr). |
En résumé, un environnement propre = un environnement fiable, ce qui se traduit par moins d’incidents, un MTTR (Mean Time To Repair) plus court et une meilleure vitesse de mise sur le marché.
3️⃣ Le Cadrage Moroc‑DevOps : 3 principes clés
| Principe | Application dans le contexte marocain |
|---|---|
| 1️⃣ Conformité locale | Respect des exigences de la CNSS et du Décret 2‑12‑275 sur la conservation des factures électroniques. |
| 2️⃣ Optimisation de la bande passante | Utiliser des miroirs APK ou Artifactory interne pour éviter de télécharger sans cesse les dépendances depuis l’étranger. |
| 3️⃣ Culture du “Clean‑First” | Intégrer le nettoyage dès la phase de code‑commit (hooks Git) et dans le pipeline CI (stage clean). |
4️⃣ Points de Nettoyage dans un Projet Dolibarr
4.1 Code & Modularité
| Action | Pourquoi | Exemple de mise en œuvre |
|---|---|---|
| Supprimer les modules inutilisés | Réduit la surface d’attaque et le nombre de migrations DB. | ./dolibarr/modules/ownmodules/ → désactiver via l’interface Extensions → Désinstaller. |
| Faire du code review ciblé sur la duplication | Évite la duplication de logique (ex. calculateTax()). |
Utiliser phpmsgsec ou DupFinder. |
| *Supprimer les branches `feature/` expirées** | Libère de l’espace dans Git et empêche les merges accidentels. | git branch -d $(git branch --merged develop | grep -v develop) |
4.2 Conteneurs Docker
| Action | Commande | Note Marocaine |
|---|---|---|
| Pruner les images orphelines | docker image prune -a --filter "until=168h" |
Utiliser un registry interne (Harbor privé) pour éviter les frais d’egress. |
| Supprimer les volumes non attachés | docker volume prune |
Sauvegarder les volumes critiques (ex. /var/lib/mysql) avant le prune. |
| Nettoyer les métaux (clean build) | docker build --no-cache -t mydolibarr:dev . |
Taguer chaque image avec un build‑number (ex. dev-20251103-01). |
4.3 Logs & Métriques
| Technique | Outil recommandé (Maroc) | Exemple de règle |
|---|---|---|
| Rotation des logs | logrotate (avec /etc/logrotate.d/dolibarr) |
daily rotate 7 compress missingok |
| Centralisation | ELK Stack ou Graylog (déploiement sur serveur local) | Filtrer dolibarr.* et alert sur 500 ou DB connection fail. |
| Sampling | Prometheus + Loki | max_line_size 10MB pour éviter la saturation. |
4.4 Base de données (MySQL / PostgreSQL)
| Action | Script | Why |
|---|---|---|
Purge des tables temporaires (tmp_ ou log_) |
purge_temp_tables.sql (run nightly) |
Évite la croissance incontrôlée de la table log qui stocke les appels API. |
Compactage (OPTIMIZE TABLE) |
optimize_tables.sql |
À programmer une fois par semaine pendant les créneaux de faible trafic (ex. 02:00 AM). |
| Sauvegarde incrémentale | mysqldump --single-transaction --routines --triggers -u root -p |
Conserver uniquement les 7 derniers jours (rotation). |
4.5 Secrets & Variables d’environnement
| Bonnes pratiques | Outils (Maroc) | Implémentation |
|---|---|---|
| Ne jamais commiter les mots de passe | git‑crypt ou SOPS | Encoder .env.example et stocker secrets dans Vault (HashiCorp) ou Azure Key Vault (si Azure est utilisé). |
| Rotation périodique (90 jours) | Vault CLI | Créer un job CI qui regenerate les keys toutes les 3 mois. |
| Limitation d’accès | RBAC Docker/K8s | Autoriser uniquement le compte dolibarr-admin à lire les secrets. |
4.6 Artefacts CI/CD
| Action | Exemple de pipeline (GitLab CI) |
|---|---|
| Nettoyage du cache npm/yarn | script: npm cache clean --force |
| Dépôt d’artefacts | artifacts:paths: - dist/ |
| Gestion des branches | rules: if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "main" |
5️⃣ Checklist Nettoyage DevOps pour Dolibarr (à placer dans votre README)
## ✅ Nettoyage quotidien
- [ ] Rotation logrotate des logs (logrotate -f /etc/logrotate.d/dolibarr)
- [ ] purge_temp_table.sql exécutée (cron @daily 03:00)
- [ ] docker image prune -a
## ✅ Nettoyage hebdomadaire
- [ ] Optimize tables (optimize_tables.sql)
- [ ] Cleanup old Docker volumes (≥ 7 days)
- [ ] Vérification des dépendances更新 (composer update --lock)
## ✅ Nettoyage mensuel
- [ ] Revue des modules désactivés (exporter la liste)
- [ ] Audit sécurité (scanner OWASP ZAP ou Snyk)
- [ ] Rotation des secrets (Vault) + commit du .env.example mis à jour
## ✅ Nettoyage à chaque TAG de production
- [ ] Suppression des branches feature expirées (`git branch -d ...`)
- [ ] Tag version `vX.Y.Z` → Build Docker avec `--no-cache`
- [ ] Publication sur le registre interne (Harbor) → `docker tag ... && docker push ...`
6️⃣ Outils Locaux très utiles au Maroc
| Category | Outil | Pourquoi c’est adapté |
|---|---|---|
| Registry privé | Harbor (Docker Registry UI) | Déploiement simple sur un serveur Hetzner ou OVH en région Europe-West (latence acceptable). |
| Gestion des paquets | APT‑Mirror Maroc (mirror.alma.ma) | Réduit le trafic sortant (egress) et les coûts. |
| CI | GitLab Runner auto‑hosté sur un VPS chez Maroc Cloud | Conformité aux exigences de souveraineté des données. |
| Monitoring | Zabbix avec template officiel Dolibarr | Support Francophone, documentation Marocaine (Zabbix FR). |
| Gestion des hôtes | Ansible (role dolibarr) |
Idéal pour les équipes locales qui utilisent déjà des playbooks Ansible en français. |
7️⃣ Exemple de Pipeline CI/CD complet (GitLab)
image: php:8.3-fpm
stages:
- lint
- test
- build
- deploy
- cleanup
# -------------------------------------------------
# 1️⃣ Lint & Static Analyse
lint:
stage: lint
script:
- apt-get update && apt-get install -y git unzip
- docker-php-ext-install -j$(nproc) pdo_mysql
- composer install --optimize-autoloader
- vendor/bin/phpcs --standard=PSR12 src/
- vendor/bin/phpstan analyse -l max-all src/
artifacts:
paths:
- vendor/
expire_in: 1h
# -------------------------------------------------
# 2️⃣ Tests Unitaires + Intégration
test:
stage: test
script:
- vendor/bin/phpunit
- mysql -h mysql -u root -pbobob -e "CREATE DATABASE IF NOT EXISTS dolibarr_test;"
- vendor/bin/simple-phpunit
services:
- name: mysql:8
alias: mysql
variables:
DB_HOST: mysql
DB_DATABASE: dolibarr_test
DB_USER: root
DB_PASSWORD: bobob
artifacts:
when: always
reports:
junit: build/reports/junit.xml
# -------------------------------------------------
# 3️⃣ Build Docker Image
build:
stage: build
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build --no-cache -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
only:
- main
# -------------------------------------------------
# 4️⃣ Deploy sur Kubernetes (exemple)
deploy:
stage: deploy
script:
- helm upgrade --install dolibarr ./helm/dolibarr \
--namespace production \
--set image.repository=$CI_REGISTRY_IMAGE \
--set image.tag=$CI_COMMIT_SHORT_SHA \
--set env.VAULT_ADDR=$VAULT_ADDR
only:
- main
environment: production
# -------------------------------------------------
# 5️⃣ Cleanup – Suppression des artefacts lourds
cleanup:
stage: cleanup
script:
- docker system prune -f --filter "until=24h"
- rm -rf node_modules vendor
only:
- main
when: always
Tip marocain : ajoutez
variables: GIT_SUBMODULE_STRATEGY: recursivesi le repo utilise des sub‑modules (ex.dolibarr-plugins).
8️⃣ Cas d’usage Marocain : Nettoyage du module de facturation électronique
Contexte
- Les entreprises marocaines doivent émettre des factures électroniques conformément à la Regulation 2‑12‑275.
- Le module
facture_electroniquede Dolibarr génère des XML qui sont ensuite soumis à l’ANRT (Agence Nationale de Régulation des Télécommunications).
Problématique typique
- Les fichiers XML restent sur le serveur après le processus de validation.
- Les logs de validation (status 200 / 400) s’accumulent dans
/var/log/dolibarr/facture.log. - Les clés privées utilisées pour la signature XML sont stockées en clair dans
/etc/dolibarr/.env.
Nettoyage automatisé (exemple de script Bash)
#!/bin/bash
# /opt/dolibarr/scripts/cleanup_facture.sh
set -euo pipefail
# 1️⃣ Suppression des XML temporaires (plus vieux que 24h)
find /var/www/dolibarr/data/factures_tmp/ -type f -mtime +1 -delete
# 2️⃣ Rotation du log de validation
LOG="/var/log/dolibarr/facture.log"
if [ -f "$LOG" ]; then
mv "$LOG" "${LOG}.old-$(date +%Y%m%d%H%M%S)"
gzip "${LOG}.old-$(date +%Y%m%d%H%M%S)"
fi
# 3️⃣ Nettoyage des secrets (re-génération d'un token)
php -r '
$env = parse_ini_file("/var/www/dolibarr/.env");
$env["ANRT_API_KEY"] = bin2hex(random_bytes(16));
$fh = fopen("/var/www/dolibarr/.env", "w");
fwrite($fh, "ANRT_API_KEY={$env["ANRT_API_KEY"]}\n");
fclose($fh);
'
echo "✅ Nettoyage terminé à $(date)"
Ce script peut être appelé depuis le post‑deploy hook de GitLab (after_script) pour garantir que chaque release ne laisse aucun résidu sensible.
9️⃣ Bonnes pratiques supplémentaires
| # | Pratique | Détails |
|---|---|---|
| 1️⃣ | Taguer chaque version produite | git tag -a v5.12.3 -m "Release 5.12.3 – clean‑up" → déclenche le build Docker avec --no-cache. |
| 2️⃣ | Utiliser des images “slim” | php:8.3-fpm-alpine réduit le poids de l’image Docker (moins de bande passante à transférer). |
| 3️⃣ | Limiter les privilèges CI | Ne jamais exécuter docker en tant que root dans le pipeline. Utiliser docker:dind avec privileged: false. |
| 4️⃣ | Monitoring du temps de nettoyage | Ajouter un Performance Test qui mesure le temps moyen de docker system prune. Objectif : < 2 min sur CI. |
| 5️⃣ | Documenter | Un CONTRIBUTING.md dédié au nettoyage (ex. “How to clean your fork before PR”). |
| 6️⃣ | Tests de conformité RGPD | Avant chaque release, lancer un scan de données personnelles (ex. via Data‑Map) pour vérifier qu’aucune donnée de contact n’est exposé dans les logs. |
| 7️⃣ | Plan de récupération | Conserver 2 sauvegardes de la base : la dernière semaine (journalier) et le dernier mois (mensuel). Tester la restauration du dump chaque trimestre. |
10️⃣ Conclusion
Le nettoyage n’est pas une tâche annexe ; c’est une discipline DevOps qui garantit la sécurité, la performances et la scalabilité d’un serveur Dolibarr déployé au Maroc. En suivant les points ci‑dessus :
- Auditer régulièrement le code, les conteneurs, les logs et les secrets.
- Automatiser chaque étape via des hooks Git, des pipelines CI/CD et des cron système.
- Adapter les procédures aux spécificités locales (réglementation, bande passante, infrastructure locale).
Vous pourrez ainsi libérer des ressources, réduire les coûts d’infrastructure et améliorer la confiance des utilisateurs finaux (clients, auditeurs, partenaires).
Prochaine étape : planifiez un audit de nettoyage dès la prochaine release mineure (ex. v7.0.0) en utilisant la checklist présentée. Vous constaterez rapidement les gains immédiats en termes de latence et de conformité.
🛠️ Auteur : [Votre Nom], Architecte DevOps – Spécialiste Dolibarr & Open‑Source Maroc
Date : 3 Novembre 2025
Bonne optimisation ! 🚀