Instances actives
—
Chargement...
Snapshots (7 jours)
—
Chargement...
Sauvegardes (24h)
—
Chargement...
Stockage utilisé
—
SwissBackup
Dernier snapshot
—
Chargement...
PostgreSQL bases
—
Chargement...
Succès des snapshots — 14 jours
Stockage par instance
État des sauvegardes par instance
| Instance | Type | Dernier snapshot | Dernière sauvegarde | Intégrité | Stockage | Statut | Actions |
|---|
Activité récente
| Heure | Type | Instance | Durée | Taille | Résultat |
|---|
Snapshots OpenStack Glance
Images bootables stockées dans Glance —
openstack server image create
— snapshots
| Nom | Instance | Date | Taille | Statut Glance | Actions |
|---|
Sauvegardes Restic — SwissBackup
Données applicatives & dumps PostgreSQL vers OpenStack Swift
| Instance | Repo Restic | Dernier backup | Taille repo | Rétention | Intégrité | Statut | Actions |
|---|
| Instance | Base | Méthode | Dernier dump | Taille dump | Rétention | Statut | Actions |
|---|
Commandes de backup récentes
| Date | Type | Hostname | Statut | Prise en charge | Terminée | Config | |
|---|---|---|---|---|---|---|---|
| Chargement... | |||||||
Historique des opérations
Journal complet — snapshots, sauvegardes, restaurations
Volume de sauvegardes — 30 jours
Durée moyenne (minutes)
Journal des 50 dernières opérations
| Date/Heure | Type | Instance | Opération | Durée | Taille | Résultat | Message |
|---|
Instances VM — Infomaniak Public Cloud
Région dc3-a / dc4-a — OpenStack Nova
| Nom | Flavor | IP | Région | État | Snapshot auto | Backup auto | Actions |
|---|
Bases PostgreSQL
Sauvegardes via pg_dump + Restic → SwissBackup
| Instance | Base | Version | Taille | Dernier dump | Fréquence | Rétention | Statut | Actions |
|---|
Scripts de déploiement
Commandes OpenStack CLI & Restic à déployer sur vos VMs
snapshot.sh — Snapshot automatique OpenStack Glance
#!/bin/bash # snapshot.sh — Infomaniak Public Cloud # Crée un snapshot OpenStack Glance puis purge les anciens # Usage: ./snapshot.sh <instance-name> [retention-days] set -euo pipefail ## ─── Variables OpenStack ───────────────────────────────────── export OS_AUTH_URL="https://api.pub1.infomaniak.cloud/identity/v3" export OS_PROJECT_NAME="PCP-XXXXXXX" export OS_USERNAME="PCU-XXXXXXX" export OS_PASSWORD="${OS_PASSWORD:?Mot de passe OpenStack requis}" export OS_PROJECT_DOMAIN_NAME="default" export OS_USER_DOMAIN_NAME="default" export OS_IDENTITY_API_VERSION="3" export OS_REGION_NAME="dc3-a" INSTANCE="${1:?Nom de l'instance requis}" RETENTION="${2:-7}" TIMESTAMP="$(date -u +%Y-%m-%d_%Hh%M)" SNAP_NAME="snap-${INSTANCE}-${TIMESTAMP}" ## ─── Création du snapshot ──────────────────────────────────── echo "[$(date -u)] Démarrage snapshot : ${SNAP_NAME}" openstack server image create \ --name "${SNAP_NAME}" \ --wait "${INSTANCE}" echo "[$(date -u)] Snapshot créé avec succès : ${SNAP_NAME}" ## ─── Purge des anciens snapshots ───────────────────────────── echo "[$(date -u)] Purge snapshots > ${RETENTION} jours pour ${INSTANCE}..." CUTOFF="$(date -u -d "${RETENTION} days ago" +%Y-%m-%dT%H:%M:%S)" openstack image list \ --property owner="${OS_PROJECT_NAME}" \ --format value -c ID -c Name -c "Created At" \ | grep "snap-${INSTANCE}-" \ | while read -r ID NAME CREATED; do if [[ "${CREATED}" < "${CUTOFF}" ]]; then echo "Suppression ancienne image : ${NAME} (${CREATED})" openstack image delete "${ID}" fi done echo "[$(date -u)] Terminé."
backup-vm.sh — Sauvegarde Restic vers SwissBackup
#!/bin/bash # backup-vm.sh — Backup Restic vers Infomaniak SwissBackup # Prérequis: restic installé, fichier /etc/restic/.env chargé set -euo pipefail ## ─── Credentials SwissBackup (OpenStack Swift) ─────────────── source /etc/restic/.env # Contenu de /etc/restic/.env : # export AWS_ACCESS_KEY_ID=<votre access key SwissBackup> # export AWS_SECRET_ACCESS_KEY=<votre secret key SwissBackup> # export RESTIC_REPOSITORY=s3:https://s3.swiss-backup02.infomaniak.com/backup-restic/<vm-name> # export RESTIC_PASSWORD_FILE=/etc/restic/.key HOSTNAME_SHORT="$(hostname -s)" PATHS="/var/www /etc /home /opt" LOG="/var/log/restic/backup-${HOSTNAME_SHORT}.log" mkdir -p "$(dirname "${LOG}")" ## ─── Backup ─────────────────────────────────────────────────── echo "[$(date -u)] Démarrage backup Restic — ${HOSTNAME_SHORT}" | tee -a "${LOG}" restic backup \ --tag "${HOSTNAME_SHORT}" \ --tag "auto" \ --exclude="/var/cache" \ --exclude="/tmp" \ --exclude="*.log" \ ${PATHS} 2>&1 | tee -a "${LOG}" ## ─── Politique de rétention ────────────────────────────────── restic forget \ --keep-daily 7 \ --keep-weekly 4 \ --keep-monthly 12 \ --prune 2>&1 | tee -a "${LOG}" ## ─── Vérification intégrité (hebdomadaire) ─────────────────── if [ "$(date +%u)" = "7" ]; then echo "[$(date -u)] Vérification intégrité du dépôt..." | tee -a "${LOG}" restic check 2>&1 | tee -a "${LOG}" fi echo "[$(date -u)] Backup terminé." | tee -a "${LOG}"
backup-postgres.sh — Dump PostgreSQL + Restic
#!/bin/bash # backup-postgres.sh — Dump pg_dump + chiffrement Restic → SwissBackup # Prérequis: postgresql-client, restic, /etc/restic/.env set -euo pipefail source /etc/restic/.env PG_HOST="localhost" PG_PORT="5432" PG_USER="backup_user" # Utilisateur dédié en lecture seule PGPASSFILE="/etc/restic/.pgpass" # Format: host:port:db:user:password DUMP_DIR="/tmp/pg_dumps" LOG="/var/log/restic/backup-postgres.log" TIMESTAMP="$(date -u +%Y-%m-%d_%Hh%M)" mkdir -p "${DUMP_DIR}" "$(dirname "${LOG}")" chmod 700 "${DUMP_DIR}" ## ─── Lister toutes les bases ───────────────────────────────── DATABASES="$(psql -h "${PG_HOST}" -p "${PG_PORT}" -U "${PG_USER}" \ -t -c "SELECT datname FROM pg_database WHERE datistemplate = false \ AND datname NOT IN ('postgres');" 2>>"${LOG}")" echo "[$(date -u)] Bases détectées : $(echo "${DATABASES}" | tr '\n' ' ')" | tee -a "${LOG}" ## ─── Dump de chaque base ──────────────────────────────────── for DB in ${DATABASES}; do DB="$(echo "${DB}" | xargs)" [ -z "${DB}" ] && continue DUMP_FILE="${DUMP_DIR}/${DB}_${TIMESTAMP}.dump" echo "[$(date -u)] Dump de la base : ${DB} → ${DUMP_FILE}" | tee -a "${LOG}" PGPASSFILE="${PGPASSFILE}" pg_dump \ -h "${PG_HOST}" -p "${PG_PORT}" -U "${PG_USER}" \ -Fc --compress=9 \ -f "${DUMP_FILE}" \ "${DB}" 2>&1 | tee -a "${LOG}" done ## ─── Envoi vers SwissBackup via Restic ─────────────────────── echo "[$(date -u)] Envoi des dumps vers SwissBackup..." | tee -a "${LOG}" restic backup \ --tag "postgres" \ --tag "${TIMESTAMP}" \ "${DUMP_DIR}" 2>&1 | tee -a "${LOG}" ## ─── Nettoyage des dumps locaux ────────────────────────────── rm -rf "${DUMP_DIR}" ## ─── Politique de rétention ────────────────────────────────── restic forget \ --tag "postgres" \ --keep-daily 30 \ --keep-monthly 12 \ --prune 2>&1 | tee -a "${LOG}" echo "[$(date -u)] Backup PostgreSQL terminé." | tee -a "${LOG}"
Crontab — Planification automatique
# Crontab root — Infomaniak Public Cloud Backup Automation # Installation : sudo crontab -e # Variables d'environnement : placées dans /etc/environment ou /etc/restic/.env SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin ## ─── Snapshots OpenStack Glance (quotidiens à 02h00 UTC) ───── 0 2 * * * root OS_PASSWORD='XXX' /opt/backup/snapshot.sh web-prod-01 7 >> /var/log/backup/snap-web-01.log 2>&1 0 2 * * * root OS_PASSWORD='XXX' /opt/backup/snapshot.sh web-prod-02 7 >> /var/log/backup/snap-web-02.log 2>&1 0 2 * * * root OS_PASSWORD='XXX' /opt/backup/snapshot.sh app-backend-01 7 >> /var/log/backup/snap-app.log 2>&1 0 2 * * * root OS_PASSWORD='XXX' /opt/backup/snapshot.sh db-postgres-01 14 >> /var/log/backup/snap-db-01.log 2>&1 0 2 * * * root OS_PASSWORD='XXX' /opt/backup/snapshot.sh db-postgres-02 14 >> /var/log/backup/snap-db-02.log 2>&1 0 2 * * * root OS_PASSWORD='XXX' /opt/backup/snapshot.sh proxy-nginx-01 7 >> /var/log/backup/snap-proxy.log 2>&1 ## ─── Backup Restic VM (quotidien à 03h00 UTC) ──────────────── # À exécuter DEPUIS chaque VM (via SSH ou agent) 0 3 * * * root /opt/backup/backup-vm.sh >> /var/log/restic/backup.log 2>&1 ## ─── Dump PostgreSQL (quotidien à 01h00 UTC) ───────────────── # À exécuter sur db-postgres-01 et db-postgres-02 0 1 * * * root /opt/backup/backup-postgres.sh >> /var/log/restic/backup-pg.log 2>&1 ## ─── Vérification intégrité Restic (dimanche 04h00) ───────── 0 4 * * 0 root source /etc/restic/.env && restic check >> /var/log/restic/check.log 2>&1 ## ─── Rotation des logs (mensuelle) ────────────────────────── 0 5 1 * * root find /var/log/backup /var/log/restic -name "*.log" -mtime +90 -delete
Récapitulatif de la stratégie de sauvegarde
| Couche | Type | Fréquence | Rétention | Destination | Outil |
|---|---|---|---|---|---|
| L1 | Snapshot VM | Quotidien 02h00 | 7 jours | OpenStack Glance | openstack server image create |
| L2 | Backup VM (données) | Quotidien 03h00 | 7j / 4sem / 12m | SwissBackup Swift | restic backup |
| L3 | Dump PostgreSQL | Quotidien 01h00 | 30j / 12m | SwissBackup Swift | pg_dump + restic |
| L4 | Vérification intégrité | Hebdomadaire | — | — | restic check |
Paramètres
Configuration OpenStack, SwissBackup, alertes
Connexion Infomaniak Public Cloud
Configuration SwissBackup
Alertes & Notifications
Alerte en cas d'échec de snapshot
Alerte si aucun backup depuis 26h
Alerte si erreur d'intégrité Restic
Rapport hebdomadaire par email
Logs applicatifs