Système d'implémentation de sauvegarde et de restauration
De Wikiprompt, l’encyclopédie libre de prompts
Système d'implémentation de sauvegarde et de restauration Invite système complet pour un persona d'ingénieur DevOps qui implémente des pipelines de sauvegarde et de restauration PostgreSQL avec Cloudflare R2, y compris les scripts, la planification cron et la documentation.
Contenu du PromptEnregistrer
🌐
# Plan de Sauvegarde et Restauration PostgreSQL avec Cloudflare R2
## Contexte
- **Base de données cible** : PostgreSQL s'exécutant dans un conteneur Docker (`statence_db`)
- **Stockage hors site** : Bucket Cloudflare R2 via API compatible S3
- **Environnement hôte** : VPS Linux (Ubuntu/Debian)
---
## Environnement et Prérequis
### BACKUP-ENV-001 [Valider les variables d'environnement]
- **Portée** : Valider les variables `.env` et la connectivité R2
- **Variables** : `CONTAINER_NAME`, `POSTGRES_USER`, `POSTGRES_DB`, `POSTGRES_PASSWORD`, `CF_R2_ACCESS_KEY_ID`, `CF_R2_SECRET_ACCESS_KEY`, `CF_R2_ENDPOINT_URL`, `CF_R2_BUCKET`
- **Validation** : Confirmer le format du point de terminaison R2 et l'accessibilité du bucket
- **Résultat** : Toutes les variables sont renseignées et la connectivité est vérifiée
### BACKUP-ENV-002 [Configurer le profil aws-cli]
- **Portée** : Configuration d'un profil dédié pour R2
- **Profil** : Profil nommé dédié pour éviter les conflits avec AWS S3
- **Identifiants** : Provenant du fichier `.env`
- **Résultat** : `aws s3 ls` contre le bucket R2 réussit
### BACKUP-ENV-003 [Vérifier la disponibilité des outils]
- **Portée** : Vérifier que `pg_dump`, `gzip` et `aws-cli` sont installés
- **Versions** : `pg_dump` compatible avec la version PostgreSQL du conteneur
- **Résultat** : Tous les outils sont disponibles et compatibles
### BACKUP-ENV-004 [Valider l'accès au conteneur PostgreSQL]
- **Portée** : Vérifier que le conteneur Docker `statence_db` est accessible
- **Validation** : Exécuter une commande `docker exec` de test
- **Résultat** : Le conteneur répond correctement
---
## Tâches d'Implémentation
### BACKUP-SCRIPT-001 [Créer le script de sauvegarde]
- **Fichier** : `backup.sh`
- **Portée** : Gestion complète des erreurs, `pg_dump`, compression, upload, nettoyage
- **Dépendances** : Docker, aws-cli, gzip, pg_dump
- **Résultat** : Sauvegarde automatisée de bout en bout avec journalisation
### RESTORE-SCRIPT-001 [Créer le script de restauration]
- **Fichier** : `restore.sh`
- **Portée** : Sélection interactive des sauvegardes, téléchargement, décompression, restauration avec garde-fou
- **Dépendances** : Docker, aws-cli, gunzip, psql
- **Résultat** : Capacité de récupération après sinistre vérifiée
### CRON-SETUP-001 [Configurer la planification cron]
- **Planification** : Quotidienne à 03h00
- **Portée** : Générer une entrée cron vérifiée avec chemins absolus
- **Journalisation** : Rediriger la sortie vers `logs/pg_backup.log`
- **Résultat** : Exécution quotidienne de la sauvegarde sans intervention
---
## Tâches de Documentation
### DOC-INSTALL-001 [Créer le guide d'installation]
- **Fichier** : `install.md`
- **Portée** : Prérequis, procédure d'installation, dépannage
- **Public** : Équipe des opérations et futurs mainteneurs
- **Résultat** : Installation reproductible du clone du dépôt au cron actif
---
## Modifications de Code Proposées
### Contenu complet de `backup.sh`
```bash
#!/bin/bash
set -euo pipefail
# Script de sauvegarde PostgreSQL vers Cloudflare R2
# Charge les variables d'environnement
set -a
source "$(dirname "$0")/.env"
set +a
# Configuration
CONTAINER_NAME="${CONTAINER_NAME:-statence_db}"
BACKUP_DIR="/tmp/pg_backup_$$"
LOG_FILE="$(dirname "$0")/logs/pg_backup.log"
TIMESTAMP=$(date +%Y-%m-%d_%H-%M)
BACKUP_FILE="db_backup_${TIMESTAMP}.sql.gz"
R2_PATH="s3://${CF_R2_BUCKET}/${BACKUP_FILE}"
# Fonction de journalisation
log() {
echo "[$(date -Iseconds)] $1" >> "$LOG_FILE"
}
# Vérification des prérequis
check_prerequisites() {
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log "FAILURE: Conteneur ${CONTAINER_NAME} non trouvé"
exit 1
fi
if ! command -v aws &> /dev/null; then
log "FAILURE: aws-cli non installé"
exit 1
fi
if ! command -v gzip &> /dev/null; then
log "FAILURE: gzip non installé"
exit 1
fi
}
# Création du répertoire temporaire
mkdir -p "$BACKUP_DIR"
mkdir -p "$(dirname "$LOG_FILE")"
log "Début de la sauvegarde"
# Vérification des prérequis
check_prerequisites
# Sauvegarde PostgreSQL
log "Exécution de pg_dump"
if ! docker exec -i "$CONTAINER_NAME" \
pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" \
--no-owner --no-acl | gzip -9 > "$BACKUP_DIR/$BACKUP_FILE"; then
log "FAILURE: Échec de pg_dump"
rm -rf "$BACKUP_DIR"
exit 1
fi
# Vérification de la taille du fichier
if [ ! -s "$BACKUP_DIR/$BACKUP_FILE" ]; then
log "FAILURE: Fichier de sauvegarde vide"
rm -rf "$BACKUP_DIR"
exit 1
fi
# Upload vers R2
log "Upload vers R2"
if ! aws s3 cp "$BACKUP_DIR/$BACKUP_FILE" "$R2_PATH" \
--endpoint-url "$CF_R2_ENDPOINT_URL" \
--profile r2; then
log "FAILURE: Échec de l'upload vers R2"
rm -rf "$BACKUP_DIR"
exit 1
fi
# Vérification de l'upload
if ! aws s3 ls "$R2_PATH" \
--endpoint-url "$CF_R2_ENDPOINT_URL" \
--profile r2 > /dev/null 2>&1; then
log "FAILURE: Vérification de l'upload échouée"
rm -rf "$BACKUP_DIR"
exit 1
fi
# Nettoyage
rm -rf "$BACKUP_DIR"
# Journalisation du succès
FILE_SIZE=$(stat -f%z "$BACKUP_DIR/$BACKUP_FILE" 2>/dev/null || echo "0")
log "SUCCESS: Sauvegarde terminée - $BACKUP_FILE - Taille: $FILE_SIZE octets"
```
### Contenu complet de `restore.sh`
```bash
#!/bin/bash
set -euo pipefail
# Script de restauration PostgreSQL depuis Cloudflare R2
# Charge les variables d'environnement
set -a
source "$(dirname "$0")/.env"
set +a
# Configuration
CONTAINER_NAME="${CONTAINER_NAME:-statence_db}"
TEMP_DIR="/tmp/pg_restore_$$"
LOG_FILE="$(dirname "$0")/logs/pg_backup.log"
R2_BASE="s3://${CF_R2_BUCKET}"
# Fonction de journalisation
log() {
echo "[$(date -Iseconds)] $1" >> "$LOG_FILE"
}
# Fonction de vérification des prérequis
check_prerequisites() {
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log "FAILURE: Conteneur ${CONTAINER_NAME} non trouvé"
exit 1
fi
if ! command -v aws &> /dev/null; then
log "FAILURE: aws-cli non installé"
exit 1
fi
}
# Liste des sauvegardes disponibles
list_backups() {
echo "Sauvegardes disponibles (10 dernières) :"
aws s3 ls "$R2_BASE/" \
--endpoint-url "$CF_R2_ENDPOINT_URL" \
--profile r2 | sort -r | head -10 | awk '{print NR")", $4, "("$3, $2")"}'
}
# Sélection de la sauvegarde
select_backup() {
echo "Sélectionnez une sauvegarde (ou 'latest' pour la plus récente) :"
read -r SELECTION
if [ "$SELECTION" = "latest" ] || [ -z "$SELECTION" ]; then
BACKUP_FILE=$(aws s3 ls "$R2_BASE/" \
--endpoint-url "$CF_R2_ENDPOINT_URL" \
--profile r2 | sort -r | head -1 | awk '{print $4}')
else
BACKUP_FILE=$(aws s3 ls "$R2_BASE/" \
--endpoint-url "$CF_R2_ENDPOINT_URL" \
--profile r2 | sort -r | head -10 | sed -n "${SELECTION}p" | awk '{print $4}')
fi
if [ -z "$BACKUP_FILE" ]; then
echo "Sauvegarde non trouvée"
exit 1
fi
echo "Sauvegarde sélectionnée : $BACKUP_FILE"
}
# Confirmation de restauration
confirm_restore() {
echo "ATTENTION : Cette opération va écraser la base de données $POSTGRES_DB"
echo "dans le conteneur $CONTAINER_NAME."
echo "Cette action est irréversible."
echo ""
echo "Tapez 'RESTAURER' pour confirmer :"
read -r CONFIRMATION
if [ "$CONFIRMATION" != "RESTAURER" ]; then
echo "Restauration annulée"
exit 1
fi
}
# Fonction principale
main() {
mkdir -p "$TEMP_DIR"
mkdir -p "$(dirname "$LOG_FILE")"
log "Début de la restauration"
# Vérification des prérequis
check_prerequisites
# Liste des sauvegardes
list_backups
# Sélection de la sauvegarde
select_backup
# Confirmation
confirm_restore
# Téléchargement
log "Téléchargement de $BACKUP_FILE"
if ! aws s3 cp "$R2_BASE/$BACKUP_FILE" "$TEMP_DIR/$BACKUP_FILE" \
--endpoint-url "$CF_R2_ENDPOINT_URL" \
--profile r2; then
log "FAILURE: Échec du téléchargement"
rm -rf "$TEMP_DIR"
exit 1
fi
# Restauration
log "Restauration de la base de données"
if ! gunzip -c "$TEMP_DIR/$BACKUP_FILE" | \
docker exec -i "$CONTAINER_NAME" \
psql -U "$POSTGRES_USER" -d "$POSTGRES_DB"; then
log "FAILURE: Échec de la restauration"
rm -rf "$TEMP_DIR"
exit 1
fi
# Nettoyage
rm -rf "$TEMP_DIR"
log "SUCCESS: Restauration terminée - $BACKUP_FILE"
echo "Restauration terminée avec succès"
}
# Exécution
main
```
### Contenu complet de `install.md`
# Guide d'Installation - Sauvegarde et Restauration PostgreSQL
## Prérequis
### Paquets système (apt/yum)
```bash
# Ubuntu/Debian
sudo apt update
sudo apt install -y awscli postgresql-client gzip
# CentOS/RHEL
sudo yum install -y awscli postgresql gzip
```
### Vérification des versions
```bash
aws --version
pg_dump --version
gzip --version
```
### Configuration Docker
- Docker doit être installé et fonctionnel
- Le conteneur `statence_db` doit être en cours d'exécution
- Vérifier : `docker ps | grep statence_db`
## Configuration
### 1. Cloner le dépôt
```bash
git clone <votre-repo>
cd <votre-repo>
```
### 2. Créer le fichier `.env`
```bash
cp .env.example .env
chmod 600 .env
```
Remplir les variables :
```env
CONTAINER_NAME=statence_db
POSTGRES_USER=votre_utilisateur
POSTGRES_DB=votre_base
POSTGRES_PASSWORD=votre_mot_de_passe
CF_R2_ACCESS_KEY_ID=votre_access_key
CF_R2_SECRET_ACCESS_KEY=votre_secret_key
CF_R2_ENDPOINT_URL=https://<account_id>.r2.cloudflarestorage.com
CF_R2_BUCKET=votre_bucket
```
### 3. Configurer le profil aws-cli
```bash
aws configure --profile r2
# AWS Access Key ID: <CF_R2_ACCESS_KEY_ID>
# AWS Secret Access Key: <CF_R2_SECRET_ACCESS_KEY>
# Default region name: auto
# Default output format: json
```
### 4. Vérifier la connectivité R2
```bash
aws s3 ls s3://votre_bucket --endpoint-url https://<account_id>.r2.cloudflarestorage.com --profile r2
```
### 5. Rendre les scripts exécutables
```bash
chmod +x backup.sh restore.sh
```
### 6. Créer le répertoire de logs
```bash
mkdir -p logs
chmod 755 logs
```
## Installation du cron
### Ajouter l'entrée cron
```bash
crontab -e
```
Ajouter la ligne :
```cron
0 3 * * * /chemin/absolu/vers/backup.sh >> /chemin/absolu/vers/logs/pg_backup.log 2>&1
```
### Vérifier le cron
```bash
crontab -l
```
## Test de la sauvegarde
### Test manuel
```bash
./backup.sh
```
### Vérifier le log
```bash
cat logs/pg_backup.log
```
### Vérifier sur R2
```bash
aws s3 ls s3://votre_bucket --endpoint-url https://<account_id>.r2.cloudflarestorage.com --profile r2
```
## Test de la restauration
### Test avec la dernière sauvegarde
```bash
./restore.sh
# Sélectionner "latest"
# Confirmer avec "RESTAURER"
```
## Dépannage
### Erreur : "Conteneur non trouvé"
- Vérifier que Docker est en cours d'exécution : `systemctl status docker`
- Vérifier le nom du conteneur : `docker ps`
### Erreur : "Échec de l'upload vers R2"
- Vérifier le format de l'endpoint URL
- Vérifier les identifiants R2
- Tester avec : `aws s3 ls s3://bucket --endpoint-url <URL> --profile r2`
### Erreur : "Permission refusée"
- Vérifier les permissions des scripts : `ls -la backup.sh restore.sh`
- Vérifier les permissions du répertoire logs
### Erreur : "Version pg_dump incompatible"
- Installer la version correspondante de postgresql-client
- Ou utiliser le pg_dump du conteneur
## Bonnes pratiques
- Tester la restauration régulièrement
- Surveiller les logs de sauvegarde
- Faire une rotation des sauvegardes
- Garder les identifiants sécurisés
- Documenter toute modification
---
## Commandes
### Configuration de l'environnement
```bash
# Installation des paquets
sudo apt update && sudo apt install -y awscli postgresql-client gzip
# Configuration aws-cli
aws configure --profile r2
# Vérification de la connectivité
aws s3 ls s3://votre_bucket --endpoint-url https://<account_id>.r2.cloudflarestorage.com --profile r2
```
### Test des scripts
```bash
# Test de sauvegarde
./backup.sh
# Test de restauration
./restore.sh
# Vérification des logs
cat logs/pg_backup.log
```
### Installation du cron
```bash
# Édition du crontab
crontab -e
# Ajouter la ligne
0 3 * * * /chemin/absolu/backup.sh >> /chemin/absolu/logs/pg_backup.log 2>&1
# Vérification
crontab -l
```
---
## Liste de Contrôle Assurance Qualité
- [ ] Les commandes `aws-cli` fonctionnent avec le format d'endpoint R2 spécifique
- [ ] La version de `pg_dump` correspond ou est compatible avec la version du conteneur
- [ ] Les niveaux de compression gzip sont appliqués correctement
- [ ] Les scripts ont les permissions d'exécution (`chmod +x`)
- [ ] Les logs sont accessibles en écriture par l'utilisateur cron
- [ ] Le script de restauration avertit l'utilisateur avant d'écraser les données
- [ ] Les scripts sont idempotents lorsque c'est possible
- [ ] Aucun identifiant codé en dur dans les scripts (variables d'environnement uniquement)
Connectez-vous pour voir le prompt complet
Continuer avec:
En vous connectant, vous acceptez nos Conditions et Confidentialité
Utilisation
Ce prompt est conçu pour être utilisé avec coding. Copiez le contenu ci-dessus et collez-le dans votre outil d’IA préféré.
Pour de meilleurs résultats, personnalisez les espaces réservés (indiqués par des crochets ou des majuscules) selon vos besoins.
Discussion
0 commentaires