Metabase – Chaîne DataViz dockerisée (PostgreSQL + Dashboard)

Docker: Subventions – Dashboard Metabase

Je voulais une chaîne DataViz locale, reproductible : PostgreSQL pour les données, Metabase pour l’analyse, et Docker Compose pour démarrer/stopper le tout en une commande. L’objectif : packager l’infra, structurer la donnée et exposer des indicateurs métier clairs.

Docker Compose PostgreSQL 15 Metabase SQL Backups
  • Catégorie : Application / DataViz
  • Contexte : VM Debian 12 (local)
  • Livrables : BDD démo, questions Metabase, dashboard, scripts de sauvegarde
Voir le repository GitHub
Contexte & objectifs

- Côté produit, le besoin est d’analyser des subventions par organisme, finalité et période pour raconter une histoire (évolution, saisonnalité, top bénéficiaires).

- Côté technique, je veux un environnement reproductible : on clône, on lance, et tout fonctionne (base, données, visus). Je privilégie Docker pour la portabilité, et j’ajoute une stratégie de sauvegarde pour la robustesse.

Architecture & Docker Compose

Deux services (db et metabase) sur le même réseau Docker, avec volumes persistants pour ne pas perdre l’état. Je peux redémarrer la stack sans reconfigurer Metabase ni la base.

version: "3.8"
services:
  db:
    image: postgres:15
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: subventions_db
    ports: ["5432:5432"]
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./sql:/docker-entrypoint-initdb.d
    restart: unless-stopped

  metabase:
    image: metabase/metabase:latest
    ports: ["3000:3000"]
    depends_on: [db]
    environment:
      MB_DB_TYPE: postgres
      MB_DB_DBNAME: subventions_db
      MB_DB_PORT: 5432
      MB_DB_HOST: db
      MB_DB_USER: postgres
      MB_DB_PASS: postgres
    volumes:
      - metabase-data:/metabase-data
    restart: unless-stopped

volumes: { pgdata: {}, metabase-data: {} }

Lancement : docker compose up -d → Metabase sur http://localhost:3000.

Modèle de données & chargement

Schéma minimaliste : table subventions (id, organisme, objet, montant, date_versement) alimentée par un script SQL étendu pour simuler plusieurs années et organismes.

# Injection (depuis l'hôte)
docker compose exec -T db psql -U postgres -d subventions_db \
  -f /docker-entrypoint-initdb.d/extended_subventions.sql

Dans Metabase, je tippe correctement les colonnes (date, nombre), je crée des “Questions” (séries temporelles, top N, répartitions) puis je les assemble en Dashboard (évolution mensuelle, top organismes, total par finalité).

Sauvegarde & restauration (pg_dump)

Stratégie adoptée : un script de sauvegarde génère chaque jour un dump horodaté de la base et conserve les 7 derniers fichiers. Cette approche est simple, lisible et suffisante pour une démonstration, tout en permettant une restauration immédiate en cas de besoin.

#!/usr/bin/env bash
set -euo pipefail
STAMP=$(date +%Y%m%d_%H%M)
OUT="backups/subventions_${STAMP}.sql"
mkdir -p backups

# Dump BDD
docker compose exec -T db pg_dump -U postgres subventions_db > "$OUT"

# Rétention 7 jours
find backups -type f -name "subventions_*.sql" -mtime +7 -delete
echo "Backup OK -> $OUT"
# Restauration
docker compose exec -T db psql -U postgres -d subventions_db \
  < backups/subventions_YYYYMMDD_HHMM.sql

Cron d’exemple : 15 2 * * * /bin/bash /chemin/backup.sh >> /chemin/backup.log 2>&1

Sécurité & observabilité minimales
  • Variables sensibles dans un .env (pas d’identifiants en clair dans le YAML).
  • Volumes pgdata / metabase-data pour la persistance.
  • Logs temps réel : docker compose logs -f db / metabase.
  • Si exposition externe : reverse proxy et authentification.
Résultats & enseignements
  • Dashboard métier opérationnel : Evolution mensuelle des subventions, top bénéficiaires par organisme, répartition par finalité/périmètre.
  • Stack reproductible : déploiement « docker compose up -d », relance sans perte (volumes pgdata / metabase-data).
  • Dataset réaliste : données synthétiques pluriannuelles (saisonnalité, montées en charge), typage soigné (dates, montants) pour des visus fiables.
  • Sauvegarde & restauration : script pg_dump avec rétention 7 jours, restauration testée (psql) → rollback rapide en cas d’incident.
  • Observabilité minimale : logs temps réel (docker compose logs -f), variables sensibles externalisées (.env), relance idempotente.
Enseignements clés
  • Industrialisation : packaging Docker + init SQL = environnement portable, documenté, prêt pour démonstration/formation.
  • Data design pragmatique : schéma minimal mais expressif (temps, finalité, organisme) → indicateurs métier immédiatement actionnables.
  • Réflexe DevOps : persistance, secrets, scripts d’exploitation, backups → pensée cycle de vie, pas seulement « déploiement ».
  • Traduction valeur : passer de la donnée brute aux insights (tendances, saisonnalité, top N) pour éclairer la décision.

Ouvrir le repo (code & fichiers SQL)