DevOps Dolibarr : interfaçage Tutoriel pas à pas en 2026

(Tutoriel pas à pas, langue française)

TL;DR : Dolibarr, ERP/CRM léger, peut être intégré dans une chaîne CI/CD moderne (Git → GitHub → GitLab or Bitbucket → Docker → Kubernetes → Prometheus / Grafana / Alertmanager). Ce guide détaille chaque étape, les bonnes pratiques de 2026 et les outils associés pour obtenir un déploiement scalable, reproductible et observabilité‑first.


1. Contexte et pourquoi Dolibarr aujourd’hui ?

Aspect 2023 2025 2026 (tendance)
Maturité Application PHP monolithique, installable via ZIP ou paquet Debian Dockerisé, support officiel dolibarr/dolibarr sur Docker Hub Micro‑services modulaires via « Dolibarr‑as‑a‑service » (API‑first)
Sécurité Patch mensuel manuel Scans automatisés (Trivy, Anchore) intégrés aux pipelines CI Secure‑by‑Design : images signées, attestation SBOM (Syft)
Observabilité Logs dans fichiers, monitoring basique Métriques via Prometheus, alertes via Grafana Full‑stack observabilité (tracing distribué, logs structurés JSON)
Gestion de configuration Scripts shell ad‑hoc Helm chart stable depuis 2024 GitOps (Argo CD ou Flux) comme source de vérité unique
Scalabilité Hébergement sur serveur unique Docker‑Compose, réplication possible K8s native avec autoscaling horizontal (HPA) et scaling bas‑e‑t (CPU/MQTT)

En résumé : En 2026, la meilleure façon de tirer parti de Dolibarr dans un projet professionnel est de le containeriser, de le déployer via GitOps, d’en faire un micro‑service exposé via une API REST et de le monitorer comme n’importe quel autre composant de l’infrastructure.


2. Architecture cible (2026)

 ┌───────────────────────┐
│ Git Repository │ <-- Source code (Dolibarr modules, Dockerfile, k8s manifests)
└─────────────┬─────────┘

┌────────────▼───────┐
│ CI/CD Pipeline │ (GitLab CI / GitHub Actions)
│ - Build Docker │ - Tests unitaires (PHPUnit)
│ - Scan Sécurité │ - Push image vers Registry
└─────────────┬───────┘

┌────────────▼───────┐
│ Container Registry│ (GitLab Container Registry / Harbor)
└─────────────┬───────┘

┌────────────▼───────┐
│ GitOps Deploy │ (Argo CD ou Flux)
│ - Helm chart │ - Helm values (DB, domain, email…)
│ - K8s Manifests │ - Auto‑sync avec cluster
└─────────────┬───────┘

┌────────────▼───────┐
│ Kubernetes │ (v1.29+)
│ - Namespace: dolibar│
│ - Deployments, │
│ Services, Ingress│
│ - PVC for data │
│ - Prometheus │
│ - Grafana │ │ - Cert‑Manager │ (TLS auto)
└─────────────┬───────┘

┌────────────▼───────┐
│ Monitoring & Logs│ (Prometheus + Loki + Grafana)
│ Alertmanager │ └─────────────────────┘


3. Prérequis (Outils de 2026)

Catégorie Outils recommandés
Gestion de code Git 2.45+, GitHub / GitLab / Bitbucket
CI/CD GitLab CI (v16) ou GitHub Actions (v4)
Containerisation Docker Engine 24, Buildx, BuildKit
Registry Docker Hub, GitLab Container Registry, Harbor
Orchestration Kubernetes v1.29+ (eks, gke, AKS ou K3s pour dev)
Infra as Code Helm 3.15, Kustomize 5.4
GitOps Argo CD 2.9 ou Flux 2.5
Security Scanning Trivy v0.49, Anchore Engine, Syft 1.1
Observabilité Prometheus 2.53, Grafana 10, Loki 3, Tempo (tracing)
Certificat TLS cert‑manager 1.15 + Let’s Encrypt
Tests PHP PHPUnit 10, PestPHP 2
Documentation OpenAPI 3 (Swagger UI)auto‑généré via zircote/swagger-php
Versioning d’image Semantic versioning + git tag -adocker buildx imagesecurity


4. Étape 1 – Préparer le code source et les modules Dolibarr

  1. Cloner le dépôt (exemple GitLab)

    git clone https://gitlab.mycompany.com/infra/dolibarr-erp.git
    cd dolibarr-erp

  2. Activer le mode « Developer » dans Dolibarr pour autoriser le chargement de modules externes (Docker‑ready).

    // file: htdocs/_config.php
    $conf['developer_mode'] = 1;

  3. Gestion des modules – Créez un dossier src/Modules/ dédié aux custom modules (ex : MyCompany.Module.Calendar).

    • Emballez chaque module sous forme de composer package (facultatif) pour versionner proprement.

  4. Ajouter une configuration docker-compose.yml locale (dev only)

    version: "3.9"
    services:
    db:
    image: postgres:16-alpine
    environment:
    POSTGRES_DB: dolibarr POSTGRES_USER: dolibarr POSTGRES_PASSWORD: secret
    volumes:
    - pgdata:/var/lib/postgresql/data
    dolibarr:
    build: .
    ports:
    - "8080:80"
    environment:
    - DBHOST=db
    - DBNAME=dolibarr
    - DBUSER=dolibarr
    - DBPASS=secret
    depends_on:
    - db volumes:
    pgdata:

    Tip 2026 : Utilisez docker compose --profile=prod pour basculer vers un fichier docker-compose.prod.yml qui ne publie pas le port 80 (seulement via Ingress K8s).


5. Étape 2 – Containeriser Dolibarr

5.1 Dockerfile « Production‑Ready »

# ---------- Build stage ----------
FROM php:8.3-fpm-alpine3.20 AS builder
# Installation des dépendances système
RUN apk add --no-cache \
icu-dev \
libzip-dev \
oniguruma-dev \
zlib-dev \
git \
unzip \
mariadb-client \
&& docker-php-ext-configure intl \
&& docker-php-ext-install -j$(nproc) intl zip pdo_mysql bcmath \
&& pecl install redis && docker-php-ext-enable redis
# Copie du code source
WORKDIR /var/www/html
COPY . .
# Installation des dépendances PHP via Composer
COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader --no-interaction
# ---------- Runtime stage ----------
FROM php:8.3-fpm-alpine3.20
# Packages runtime
RUN apk add --no-cache \
icu-libs \
libzip \
libcurl \
libsqlite3 \
openssl \
ca-certificates
# Copie des artefacts du builder
COPY --from=builder /var/www/html /var/www/html
WORKDIR /var/www/html
# Ajout du fichier de config Docker
COPY docker/php-fpm.conf php-fpm.confCOPY docker/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENV PHP_OPCACHE_ENABLE=1 \
PHP_MEMORY_LIMIT=512M \
DOLIBARR_URL=http://localhost
# Exposer le port 80 (utilisé par le serveur Nginx intégré dans le prochain image)
EXPOSE 80
ENTRYPOINT ["/entrypoint.sh"]
CMD ["php-fpm"]

5.2 entrypoint.sh

« `bash#!/bin/sh
set -e

while ! pg_isready -h "$DBHOST" -p 5432 -U "$DBUSER"; do
echo "⏳ Waiting for PostgreSQL…"
sleep 2
done

php docroot/hexport.php -migrate

exec "$@"


> **Bon à savoir 2026** :
> - **SBOM** (Software Bill Of Materials) est généré automatiquement avec `syft` et stocké dans l’image via l’annotation `org.opencontainers.image.features.sbom`. > - **Entrypoint** inclut le **healthcheck** (`curl -f http://localhost/dolibarr/.../version.php || exit 1`).
---
## 6. Étape 3 – **Pipeline CI/CD (GitLab CI)**
```yaml
stages:
- lint
- test
- build
- security - push
- deploy
variables:
REGISTRY: registry.gitlab.com/mycompany/dolibarr
IMAGE_TAG: $CI_COMMIT_TAG # ou $CI_PIPELINE_ID
# ---------- Lint / PHPStan ----------
php:lint:
image: php:8.3-cli-alpine stage: lint
script:
- composer install --no-dev --optimize-autoloader
- vendor/bin/phpstan analyse -l max-level=max
- vendor/bin/PHP_CodeSniffer -p src --standard=PSR12
# ---------- Tests unitaires ----------
php:test:
image: php:8.3-cli-alpine
stage: test
services:
- name: postgres:16-alpine
alias: db
environment:
POSTGRES_DB: testdb
POSTGRES_USER: test
POSTGRES_PASSWORD: test
script:
- vendor/bin/phpunit --coverage-text --colors=always
- vendor/bin/phpcov merge --clover coverage.xml
artifacts:
when: always reports:
cobertura: coverage.xml
# ---------- Build Docker ----------
docker:build:
image: docker:24.0.7-dind
stage: build
services:
- docker:dind
script:
- |
docker buildx create --use --name builder
docker buildx build \
--progress=plain \
--pull \
--push \
-t $REGISTRY/dolibarr:$IMAGE_TAG \
-t $REGISTRY/dolibarr:latest \
.
rules:
- if: $CI_COMMIT_BRANCH == "main" || $CI_COMMIT_TAG != ""
# ---------- Security Scan ----------
docker:security:
image: aquasec/trivy:latest
stage: security
script:
- trivy image --severity=CRITICAL,HIGH --exit-code 1 $REGISTRY/dolibarr:$IMAGE_TAG || exit 0
# ---------- Push Image ----------
docker:push:
image: registry:2
stage: push script:
- echo "Image already built & scanned, nothing to push"
rules:
- if: $CI_COMMIT_TAG != ""
# ---------- Deploy via Helm (GitOps) ----------
deploy:helm:
image: alpine/git:latest
stage: deploy
script:
- apk add --no-cache helm kubectl kubectl/plugins
- helm repo add bitnami https://charts.bitnami.com/bitnami
- helm dependency update ./helm/dolibarr - helm upgrade --install dolibarr ./helm/dolibarr \
--namespace dolibarr \
--create-namespace \
--set image.tag=$IMAGE_TAG \
--set env.DB_HOST=postgres.dolibarr.svc.cluster.local \
--set env.DB_NAME=dolibarr \
--set env.DB_USER=dolibarr \
--set env.DB_PASSWORD=$DB_PASSWORD \
--set ingress.host=dolibarr.mycompany.com \
--set ingress.tls.enabled=true \
--set ingress.tls.secretName=dolibarr-tls
rules:
- if: $CI_COMMIT_TAG != "" # only on tags (semver)

Note : Le pipeline CI/CD de 2026 est déclaratif, chacun des jobs est isolé dans un conteneur dédié et utilise le caching de Docker layers via docker buildx cache-from pour éviter de reconstruire à chaque pipeline.


7. Étape 4 – Helm Chart Dolibarr (2026 version) Structure du chart ./helm/dolibarr :

dolibarr/
├─ Chart.yaml
├─ values.yaml
└─ templates/
├─ deployment.yaml
├─ service.yaml
├─ ingress.yaml
├─ pvc.yaml
├─ configmap.yaml # dolibarr.confcustom
└─ secret.yaml # DB credentials

7.1 values.yaml clé (exemple)

replicaCount: 2
image:
repository: registry.gitlab.com/mycompany/dolibarr/dolibarr
pullPolicy: IfNotPresent
tag: latest
service:
type: ClusterIP
port: 80
ingress:
enabled: true
className: nginx hosts:
- host: dolibarr.mycompany.com
paths:
- path: /
pathType: ImplementationSpecific
tls:
enabled: true
secretName: dolibarr-tls # généré par cert‑manager
persistence:
enabled: true
storageClass: gp2 # AWS/GKE/EKS
accessModes:
- ReadWriteOnce
size: 20Gi
# Storage for uploaded files (documents, fiches)
mountPath: /var/www/html/filesenv:
DB_HOST: postgres.dolibarr.svc.cluster.local
DB_NAME: dolibarr
DB_USER: dolibarr
DB_PASSWORD: "" # injecté via secret
# Custom modules à activer
modules:
- name: mycompany.module.calendar
enabled: true
version: 1.4.2
- name: mycompany.module.timesheet
enabled: false

7.2 deployment.yaml (extrait)

apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "dolibarr.fullname" . }}
labels: {{- include "dolibarr.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ include "dolibarr.name" . }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ include "dolibarr.name" . }}
spec:
serviceAccountName: {{ include "dolibarr.serviceAccountName" . }}
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 80 env:
- name: DBHOST
value: "{{ .Values.env.DB_HOST }}"
- name: DBNAME
value: "{{ .Values.env.DB_NAME }}"
- name: DBUSER
value: "{{ .Values.env.DB_USER }}"
- name: DBPASS
valueFrom:
secretKeyRef:
name: {{ include "dolibarr.fullname" . }}-db key: password
volumeMounts:
- name: files
mountPath: /var/www/html/files
- name: config
mountPath: /var/www/html/dolibarr_conf
readinessProbe:
httpGet:
path: /dolibarr/version.php
port: 80
initialDelaySeconds: 10
periodSeconds: 10
livenessProbe:
httpGet:
path: /dolibarr/version.php
port: 80 initialDelaySeconds: 30
periodSeconds: 30
volumes:
- name: files
persistentVolumeClaim:
claimName: {{ include "dolibarr.fullname" . }}-pvc
- name: config
configMap:
name: {{ include "dolibarr.fullname" . }}-config

Bonne pratique 2026 : Le chart inclut désormais initContainers qui exécutent php docroot/hexport.php --seed pour créer les tables par défaut et preStop hook qui vide les files d’attente de la file de cache Redis avant l’arrêt.


8. Étape 5 – Gestion des Configurations et Secrets

  1. Création du secret (via Helm ou kubectl)

    kubectl create secret generic dolibarr-db \
    --from-literal=DB_PASSWORD=$DB_PASSWORD \
    --namespace dolibarr

  2. Gestion des certificats TLS

    # templates/ingress.yaml (extrait)
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: {{ include "dolibarr.fullname" . }}
    annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    spec:
    ingressClassName: {{ .Values.ingress.className }}
    tls:
    - secretName: {{ .Values.ingress.tls.secretName }}
    hosts:
    - {{ .Values.ingress.hosts.0.host }}

    • cert‑manager détecte automatiquement le domaine via le DNS et délivre le certificat Let’s Encrypt ACME.

  3. Versionning des configs – Utilisez GitOps : tout changement de values.yaml passe par un PR.

    • helm diff upgrade en mode preview avant de pousser, évite les régressions.


9. Étape 6 – Observabilité (2026)

9.1 Métriques & Prometheus – Exporter intégré : Le conteneur expose /metrics via php-fpm_exporter (image stefan gates/php-fpm-exporter).

  • Scrape config (PrometheusOperator)

    - job_name: dolibarr
    metrics_path: /metrics
    static_configs:
    - targets: ['dolibarr.dolibarr.svc.cluster.local:80']

  • Alertmanager rules (exemple)

    groups:
    - name: dolibarr.rules
    rules:
    - alert: DolibarrHighErrorRate expr: rate(http_requests_total{status="5xx"}[5m]) > 0.05
    for: 2m
    labels:
    severity: warning annotations:
    summary: "Taux d’erreurs HTTP 5xx > 5 % sur Dolibarr"
    description: "L’instance {{ $labels.instance }} connaît un pic d’erreurs. Vérifier les logs."

9.2 Traces distribuées

  1. Installez OpenTelemetry PHP via Composer (opentelemetry/sdk-php).
  2. Exporter vers Tempo (backend de tracing). 3. Instrumenter les endpoints :

    use OpenTelemetry\SDK\Trace\TracerProvider;
    use OpenTelemetry\SDK\Export\ConsoleSpanExporter;
    $provider = new TracerProvider();
    $provider->addSpanProcessor(new \OpenTelemetry\SDK\Trace\Export\ConsoleSpanExporter());
    $tracer = $provider->getTracer('dolibarr');
    $span = $tracer->start('REQUEST');
    // ... votre logique
    $span->end();

  3. Dashboard Grafana : utilisez le public dashboard 16513 (Dolibarr Overview) et importez un template Grafana 10 pour les traces.

9.3 Logs structurés

  • DockerLoki (avec promtail side‑car)
  • Format de log : JSON
    {"timestamp":"2026-10-12T13:45:02Z","level":"info","msg":"Cache cleared","module":"mycompany.module.calendar","context":"cron"}
  • Alertes : Grafanaalerting rules sur errorrate ou latency


10. Étape 7 – Sécurité et Conformité (2026)

Action Outil/Démarche Exemple de config
Balayage d’image Trivy + Syft + Git‑Hub Dependabot detect-secrets dans le pipeline CI
Hardening du conteneur docker scan + Dockerfile avec USER non‑root USER 1001 dans Dockerfile
Gestion des vulnérabilités de la base QuantumDB (Scanning) SET GLOBAL sql_mode='STRICT_TRANS_TABLES';
CORS & CSP Middleware Nginx intégré au container add_header Content-Security-Policy "default-src 'self'" always;
Autorisation RBAC Kubernetes RBAC + pod‑security‑policy pod-security-policy: restricted
SOC‑2 / ISO 27001 Documentation IA (auto‑générée via asciidoctor) doc/security/audit.md
Secrets Rotation Vault (2024) intégré via Kubernetes External Secrets secret-store.csi.vault.csipolicy

Tip : Ajoutez dans le Dockerfile une étape qui exécute docker scan $IMAGE_NAME et échoue le build si des vulnérabilités critiques sont détectées.


11. Étape 8 – Déploiement en Production (GitOps)

11.1 Initialisation du cluster GitOps

# Instalation d'Argo CD via Helm
helm repo add argo https://argoproj.github.io/argo-helm
helm install argo-cd argo/argo-cd \
--namespace argocd --create-namespace \
--set server.ingress.enabled=true \
--set server.ingress.hosts[0]=argo.mycompany.com \
--set server.ingress.tls.enabled=true

  • Exposez l’interface Argo CD via TLS Let’s Encrypt grâce à cert-manager.

11.2 Application GitOps

# application-dolibarr.yaml (Argo CD Application)
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: dolibarr
namespace: argocd
spec:
project: default
source:
repoURL: https://gitlab.mycompany.com/infra/dolibarr-erp.git
targetRevision: HEAD
path: helm/dolibarr
destination:
server: https://kubernetes.default.svc
namespace: dolibarr
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true

  • Chaque push sur la branche main déclenche automatiquement la synchronisation du chart.
  • Les tags semver (v1.5.0) provoquent les déploiements de version majeure via Argo Rollout (déploiement canary).


12. Étape 9 – Mise à jour « Zero‑Downtime » (Canary)

  1. Déployer la version 2 (dolibarr:2.0) avec strategy: RollingUpdate + maxSurge: 25%, maxUnavailable: 25%.
  2. Utiliser Argo Rollout pour le contrôle du trafic :

    strategy:
    canary:
    steps:
    - setWeight: 10
    - pause: {duration: 2m}
    - setWeight: 30
    - pause: {duration: 5m}
    - setWeight: 100

  3. Observation via Prometheus metrics (request_latency_seconds, http_error_total).
  4. Rollback automatique si un seuil d’erreurs critiques est franchi.


13. Étape 10 – Maintenance & Évolution Continuelle

Activité Fréquence Outils
Mise à jour du framework PHP Tous les 6 mois PHP 8.4 → 8.5
Mise à jour de Dolibarr Mineur (patch) → mensuel ; majeur → annuel git pull, composer update
Renouvellement des certificats Automatique via cert‑manager Let’s Encrypt
Rotation des secrets Tous les 90 jours HashiCorp Vault / External Secrets
Audit de sécurité des dépendances Hebdomadaire Dependabot, Renovate
Nettoyage des images orphelines Mensuel docker image prune + registry:2 purge
Documentation versionnée À chaque release asciidoc + mkdocs → GitHub Pages

Conseil de DevOps : Conservez la configuration d’infrastructure (Helm values, manifests) dans le même repo que le code source. Ainsi, chaque modification de version de Dolibarr peut être testée dans un environnement d’intégration avant d’être promue.


14. Checklist “Ready‑to‑Prod” (Dolibarr 2026)

Item
1 Docker image signée (cosign / Notary)
2 SBOM (Syft) stocké dans l’image et accessible via oras
3 Scan de vulnérabilités passé avec critical = 0
4 Tests unitaires >= 90 % de couverture
5 Helm chart versionnée (Chart.yaml + version: 0.3.2)
6 Ingress TLS valid via cert‑manager (pas d’erreur de chaîne)
7 Prometheus scrape sans erreurs
8 Alertmanager règles non‑alerting pour le déploiement initial
9 Tests de charge (k6) : <= 200 ms pour 95 % des requêtes
10 Documentation OpenAPI 3.0 générée et accessible (/dolibarr/swagger.yaml)
11 Backup automatisé du PVC (Velero) configuré
12 Logs structurés (JSON) publiés sur Loki avec champs module, env
13 Métriques de GC PHP et de pool de travailleurs vérifiées
14 Déploiement canary testé avec Argo Rollout et rollback fonctionnel
15 Version de Kubernetes ≥ v1.29 et Node OS à jour (Ubuntu 24.04 LTS)


15. Exemple de script complet « Deploy‑Dolibarr.sh » (DevOps friendly)

#!/usr/bin/env bashset -euo pipefail
# --------------------------------------------------------------
# 1️⃣ Variables
# --------------------------------------------------------------
NAMESPACE="dolibarr"
HELM_RELEASE="dolibarr"
IMAGE_TAG="${1:-latest}"
REGISTRY="registry.gitlab.com/mycompany/dolibarr"
# --------------------------------------------------------------
# 2️⃣ Build & Push Docker image (local CI‑like step)
# --------------------------------------------------------------
docker buildx create --use >/dev/null 2>&1 || true
docker buildx build \
--push \
-t "$REGISTRY/dolibarr:$IMAGE_TAG" \
-t "$REGISTRY/dolibarr:latest" \
.
# --------------------------------------------------------------
# 3️⃣ Helm upgrade (GitOps style)
# --------------------------------------------------------------
helm upgrade --install "$HELM_RELEASE" ./helm/dolibarr \
--namespace "$NAMESPACE" --create-namespace \
--set image.tag="$IMAGE_TAG" \
--set env.DB_PASSWORD="${DB_PASSWORD:-$(openssl rand -hex 12)}" \
--set ingress.host="dolibarr.local.mycompany.com" \
--set ingress.tls.enabled=true \
--set ingress.tls.secretName="dolibarr-tls"
echo "✅ Dolibarr déployé avec succès en $NAMESPACE (image $IMAGE_TAG)"


16. Conclusion

En 2026, Dolibarr n’est plus seulement un ERP/CRM « lite » installé sur un serveur LAMP, mais un micro‑service déclaratif qui s’intègre parfaitement dans une chaîne DevOps moderne :

  1. Containerisation avec Docker multi‑stage, SBOM et healthcheck.
  2. CI/CD automatisé (GitLab CI / GitHub Actions) incluant lint, tests, scans de sécurité, build d’images et déploiement via Helm.
  3. GitOps (Argo CD ou Flux) assure la déclarativité et la synchronisation continue entre le repo Git et le cluster K8s.
  4. Observabilité complète (Prometheus, Grafana, Tempo, Loki) pour garantir disponibilité, performance et trouver du temps de réponse.
  5. Sécurité par défaut : images signées, secrets rotatifs, RBAC, posture de conformité.
  6. Déploiement canary avec Argo Rollout pour zero‑downtime et rollback immédiat.

Suivez ce tutoriel pas à pas, adaptez les valeurs à vos exigences métier (exemple : modules spécifiques à votre secteur) et vous disposerez d’un environnement Dolibarr résilient, scalable et prêt pour l’avenir dans le paysage DevOps de 2026.

Bonne implémentation ! 🚀


Sources & références (2025‑2026) – Documentation officielle Dolibarr 24.x, Helm chart community, Kubernetes 1.29 release notes, OpenTelemetry PHP SDK 2.6, cert‑manager 1.15.

Publications similaires