Aller au contenu principal

Sauvegarde et restauration

Protéger votre installation : les trois façons de sauvegarder vos données, ce que contient chacune, comment sortir les copies de la machine, comment restaurer, comment exporter vos données et comment vérifier qu'une sauvegarde vaut quelque chose.

Tout ce que votre passerelle connaît (messages, contacts, conversations, campagnes, règles, paramètres, comptes, téléphones appairés) vit sur votre machine, et nulle part ailleurs : nous n'en gardons aucune copie. Perdre le disque sans sauvegarde, c'est tout perdre. Cette page explique comment vous en protéger.

La sauvegarde automatique est activée par défaut : chaque jour à 03:00 dans le fuseau de la plateforme, sept copies conservées, aussi bien sur une installation neuve que sur une installation mise à jour depuis une version antérieure. Vérifiez-la, et modifiez-la, dans Paramètres > Sauvegarde et export (voir Sauvegarde automatique). Ces copies restent sur la machine qu'elles protègent : dès le jour de l'installation, décidez aussi comment vous gardez des copies hors de la machine.

Les trois outils, et à quoi sert chacun

Outil Ce qu'il produit Contient la clé maîtresse Interrompt les envois Idéal pour
sms-gateway backup (ligne de commande) Une archive de tout le dossier de données (.tar.gz) Oui Quelques secondes Reprise après sinistre, changement de machine
Sauvegarde automatique et Sauvegarder maintenant (dashboard ou API) Une copie de la base (.db), conservée sur la machine Non Non Points de restauration quotidiens, copie avant un changement risqué, restauration depuis le dashboard
Export complet (dashboard ou API) La base, ou les messages, contacts et conversations en CSV ou JSON Non Non Emporter vos données vers un autre outil, tableurs, archivage

La clé maîtresse (secret.key) protège les secrets de vos téléphones appairés, les secrets des webhooks et votre clé de licence enregistrée. Une base restaurée sans sa clé maîtresse s'ouvre normalement, mais :

  • chaque téléphone doit être appairé de nouveau ;
  • chaque secret de webhook, et le secret de chaque action de règle qui appelle une URL, doit être redéfini (et mis à jour du côté destinataire) ;
  • la clé de licence doit être saisie de nouveau.

C'est pourquoi l'archive de sms-gateway backup, qui contient la clé, est celle à garder en cas de sinistre. La clé est volontairement tenue hors de la base : une copie de la base qui fuiterait ne livre pas vos téléphones.

Qui peut faire quoi

Action Dashboard Portée de clé API
Voir, créer, télécharger, restaurer des sauvegardes Superadministrateur seulement admin
Exporter la base complète Superadministrateur seulement admin
Exporter les messages, contacts, conversations Tous les rôles admin
sms-gateway backup - root sur la machine

Les sauvegardes et l'export de la base contiennent les comptes du dashboard : c'est pourquoi ils sont réservés au superadministrateur. Les autres rôles ne voient que la partie Export complet de l'écran.

Faire une sauvegarde

Depuis le dashboard

Paramètres > Sauvegarde et export > Sauvegarder maintenant. La passerelle écrit une copie cohérente de la base sans interrompre les envois, la relit pour s'assurer qu'elle est valide, et seulement alors la compte comme réussie. La nouvelle copie apparaît dans Sauvegardes disponibles, et la tentative dans Journal des sauvegardes.

Si la copie échoue (le plus souvent : disque plein), la tentative apparaît en Échec dans Journal des sauvegardes avec une courte raison, et le fichier endommagé est supprimé.

En ligne de commande

Sur la machine, depuis le dossier où vous voulez l'archive :

sudo sms-gateway backup
Point Comportement
Ce qui est copié Tout le dossier de données : base, clé maîtresse et sauvegardes faites depuis le dashboard
Où elle est écrite Le dossier courant, sous le nom sms-gateway-backup-<AAAAMMJJ-HHMMSS>.tar.gz, lisible par root seulement
Interruption La passerelle s'arrête le temps de la copie (quelques secondes pour une base normale), puis redémarre ; la commande rend la main une fois la passerelle de nouveau joignable. Les téléphones gardent leurs messages pendant ce temps
Options Aucune
Anciennes archives Jamais supprimées par la commande : faites le ménage vous-même

Sous Windows, il n'y a pas de commande sms-gateway. Depuis %ProgramData%\SmsGateway, dans PowerShell :

docker compose stop gateway
docker run --rm -v sms-gateway_gateway-data:/data:ro -v "${PWD}:/out" alpine:3 tar czf /out/sms-gateway-backup.tar.gz -C /data .
docker compose start gateway

Ne copiez jamais le fichier de la base à la main pendant que la passerelle tourne. Une copie prise au milieu d'une écriture donne un fichier endommagé, et vous ne le découvrez que le jour où vous en avez besoin. Utilisez l'un des outils ci-dessus.

Sauvegarde automatique

La passerelle sauvegarde sa base d'elle-même, sans interrompre les envois, et relit chaque copie avant de la compter comme réussie. Les copies apparaissent dans Sauvegardes disponibles avec l'origine Planifiée, et chaque tentative dans Journal des sauvegardes.

Réglez-la dans Paramètres > Sauvegarde et export, carte Sauvegarde planifiée (Superadmin seulement), puis Enregistrer. Le changement s'applique dans la minute, sans redémarrage.

Réglage Par défaut Valeurs possibles Effet
Sauvegarde automatique Activée Activée, désactivée Désactivée : seules existent les sauvegardes que vous faites vous-même. Sauvegarder maintenant fonctionne dans les deux cas
Fréquence Une fois par jour Une fois par jour, toutes les N heures L'espacement des sauvegardes
Heure 03:00 Toute heure, HH:MM Une fois par jour : le moment de la sauvegarde, dans le fuseau de la plateforme (Paramètres > Envoi)
Toutes les (heures) 24 1 à 168 (une semaine) Toutes les N heures : le nombre d'heures entre deux sauvegardes automatiques
Copies conservées 7 1 à 365 Voir Combien de sauvegardes du dashboard sont conservées

Bon à savoir :

  • Le changement d'heure est suivi : 03:00 reste 03:00 à l'heure locale des deux côtés du changement. Une heure qui n'existe pas le jour du changement (dans l'heure sautée) est exécutée une fois, juste après ; une heure qui existe deux fois est exécutée une seule fois.
  • Une passerelle arrêtée à l'heure prévue fait la sauvegarde manquée une fois à son redémarrage, et non une par jour manqué. Une installation neuve, ou qui n'a jamais fait de sauvegarde automatique, fait la première dans la minute.
  • Une sauvegarde manuelle ne décale pas la planification : la sauvegarde de la nuit a lieu même après un Sauvegarder maintenant à 02:59.
  • Une sauvegarde à la fois : une sauvegarde automatique qui tombe pendant l'écriture d'une autre sauvegarde attend la minute suivante.
  • Toutes les N heures se compte depuis la sauvegarde automatique précédente, réussie ou non : un disque plein est retenté une fois par intervalle, et non chaque minute.

La case Prochaine sauvegarde indique la prochaine échéance, dans le fuseau de la plateforme : Aucune quand la sauvegarde automatique est désactivée, Au prochain passage quand elle est due dans la minute.

Par l'API, avec une clé API de portée admin : PATCH /api/v1/settings avec un bloc backup (enabled, frequency daily ou interval, dailyAt HH:MM, intervalHours, retention). Un champ omis reste inchangé.

curl -X PATCH https://sms.exemple.com/api/v1/settings \
  -H "X-API-KEY: sk_..." -H "Content-Type: application/json" \
  -d '{"backup": {"frequency": "daily", "dailyAt": "02:30", "retention": 14}}'

L'archive en ligne de commande n'est pas planifiée par la passerelle. Lancez sudo sms-gateway backup quand vous voulez l'archive complète avec la clé maîtresse : après l'installation, avant une mise à jour ou un déménagement, et régulièrement si vous la gardez hors de la machine.

Garder des copies hors de la machine

Une sauvegarde qui reste sur le disque qu'elle protège ne survit pas à la perte de ce disque, et une sauvegarde qui reste dans le même bâtiment ne survit pas à un incendie ou à un vol.

  • Télécharger une sauvegarde du dashboard (automatique ou manuelle) : dans Sauvegardes disponibles, le bouton de téléchargement à côté de chaque fichier. Par l'API : GET /api/v1/backups/{name}/download.
  • Copier les archives de sms-gateway backup vers un autre serveur ou le stockage de votre choix (scp, rsync, le stockage objet de votre hébergeur).

Trois règles :

  1. Chiffrez les copies. Les sauvegardes ne sont pas chiffrées : elles contiennent chaque message, chaque contact et chaque numéro en clair, et l'archive en ligne de commande contient en plus la clé maîtresse.
  2. Gardez la clé maîtresse, ou l'archive complète qui la contient, même si vous comptez sur les sauvegardes du dashboard.
  3. Supprimez les anciennes copies dont vous n'avez plus besoin, des deux côtés.

Combien de sauvegardes du dashboard sont conservées

La valeur Copies conservées de la carte Sauvegarde planifiée (7 par défaut, de 1 à 365) s'applique aux Sauvegardes disponibles, copies automatiques et manuelles confondues. Après chaque sauvegarde réussie, les copies les plus anciennes au-delà de ce nombre sont supprimées. Jamais avant, et jamais après un échec : une sauvegarde ratée ne vous coûte jamais une ancienne copie valable. Baisser la valeur supprime le surplus à la sauvegarde réussie suivante, pas immédiatement.

Espace disque : chaque copie pèse à peu près la taille de la base. Sept copies d'une base de 200 Mo occupent environ 1,4 Go dans le dossier de données.

Un fichier que vous ajoutez vous-même compte aussi. Tout fichier .db déposé dans le dossier des sauvegardes est listé comme restaurable et compte dans les copies conservées. Gardez votre original ailleurs : ne comptez pas sur ce dossier comme seule copie.

Restaurer une sauvegarde du dashboard

Une restauration remplace toute la base par la copie choisie. Tout ce qui a été écrit depuis cette copie (messages, contacts, réglages, comptes) disparaît de la base en service.

  1. Paramètres > Sauvegarde et export > Sauvegardes disponibles, le bouton de restauration sur la ligne choisie.
  2. Lisez la confirmation, cochez Je comprends que les données écrites depuis cette sauvegarde seront perdues, puis Préparer la restauration. La passerelle vérifie le fichier et le prépare ; rien n'est encore remplacé.
  3. Un bandeau Restauration en attente apparaît, avec Annuler la restauration si ce n'est pas la bonne copie. Préparer une autre copie remplace celle en attente.
  4. Redémarrez la passerelle pour l'appliquer : sudo sms-gateway restart (sous Windows, docker compose restart gateway depuis le dossier d'installation).
  5. Reconnectez-vous, et vérifiez vos données.

Pourquoi un redémarrage : la base ne peut pas être échangée pendant que la passerelle l'utilise. L'échange a lieu au démarrage suivant, avant toute autre chose, et seulement si le fichier préparé est exactement celui qui a été vérifié.

La passerelle refuse une copie dans deux cas, chacun avec un message précis :

Refus Signification Que faire
BACKUP_UNREADABLE Le fichier est endommagé, ou n'est pas une sauvegarde de ce produit Prendre une autre copie
BACKUP_SCHEMA_TOO_RECENT La copie a été faite par une version plus récente de la passerelle Mettre à jour la passerelle (sms-gateway update), puis réessayer

Une copie faite par une version plus ancienne est acceptée : elle est mise à niveau automatiquement au redémarrage.

Une restauration ratée n'empêche jamais la passerelle de démarrer : elle démarre sur la base qu'elle avait, et les journaux (sms-gateway logs) disent pourquoi.

La base précédente est conservée

La base qui était en service n'est pas supprimée : elle est mise de côté dans le dossier de données sous le nom gateway.db.pre-restore-<horodatage>. C'est votre chemin de retour si l'état restauré ne vous convient pas, et elle n'est jamais supprimée automatiquement : supprimez-la vous-même une fois satisfait, surtout sur une grosse base, sinon elle finira par remplir le disque.

Pour y revenir, passerelle arrêtée :

sudo sms-gateway stop
# Trouver le nom exact du fichier mis de côté
docker run --rm -v sms-gateway_gateway-data:/data alpine:3 ls -la /data
# Remettre la base précédente, en gardant la base restaurée de côté
docker run --rm -v sms-gateway_gateway-data:/data alpine:3 sh -c '
  mv /data/gateway.db /data/gateway.db.restore-rejected &&
  rm -f /data/gateway.db-wal /data/gateway.db-shm &&
  mv /data/gateway.db.pre-restore-1756800000 /data/gateway.db'
sudo sms-gateway start

Remplacez 1756800000 par la valeur affichée par ls. Les fichiers -wal et -shm appartiennent à la base mise de côté : ils doivent être supprimés, sinon ils endommageraient celle que vous remettez.

Restaurer une copie faite sur une autre machine

Une sauvegarde téléchargée auparavant, ou prise sur une autre installation, se restaure de la même façon une fois placée dans le dossier des sauvegardes de cette passerelle :

# Cliquez d'abord une fois sur "Sauvegarder maintenant", pour que le dossier des sauvegardes existe
docker run --rm -v sms-gateway_gateway-data:/data -v "$PWD:/in" alpine:3 sh -c '
  cp /in/gateway-20260901T020000Z-01930f2c.db /data/backups/ &&
  chown 65532:65532 /data/backups/gateway-20260901T020000Z-01930f2c.db'

Le fichier apparaît dans Sauvegardes disponibles avec l'origine Importée. Son nom doit se terminer par .db, commencer par une lettre ou un chiffre, et ne contenir que des lettres, des chiffres, des points, des tirets et des tirets bas. Suivez ensuite Restaurer une sauvegarde du dashboard.

Attention : cette copie ne porte pas la clé maîtresse de sa machine d'origine. Si cette passerelle n'a pas le même secret.key, les téléphones doivent être appairés de nouveau et la clé de licence saisie de nouveau.

Restaurer une archive complète (sms-gateway backup)

Cela ramène toute l'installation telle qu'elle était, clé maîtresse comprise : les téléphones se reconnectent sans appairage, et la licence n'a besoin de rien. Tout le contenu actuel du dossier de données est remplacé.

sudo sms-gateway stop
docker run --rm -v sms-gateway_gateway-data:/data -v "$PWD:/in" alpine:3 sh -c '
  rm -rf /data/* &&
  tar xzf /in/sms-gateway-backup-20260901-023000.tar.gz -C /data'
sudo sms-gateway start

La passerelle doit être au moins de la version qui a produit l'archive : mettez-la à jour d'abord si nécessaire. Sur une nouvelle machine, installez d'abord la passerelle, puis lancez ces commandes (voir Changer de serveur).

Exporter vos données

Paramètres > Sauvegarde et export > Export complet. Les exports ne sont pas des sauvegardes : ils vous permettent d'emporter vos données ailleurs, dans des formats ouverts que n'importe quel outil lit.

Export Contenu Formats API
Base complète Une copie fraîche de toute la base, comptes compris, lisible par n'importe quel outil SQLite SQLite GET /api/v1/export/database
Messages Tout l'historique, textes compris CSV (par défaut), JSON GET /api/v1/export/messages?format=csv
Contacts Le répertoire tel qu'il est stocké, avec étiquettes et désinscriptions CSV (par défaut), JSON GET /api/v1/export/contacts?format=json
Conversations Les fils de discussion, sans les textes (ils sont dans l'export des messages) CSV (par défaut), JSON GET /api/v1/export/conversations

Les colonnes, dans l'ordre :

  • Messages : id, conversationId, direction, phone, body, encoding, segments, status, errorCode, deviceId, simSlot, attempts, createdAt, sentAt, deliveredAt, failedAt
  • Contacts : id, phone, firstName, lastName, company, email, notes, tags, blacklisted, createdAt, updatedAt
  • Conversations : id, phone, contactId, state, unreadCount, pinned, archived, assignedTo, createdAt, lastMessageAt

Bon à savoir :

  • Les lignes vont de la plus ancienne à la plus récente. Un export vide a quand même sa ligne d'en-tête (CSV) ou [] (JSON). Une date absente est un champ vide, jamais une fausse date.
  • Ces fichiers contiennent les textes des messages et les numéros complets : rangez-les en conséquence.
  • Les exports restent disponibles même si votre licence est retirée : vos données restent les vôtres.
  • L'export de la base complète a besoin d'un espace temporaire sur la machine, de la taille de la base environ. S'il échoue sur une très grosse base, faites une sauvegarde et téléchargez-la à la place.

Être averti quand les sauvegardes échouent

Une passerelle qui a cessé de sauvegarder ressemble exactement à une passerelle qui fonctionne. Deux moyens de s'en rendre compte :

  • Journal des sauvegardes, dans Paramètres > Sauvegarde et export, liste chaque tentative, échecs compris, avec une courte raison (par exemple snapshot could not be written : le plus souvent un disque plein). Un échec est aussi inscrit, comme erreur, dans le Journal d'activité.
  • Notifications : l'alerte Échec de sauvegarde (Paramètres > Notifications) est activée par défaut et envoie un message sur chaque canal que vous avez configuré (SMS, e-mail, navigateur) dès qu'une sauvegarde automatique ou manuelle échoue. Voir Paramètres, notifications.
  • Webhooks : abonnez un webhook à l'événement backup.failed (et backup.completed si vous voulez un signal positif) pour être alerté par vos propres outils. Voir Webhooks.

Vérifier qu'une sauvegarde vaut quelque chose

Une sauvegarde que personne n'a jamais restaurée est un espoir, pas une sauvegarde. La passerelle relit déjà chaque copie qu'elle fait, ce qui prouve que le fichier est une base valide. Cela ne prouve pas que vous savez la remettre en service.

En une minute, sur une copie téléchargée, avec l'outil sqlite3 :

sqlite3 gateway-20260901T020000Z-01930f2c.db 'PRAGMA quick_check;'
# doit répondre : ok
sqlite3 gateway-20260901T020000Z-01930f2c.db 'SELECT count(*) FROM messages; SELECT count(*) FROM contacts;'
# des nombres plausibles

Le vrai test : restaurez une archive complète sur une machine de secours (un petit VPS, une machine virtuelle), en suivant Restaurer une archive complète, connectez-vous avec votre compte habituel et vérifiez que vos conversations sont là. Faites-le sur une machine que les téléphones ne connaissent pas : les téléphones appairés ne se connectent qu'à l'adresse de votre vraie passerelle, donc la copie de test ne les dérange pas. Supprimez ensuite la machine de test : elle contient toutes vos données.

Faites ce test après chaque mise à jour importante, après tout changement de votre routine de sauvegarde, et au moins une fois avant d'en avoir besoin.

Référence de l'API

Toutes ces opérations exigent une clé API de portée admin (en-tête X-API-KEY) ou une session de superadministrateur. Détails dans la référence de l'API.

Opération Endpoint Réponse
Faire une sauvegarde maintenant POST /api/v1/backups 201 avec la tentative, 503 en cas d'échec
Lister les sauvegardes disponibles GET /api/v1/backups Les plus récentes d'abord ; journalled: false pour un fichier importé
Journal des sauvegardes GET /api/v1/backups/attempts Chaque tentative, échecs compris
Planification en vigueur GET /api/v1/backups/schedule enabled, frequency, dailyAt, timezone, intervalSeconds, retention, lastAttemptAt, nextRunAt
Modifier la planification PATCH /api/v1/settings avec un bloc backup Les paramètres en vigueur, backup compris ; 422 sur une valeur hors bornes
Télécharger une sauvegarde GET /api/v1/backups/{name}/download Le fichier .db
Préparer une restauration POST /api/v1/backups/{name}/restore 202 avec restartRequired: true ; 404, ou 422 avec BACKUP_UNREADABLE / BACKUP_SCHEMA_TOO_RECENT
Voir la restauration en attente GET /api/v1/backups/restore {"pending":true,"name":"..."} ou {"pending":false}
Annuler la restauration en attente DELETE /api/v1/backups/restore 204
Exports GET /api/v1/export/{database,messages,contacts,conversations} Le fichier

Une sauvegarde est refusée tant que la licence est retirée (c'est une écriture) ; les téléchargements et les exports continuent de fonctionner.

Limites actuelles

  • Ni chiffrement ni envoi automatique des sauvegardes : les copier ailleurs et les chiffrer vous revient.
  • Pas d'envoi d'un fichier de sauvegarde depuis le dashboard : une copie venue d'ailleurs se place dans le dossier des sauvegardes avec la commande indiquée plus haut.
  • Les fichiers gateway.db.pre-restore-... ne sont jamais supprimés automatiquement.

Rechercher dans la documentation

Saisissez quelques mots, puis choisissez une page.