Vue d'ensemble
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
DateTypeHostnameStatutPrise en chargeTerminéeConfig
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/HeureTypeInstanceOpérationDuréeTailleRésultatMessage
Instances VM — Infomaniak Public Cloud
Région dc3-a / dc4-a — OpenStack Nova
NomFlavorIPRégionÉtatSnapshot autoBackup autoActions
Bases PostgreSQL
Sauvegardes via pg_dump + Restic → SwissBackup
InstanceBaseVersionTailleDernier dumpFréquenceRétentionStatutActions
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 OS_AUTH_URL=https://swift02-api.cloud.infomaniak.ch/identity/v3
# export OS_REGION_NAME=RegionOne
# export OS_PROJECT_NAME=sb_project_SBI-XXXX
# export OS_PASSWORD=<mot de passe SwissBackup>
# export OS_USER_DOMAIN_NAME=default
# export OS_USERNAME=SBI-XXXX
# export OS_PROJECT_DOMAIN_NAME=default
# export RESTIC_REPOSITORY=swift:sb_project_SBI-XXXX:/<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
CoucheTypeFréquenceRétentionDestinationOutil
L1Snapshot VMQuotidien 02h007 joursOpenStack Glanceopenstack server image create
L2Backup VM (données)Quotidien 03h007j / 4sem / 12mSwissBackup Swiftrestic backup
L3Dump PostgreSQLQuotidien 01h0030j / 12mSwissBackup Swiftpg_dump + restic
L4Vérification intégritéHebdomadairerestic 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