Sauvegarde & Résilience
Mise en œuvre du stockage souverain (BYOS) et des protocoles d'immuabilité WORM. Protection automatique, résiliente et souveraine de vos données critiques.
Types de Sauvegarde
DIXX supporte 5 types de sauvegarde selon vos besoins de récupération et vos contraintes de bande passante. Seul PostgreSQL est actuellement supporté pour l'export natif via pg_dump.
Stratégie WORM — Immuabilité Logicielle
DIXX implémente une politique WORM (Write Once, Read Many). Une fois marqué WORM, un backup ne peut être ni modifié ni supprimé via l'interface ou l'API standard pendant toute sa période de rétention.
[WORM] dans le nom du fichier et le path /worm/ identifient les backups immuables.// src/lib/services/backup-service.ts
// Identification des backups WORM
private static isWormRow(row: any) {
return (
String(row?.filename || "").includes("[WORM]") ||
String(row?.storage_path || "").includes("/worm/")
);
}
// Politique de rétention : les WORM sont exclus de la suppression automatique
const deletable = oldRows.filter((r) => !this.isWormRow(r));
// Structure du path de stockage :
// {ownerId}/{connectionId}/worm/{filename} → WORM (immuable)
// {ownerId}/{connectionId}/standard/{fn} → Standard (rétention normale).manifest.json contenant les métadonnées de chaîne (type, parentId, lineage, isWorm).single | incremental | differential est tracé viaparentBackupId et baseFullBackupId dans les métadonnées.Stockage Souverain (BYOS)
La fonctionnalité BYOS (Bring Your Own Storage) — ou Stockage Personnel Connecté — permet de connecter votre propre infrastructure cloud directement à DIXX.
// Configuration BYOS dans backup_configurations
type BackupConfiguration = {
byos_type: "supabase" | "s3" | "google_drive";
byos_config: {
// Pour S3 :
bucket_name: string;
region: string;
access_key_id: string;
secret_access_key: string;
// Pour Google Drive :
folder_id: string;
google_refresh_token_enc: string; // Chiffré AES-256
};
is_enabled: boolean;
schedule_cron: string | null; // ex: "0 2 * * *"
retention_days: number;
backup_type: "full" | "incremental" | "differential";
};Workflow de Sauvegarde
Configuration Initiale (une seule fois)
Exécution Automatique
pg_dump avec les paramètres appropriés, gère les métadonnées de chaîne et uploade le fichier vers le stockage configuré avec retry ×3.Monitoring & Historique
backups_history : chaque backup est tracé avec son statut, sa taille en bytes, sa durée, son path de stockage et ses métadonnées de chaîne.Restauration en Un Clic
pg_restore --clean --if-exists avec vérification d'intégrité.Politique de Rétention
La politique de rétention est configurée par connexion dans backup_configurations.retention_days. Les backups dépassant la période configurée sont automatiquement supprimés du stockage —sauf les backups WORM qui sont protégés jusqu'à leur période de rétention spécifique.
// Politique de rétention automatique (backup-service.ts)
private static async applyRetentionPolicy(
connectionId: string, retentionDays: number
) {
const cutoff = new Date(
Date.now() - retentionDays * 24 * 60 * 60 * 1000
).toISOString();
const { data: oldRows } = await supabase
.from("backups_history")
.select("id, filename, storage_path")
.eq("connection_id", connectionId)
.lt("created_at", cutoff);
// ✅ Exclure les backups WORM de la suppression
const deletable = oldRows.filter((r) => !this.isWormRow(r));
// Suppression Supabase Storage + enregistrements DB
await supabase.storage.from("backups").remove(paths);
await supabase.from("backups_history").delete().in("id", ids);
}