# Sauvegardes et instantanés

> Deux façons de revenir en arrière, qui ne protègent pas de la même chose.

Une **sauvegarde** est une copie des fichiers du service, gardée hors de lui : elle
survit à sa suppression. Un **instantané** est une photo du disque, prise au niveau de
l'hébergement : il est plus rapide, mais **il vit et meurt avec la ressource**.

## Sauvegardes

```http
GET /api/resources/{id}/backups
```

```json
[
  {
    "id": "b3c7…",
    "name": "avant-migration",
    "status": "COMPLETED",
    "sizeBytes": 248160256,
    "createdAt": "2026-09-16T09:12:00.000Z",
    "completedAt": "2026-09-16T09:13:41.000Z"
  }
]
```

`status` vaut `PENDING`, `COMPLETED`, `FAILED` ou `RESTORING`. Une sauvegarde `PENDING`
n'est pas restaurable : sonde la liste toutes les quelques secondes le temps qu'elle
finisse.

```http
POST   /api/resources/{id}/backups                      { "name": "avant-migration" }
POST   /api/resources/{id}/backups/{backupId}/restore
DELETE /api/resources/{id}/backups/{backupId}
```

Le nom fait 60 caractères au maximum. Chaque route rend la liste relue.

<Warning>
Restaurer **remplace les fichiers actuels**. Prends une sauvegarde de l'état présent
avant de revenir en arrière, si tu n'es pas sûr.
</Warning>

## Instantanés

```http
GET /api/resources/{id}/snapshots
```

```json
[
  {
    "id": "snap-…",
    "name": "avant-maj",
    "description": "",
    "parent": null,
    "createdAt": "2026-09-14T10:00:00.000Z",
    "sizeBytes": 1073741824
  }
]
```

```http
POST   /api/resources/{id}/snapshots                    { "name": "avant-maj" }
POST   /api/resources/{id}/snapshots/{name}/rollback
DELETE /api/resources/{id}/snapshots/{name}
```

Le nom s'écrit en lettres, chiffres, tirets et tirets bas, 40 caractères au maximum.

<Warning>
La reprise remet le disque dans l'état de l'instantané : tout ce qui a été écrit depuis
disparaît, et la machine redémarre.
</Warning>
