Une pile Docker composée de Portainer, PostgreSQL, Airbyte, n8n et Metabase centralise ingestion, stockage, automatisation et reporting à faible coût, en s’appuyant sur outils open-source et volumes persistants (docs officiels des projets). Poursuivez pour un guide pratique de déploiement et d’exploitation.
Pourquoi commencer par Portainer
Portainer fournit une interface légère pour gérer vos conteneurs sans donner d’accès root, ce qui en fait le premier outil à installer dans une petite entreprise.
Je recommande Portainer comme point d’entrée pour plusieurs raisons pratiques et sécuritaires.
Points clés :
- Facilité d’installation — Portainer s’installe en quelques commandes et évite les prises de tête pour les non-experts.
- Modèles d’application — Portainer propose des templates pour déployer rapidement des services courants.
- Accès en lecture pour les non-techniques — Possibilité de donner une visibilité sans droits d’administration complets.
- Gestion des stacks Docker Compose — Permet de versionner et redéployer des stacks sans SSH sur l’hôte.
- Surveillance et santé — Vue de l’état des conteneurs, logs et métriques simples.
- Redémarrages sécurisés — Policies de restart et actions groupées sans manipulations CLI dangereuses.
- Support Docker/Swarm/Kubernetes minimal — Compatibilité multi-orchestrateurs pour évoluer ensuite.
Sur la sécurité, Portainer supporte un contrôle d’accès basique (RBAC minimal) qui limite les actions selon les rôles, évitant de partager les credentials root de l’hôte.
Exemple de docker-compose.yml minimal :
version: "3.8"
services:
portainer:
image: portainer/portainer-ce:latest
ports:
- "9000:9000"
- "9443:9443"
volumes:
- portainer_data:/data
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: unless-stopped
volumes:
portainer_data:
Commande docker run alternative :
docker run -d --name portainer \
-p 9000:9000 -p 9443:9443 \
-v portainer_data:/data \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--restart unless-stopped \
portainer/portainer-ce:latest
Bonnes pratiques : Limiter l’accès réseau (firewall/VPN), activer HTTPS (certificat valide) si exposition publique, et sauvegarder régulièrement le volume portainer_data.
Consommation indicative : Portainer utilise typiquement entre 50–200 MB de RAM en idle selon la charge, et peu de CPU ; chiffres issus de la documentation officielle et retours d’expérience courants.
| Fonction | Ports | Volumes à sauvegarder | Permissions recommandées | Notes d’usage |
| Interface de gestion | 9000 HTTP, 9443 HTTPS | portainer_data (/data) | Accès RBAC, Docker socket en lecture seule | Déployer d’abord Portainer puis vos stacks |
Pourquoi choisir PostgreSQL comme source de vérité
PostgreSQL fournit une base relationnelle robuste (ACID) pour remplacer feuilles de calcul et exports CRM, tout en apportant types avancés et extensions utiles pour la data.
Avantages principaux :
- Intégrité des données : Transactions ACID garantissant cohérence en cas de conflit ou de panne.
- Types avancés : JSONB pour documents, arrays, enums, et timestamps précis pour analytique.
- Extensions puissantes : pgvector pour embeddings ML, PostGIS pour données géospatiales, citext pour textes insensibles à la casse.
- Écosystème riche : Intégrations BI (Metabase, Superset), ETL (Airflow, Singer), et connecteurs pour apps.
- Adapté aux petites structures : Fiabilité, communauté massive et coût d’exploitation faible (logiciel libre).
Stratégie de volumes persistants Docker :
- Utiliser un volume nommé Docker (ex : db_data) monté sur /var/lib/postgresql/data pour garantir persistance et portabilité.
- Séparer données et configuration si besoin (config maps ou fichiers docker secrets pour mots de passe).
Backups et restores basiques :
# Dump complet
pg_dump -h localhost -p 5432 -U myuser -F c -b -v -f backup.dump mydb
# Restore
pg_restore -h localhost -p 5432 -U myuser -d mydb -v backup.dump
Automatisation des sauvegardes :
- Planifier un container cron ou un job externe (CI/CD, serveur backup) qui exécute pg_dump et pousse les archives vers un stockage externe (S3, NAS).
- Conserver rétentions (ex : 7 jours différentiel, 30 jours full) et vérifier régulièrement les restores.
Exemple docker-compose :
version: "3.8"
services:
db:
image: postgres:15
environment:
POSTGRES_DB: mydb
POSTGRES_USER: myuser
POSTGRES_PASSWORD: strongpassword
volumes:
- db_data:/var/lib/postgresql/data
ports:
- "5432:5432"
deploy:
resources:
limits:
cpus: "0.5"
memory: 512M
# Note: deploy.resources fonctionne en Swarm; en local, utiliser --memory / --cpus via docker run ou options du moteur.
volumes:
db_data:
Séparation des environnements et montée en charge :
- Créer trois instances distinctes (dev/test/prod) ou des bases séparées avec paramètres differents.
- Indexer les colonnes les plus consultées, monitorer les plans avec EXPLAIN, et utiliser PgBouncer pour pooling de connexions avant d’augmenter la taille serveur.
| DB name | Port | Volume path | Env vars essentielles | Recommandation sauvegarde | Taille init. conseillée |
| PostgreSQL (mydb) | 5432 | /var/lib/postgresql/data (db_data) | POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD | pg_dump régulier + push S3, rétention 7/30j | 10–50 GB selon activité |
Comment Airbyte simplifie l’ingestion de vos SaaS
Airbyte automatise l’extraction des données de vos SaaS vers PostgreSQL sans écrire de connecteurs manuellement.
Airbyte joue le rôle d’extracteur et de chargeur dans la chaîne ELT (Extract → Load → Transform).
- Extraction : Airbyte se connecte aux APIs des SaaS (Stripe, QuickBooks, HubSpot, Google Ads, Mailchimp) pour lire les données.
- Load : Airbyte écrit directement dans une destination (ici PostgreSQL).
- Transform : Les transformations doivent être faites en aval (dbt, SQL dans la base). Airbyte propose une normalization basique mais n’est pas une plateforme de transformation complète.
Airbyte supporte des connecteurs courants comme Stripe, QuickBooks, HubSpot, Google Ads et Mailchimp.
Les synchronisations peuvent être configurées en full refresh ou incremental (incrémental).
La gestion des schémas se fait via détection automatique et mapping de colonnes ; la déduplication dépend souvent de la configuration (clé primaire déclarée) et du mode incrémental.
Exemple de docker-compose.yml minimal (server + worker + db interne) :
version: '3.8'
services:
airbyte-db:
image: postgres:13
environment:
POSTGRES_USER: airbyte
POSTGRES_PASSWORD: airbyte_password
POSTGRES_DB: airbyte
volumes:
- ./pgdata:/var/lib/postgresql/data
airbyte-server:
image: airbyte/server:latest
ports:
- "8000:8000"
environment:
DATABASE_URL: jdbc:postgresql://airbyte-db:5432/airbyte
depends_on:
- airbyte-db
airbyte-worker:
image: airbyte/worker:latest
depends_on:
- airbyte-server
airbyte-webapp:
image: airbyte/webapp:latest
ports:
- "8080:80"
depends_on:
- airbyte-server
Pour utiliser PostgreSQL externe, supprimer le service airbyte-db et définir la variable d’environnement DATABASE_URL (ou la variable indiquée par la doc) vers votre instance managée.
Configuration d’une destination PostgreSQL : fournir Host, Port, Database, User, Password et choisir le schema (par exemple public ou un schema dédié par source).
Création d’une source SaaS typique : renseigner les identifiants API (clé secrète pour Stripe), ou configurer OAuth pour Google Ads/HubSpot en fournissant client_id/client_secret et scopes requis.
Sécuriser l’UI : exposer uniquement via reverse-proxy TLS (nginx/traefik), activer authentification, restreindre l’accès réseau aux IPs de votre infra.
Bonnes pratiques : limiter la fréquence pour éviter le throttling, monitorer les logs et métriques Airbyte, tenir à jour les connecteurs, prévoir retries/exponentiel backoff et stocker l’état de réplication.
Airbyte facilite l’export vers d’autres destinations (S3, Redshift, BigQuery) en changeant la destination sans réécrire les connecteurs sources.
| Connecteurs prioritaires | Fréquence recommandée | Impact API rate limits | Points d’attention |
| Stripe | 15min–1h | Moyen (pagination forte) | Clé secrète, permissions lecture |
| HubSpot | 30min–2h | Variable (quota par app) | OAuth scopes CRM |
| Google Ads | 1h–daily | Élevé (quotas stricts) | OAuth + scopes analytics/ads |
| Mailchimp | 1h–daily | Faible–Moyen | API key, listes segmentées |
| QuickBooks | 1h–daily | Moyen (throttling possible) | OAuth, permissions comptables |
Quand et comment automatiser avec n8n
n8n permet d’orchestrer des workflows automatisés entre vos SaaS et votre base PostgreSQL sans écrire de code lourd, idéal pour une petite entreprise qui veut automatiser synchronisations, alertes et ingestions de données.
- Cas d’usage business — Synchronisation CRM → DB : Récupération périodique des contacts et enrichment en base.
- Cas d’usage business — Alerting sur KPI : Requêtes sur PostgreSQL et envoi d’alertes Slack/Email si seuils dépassés.
- Cas d’usage business — Ingestion post-Airbyte : Traitement et normalisation après chargement ETL.
- Cas d’usage business — Envoi de rapports : Génération CSV/PDF et distribution par email/SFTP.
- Cas d’usage business — Automatisation facturation : Création d’écritures, relances et intégration comptable.
- Cas d’usage business — Webhooks entrants : Déclenchement sur événements Stripe, GitHub, forms, etc.
Exemple docker-compose.yml pour n8n + PostgreSQL :
version: '3.8'
services:
postgres:
image: postgres:14
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: n8n_pass
POSTGRES_DB: n8n
volumes:
- ./pgdata:/var/lib/postgresql/data
restart: unless-stopped
n8n:
image: n8nio/n8n:latest
environment:
- DB_TYPE=postgresdb
- DATABASE_URL=postgresql://n8n:n8n_pass@postgres:5432/n8n
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- N8N_HOST=your.domain.example
volumes:
- ./n8n:/home/node/.n8n
ports:
- "5678:5678"
depends_on:
- postgres
restart: unless-stopped
Sécurisation essentielle :
- Activer l’authentification basique (N8N_BASIC_AUTH_ACTIVE) et utiliser un mot de passe stocké en secret Docker, Vault ou variable d’environnement protégée.
- Placer n8n derrière un proxy HTTPS (Nginx ou Traefik) pour TLS et redirection, et forcer HSTS.
- Limiter l’accès par IP via firewall ou proxy pour les consoles sensibles.
- Ne pas stocker de credentials en clair dans le container ; utiliser Docker secrets, HashiCorp Vault ou Kubernetes Secrets.
Workflow exemple (Nouvelle facture Stripe → écrire en PostgreSQL → notifier Slack/Email) :
- Stripe Webhook (Trigger) : Réception de l’événement invoice.paid.
- Function/Transform Node : Extraction des champs utiles (id facture, montant, client, date).
- Postgres Node : Requête INSERT dans la table invoices (paramétrée via DATABASE_URL).
- Slack Node : Envoi d’un message dans le canal finance avec le résumé.
- SMTP Node : Envoi d’un email de notification au service comptable si montant > seuil.
Monitoring et gestion des credentials :
- Mettre en place des métriques et logs centralisés (Prometheus/Grafana ou ELK) et alertes sur erreurs d’exécution.
- Auditer les workflows et limiter les permissions API utilisées par les credentials.
- Régénérer périodiquement les clés et utiliser chiffrement (N8N_ENCRYPTION_KEY) pour les données sensibles.
| Cas d’usage | Trigger type | Fréquence | Précautions sécurité |
| Sync CRM → DB | Webhook / Polling API | Min/heure | Limiter scope API, stocker creds en secrets |
| Alerting KPI | Schedule / DB query | Toutes les minutes à heures | Chiffrement des seuils, HTTPS |
| Ingestion post-Airbyte | Webhook / File trigger | À l’arrivée | Validation schéma, quotas |
| Facturation | Webhook / Manual | Temps réel / batch | Journalisation, accès restreint |
Quel outil pour les rapports finalisés Metabase ou autre
Metabase fournit des rapports et dashboards simples pour exploiter la donnée dans PostgreSQL sans développement lourd.
Je recommande Metabase pour les PME qui veulent des tableaux de bord utilisables par des non-techniques, une construction de requêtes visuelle (Query Builder) pour éviter le SQL systématique, des partages d’insights via liens et tableaux de bord embarqués, des alertes basées sur des questions et des exports CSV/PNG pour distribution.
Voici un docker-compose minimal pour démarrer Metabase en production légère (variables configurables pour utiliser PostgreSQL comme base metadata) :
version: '3.8'
services:
metabase:
image: metabase/metabase:latest
restart: unless-stopped
ports:
- "3000:3000"
environment:
MB_DB_TYPE: "postgres"
MB_DB_CONNECTION_URI: "${MB_DB_CONNECTION_URI}"
volumes:
- ./metabase-data:/metabase-data
Connexion à PostgreSQL : Metabase se connecte à PostgreSQL soit comme source de données, soit comme base metadata (recommandé en production). Créer un utilisateur PostgreSQL en lecture seule pour les sources de données (SELECT uniquement), limiter l’accès aux schémas nécessaires et activer SSL si disponible (paramètre sslmode dans MB_DB_CONNECTION_URI). Pour la base metadata de Metabase, donner des droits CREATE/UPDATE sur sa base dédiée uniquement.
Alternatives rapides : Redash pour des requêtes SQL orientées analystes (plus léger pour les requêtes SQL), Apache Superset pour des usages plus complexes et scalables (plus lourd à installer). Metabase reste simple à déployer, plus adapté aux équipes mixtes et sans spécialiste BI.
Recommandations de sizing minimal : 1 vCPU + 1–2 Go RAM pour tests ou très petites équipes, 2 vCPU + 4 Go RAM pour 5–20 utilisateurs actifs.
Conseils opérationnels : Utiliser PostgreSQL pour historiser les « questions » (éviter H2 embarqué), activer l’authentification SSO/LDAP si disponible, gérer les permissions par collection et limiter l’export si les données sont sensibles.
| Outil | Complexité d’installation | Besoin SQL | Partage | Meilleures utilisations | Préconisations de sécurité |
| Metabase | Faible | Faible à moyen (Query Builder + SQL) | Liens, embed, exports | PME, self-service BI | DB metadata sur Postgres, users read-only, SSL |
| Redash | Moyenne | Elevé (orienté SQL) | Dashboards, alerts | Analystes SQL, queries ad-hoc | Limiter accès SQL, sandboxing |
| Apache Superset | Elevée | Moyen à élevé | Riches, embeddings | Entreprises ayant besoin de custom charts | Isoler services, RBAC, HTTPS |
Sources : Documentation Metabase (https://www.metabase.com/docs/latest/), Apache Superset (https://superset.apache.org/docs/), Redash community.
Prêt à déployer une pile Docker rentable pour votre business ?
Je recommande une pile composée de Portainer (gestion), PostgreSQL (stockage), Airbyte (ingestion), n8n (automatisation) et Metabase (reporting) pour centraliser vos données à moindre coût et garder la maîtrise de vos process. Cette approche réduit les silos, limite les coûts SaaS et vous donne portabilité et contrôle. Le bénéfice : des opérations plus réactives, des décisions basées sur données fiables, et une facture IT allégée.
FAQ
A propos de l’auteur
Franck Scandolera — expert & formateur en Tracking avancé server-side, Analytics Engineering, Automatisation No/Low Code (n8n), intégration de l’IA en entreprise et SEO/GEO. Responsable de l’agence webAnalyste et de l’organisme de formation Formations Analytics. Références : Logis Hôtel, Yelloh Village, BazarChic, Fédération Française de Football, Texdecor. Dispo pour aider les entreprises => contactez moi.
⭐ Analytics engineer, Data Analyst et Automatisation IA indépendant ⭐
- Ref clients : Logis Hôtel, Yelloh Village, BazarChic, Fédération Football Français, Texdecor…
Mon terrain de jeu :
- Data Analyst & Analytics engineering : tracking avancé (GTM server, e-commerce, CAPI, RGPD), entrepôt de données (BigQuery, Snowflake, PostgreSQL, ClickHouse), modèles (Airflow, dbt, Dataform), dashboards décisionnels (Looker, Power BI, Metabase, SQL, Python).
- Automatisation IA des taches Data, Marketing, RH, compta etc : conception de workflows intelligents robustes (n8n, App Script, scraping) connectés aux API de vos outils et LLM (OpenAI, Mistral, Claude…).
- Engineering IA pour créer des applications et agent IA sur mesure : intégration de LLM (OpenAI, Mistral…), RAG, assistants métier, génération de documents complexes, APIs, backends Node.js/Python.






