Module 3 — DataOps Autonome

Automation Layer

Mettez en place des pipelines DataOps autonomes et résilients — backups, alertes métriques, rapports programmés et workflows conditionnels — 24h/24 sans intervention humaine.

Vue d'ensemble

L'Automation Layer transforme DIXX en un opérateur autonome de données. Il permet de transformer des opérations manuelles (sauvegardes, nettoyages, rapports) en pipelines intelligents auto-exécutants, capables de fonctionner sans intervention humaine, en continu. Chaque pipeline suit une logique rigoureuse et extensible.

Élimination des tâches répétitives
Exécution autonome 24/7
Logique Trigger → Action
Retry exponentiel intégré
Idempotency garantie
Monitoring complet

Modèle d'Orchestration Unifié

Chaque pipeline repose sur un modèle standard étendu, avec un niveau de Post-Actions permettant le chaining intelligent entre pipelines.

TriggerDéclencheur
ConditionsVérifications
ActionsExécution
Post-ActionsChaining
NotificationsAlertes
LogsObservabilité
Post-Actions — Nouveauté
Les Post-Actions permettent le chaining intelligent : si un backup réussit, le système peut automatiquement déclencher la génération d'un dashboard, puis envoyer un rapport. C'est ce qui transforme DIXX en système agentique réel.

Typologie des Déclencheurs

Temporels
  • Expression Cron (0 2 * * *)
  • Intervalles (minutes, heures, jours)
  • Fenêtre horaire UTC (business_hours)
Data-Driven
  • Nouvelle donnée détectée
  • Variation de métrique (gt, lt, eq)
  • Seuil métier atteint (baseline_query)
Système
  • Échec backup (last_run_outcome)
  • Perte réseau (NetworkStatusNotifier)
  • Latence DB élevée
IA Agentique
  • Détection d'anomalies
  • Insight critique généré
  • Score de risque dépassé

Moteur de Conditions Avancé

DIXX embarque un moteur logique complet supportant les conditions simples, combinées (AND/OR) et dynamiques basées sur les sorties des pipelines précédents.

json
{
  "conditions": [
    {
      "type": "group",
      "config": {
        "op": "AND",
        "items": [
          { "type": "rbac", "config": { "requiredRole": "editor" } },
          { "type": "require_connection" },
          {
            "type": "utc_window",
            "config": { "startHour": 2, "endHour": 4, "days": [1,2,3,4,5] }
          }
        ]
      }
    },
    {
      "type": "last_run_outcome",
      "config": { "expect": "success" }
    }
  ]
}

Les 6 Pipelines Disponibles

1
Backup Automatique
Sauvegarde planifiée avec retry automatique (×3 tentatives) et fallback vers stockage alternatif si le stockage principal est indisponible.
WORMRetry ×3Fallback StorageIncremental
2
Dashboard Automatique
Génération et envoi automatique d'un tableau de bord à intervalle régulier. Cache des résultats et versioning des dashboards générés.
CacheVersioningAuto-envoi
3
Nettoyage Data (Autonomous Purge)
Suppression sécurisée des doublons et données obsolètes avec mode dry-run obligatoire avant exécution réelle et validation RBAC.
Dry-runRBACValidation
4
Alertes Métriques (Data Drift Guard)
Surveillance d'indicateurs clés avec seuils dynamiques basés sur la moyenne historique et score de criticité (low / medium / high).
Seuils dynamiquesBaseline QueryScore criticité
5
Rapports Programmés
Envoi d'un rapport formaté à une liste de destinataires à intervalle régulier. Historique des rapports envoyés et multi-destinataires.
Multi-destinatairesHistoriqueEmail + SMS
6
Workflow Conditionnel (Agentic Workflow)
Workflows dynamiques basés sur les résultats des pipelines précédents. Permet le chaining SI backup.success → run dashboard → send report.
ChainingPost-ActionsConditionnel

Retry Exponentiel & Idempotency

Chaque action critique est protégée par un algorithme de retry avec backoff exponentiel et jitter aléatoire pour éviter les collisions en cas d'exécution simultanée.

typescript
// src/lib/services/automation-service.ts
export async function withRetries(
  label: string,
  fn: () => Promise,
  options?: { maxAttempts?: number; baseDelayMs?: number; maxDelayMs?: number }
): Promise {
  const maxAttempts = options?.maxAttempts ?? 3;
  const baseDelayMs = options?.baseDelayMs ?? 1000;
  const maxDelayMs = options?.maxDelayMs ?? 30_000;
  
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
    try {
      return await fn();
    } catch (e) {
      if (attempt >= maxAttempts) throw e;
      // Exponential Backoff + Jitter anti-collision
      const exp = Math.min(maxDelayMs, baseDelayMs * Math.pow(2, attempt - 1));
      const jitter = Math.floor(Math.random() * 250);
      await sleep(exp + jitter); // ex: 1s, 2s, 4s (+ jitter)
    }
  }
}
// Idempotency : chaque job identifié par idempotencyKey
// → évite les double-exécutions cron simultanées
Stale Job Detection
Les jobs bloqués en statut running depuis plus de 8 minutes (STALE_RUNNING_MS = 8 * 60 * 1000) sont automatiquement détectés et relancés pour éviter les deadlocks.

Système de Notifications Intelligent

La stratégie de notification s'adapte automatiquement au niveau de criticité de l'événement, avec anti-spam via cooldown configurable par pipeline.

Critical
SMS + Email
Déclenché sur échec persistant après retry. Garantit la réception même sans data.
Standard
Email uniquement
Résultats standards et rapports programmés. Email Resend avec sujet configurable.
Info
In-app seulement
Notifications informatives légères sans alertes externes.

SMS First Strategy — Marché Africain

Twilio est utilisé comme canal de notification critique pour garantir la réception même en cas de coupure data. Cette approche « SMS First » est une adaptation clé aux réalités du marché africain.

typescript
// Logique de sélection du canal (automation-service.ts)
// critical → SMS + Email
// standard → Email seulement  
// info     → in-app uniquement

const failureSeverity = onFailureSms ? "critical" : "standard";
AFRICAN SMS MARKET

Création via Langage Naturel

L'utilisateur peut créer un pipeline complet en une phrase dans le Smart Terminal. L'IA parse la demande et génère automatiquement la configuration JSON du pipeline.

1

Saisie Naturelle

L'utilisateur écrit : "Backup tous les jours à 2h et alerte-moi en cas d'échec"
2

Parsing IA

DIXX extrait automatiquement le trigger (cron), les actions (backup) et les notifications (SMS on failure, Email on success).
3

Confirmation Utilisateur

Un résumé est présenté avec les options Modifier / Activer avant toute mise en production du pipeline.
4

Suggestions Proactives

L'IA propose automatiquement des pipelines si elle détecte une anomalie : "Vous n'avez pas de backup actif sur production_db".

Architecture Queue (DB-Native MVP)

En MVP, DIXX utilise une stratégie de queue 100% native Next.js basée sur la table PostgreSQL automation_queue via Supabase. Aucun service externe Redis ou BullMQ n'est requis.

Zéro dépendance externe
La queue DIXX ne dépend d'aucun abonnement tiers. Elle fonctionne entièrement via Supabase (PostgreSQL), ce qui garantit une disponibilité identique à la base de données principale.
sql
-- Table automation_queue : source de vérité de tous les jobs
SELECT id, automation_id, status, priority, attempts, retry_after
FROM automation_queue
WHERE status = 'pending'
  AND is_dead_letter = false
  AND retry_after <= NOW()
ORDER BY priority ASC, scheduled_for ASC
LIMIT 10; -- polling toutes les minutes via /api/cron
Priorité
1=haute, 5=normale, 10=basse. Jobs critiques traités en premier.
Dead Letter Queue
Après max_attempts, le job devient dead_letter et n'est plus repris.
Backoff Exponentiel
retry_after calculé: 2^attempts secondes (max 1h) via trigger DB.
Idempotency
Clé UNIQUE (automation_id, idempotency_key) pour éviter les doubles exécutions.

Limites Institutionnelles MVP

DIXX MVP impose une limite explicite de 10 000 lignes par requête SELECT et par fichier uploadé. Cette limite garantit la performance et la stabilité de la plateforme pour toutes les équipes.

Limite active : 10 000 lignes
Configurable via la variable d'environnement NEXT_PUBLIC_MAX_ROWS
  • Requêtes SELECT → tronquées à 10k lignes avec limit_warning dans la réponse API
  • Upload Excel/CSV → tronqué à 10k lignes avec limit_warning dans la réponse
  • Évolutif : augmenter NEXT_PUBLIC_MAX_ROWS + activer la pagination institutionnelle