136 lines
5.8 KiB
Bash
136 lines
5.8 KiB
Bash
|
|
#!/bin/sh
|
||
|
|
set -eu
|
||
|
|
|
||
|
|
# ============================================================================
|
||
|
|
# E-COSPLAY - Script de sauvegarde pour migration vers un autre serveur
|
||
|
|
# ----------------------------------------------------------------------------
|
||
|
|
# Sauvegarde :
|
||
|
|
# - Base de données PostgreSQL (pg_dump logique)
|
||
|
|
# - Volume MinIO (fichiers utilisateurs / médias)
|
||
|
|
# - Volume Vault (secrets HashiCorp Vault)
|
||
|
|
# - Fichiers d'environnement (.env.local, google.json, account.json)
|
||
|
|
#
|
||
|
|
# Le tout est empaqueté dans une archive tar.gz horodatée, prête à être
|
||
|
|
# transférée (scp/rsync) puis restaurée avec restore.sh sur le nouveau serveur.
|
||
|
|
# ============================================================================
|
||
|
|
|
||
|
|
RED='\033[0;31m'
|
||
|
|
ORANGE='\033[0;33m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
CYAN='\033[0;36m'
|
||
|
|
RESET='\033[0m'
|
||
|
|
|
||
|
|
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
|
|
cd "$PROJECT_DIR"
|
||
|
|
|
||
|
|
TIMESTAMP="$(date +%Y%m%d_%H%M%S)"
|
||
|
|
BACKUP_DIR="${BACKUP_DIR:-$PROJECT_DIR/var/backups}"
|
||
|
|
WORK_DIR="$BACKUP_DIR/tmp_$TIMESTAMP"
|
||
|
|
ARCHIVE="$BACKUP_DIR/e-cosplay_backup_$TIMESTAMP.tar.gz"
|
||
|
|
|
||
|
|
DB_CONTAINER="${DB_CONTAINER:-e-cosplay_db}"
|
||
|
|
DB_NAME="${DB_NAME:-app_db}"
|
||
|
|
DB_USER="${DB_USER:-symfony_user}"
|
||
|
|
|
||
|
|
MINIO_CONTAINER="${MINIO_CONTAINER:-e-cosplay_minio}"
|
||
|
|
VAULT_CONTAINER="${VAULT_CONTAINER:-e-cosplay_vault}"
|
||
|
|
|
||
|
|
echo "${CYAN}############################${RESET}"
|
||
|
|
echo "${CYAN}# E-COSPLAY BACKUP START #${RESET}"
|
||
|
|
echo "${CYAN}############################${RESET}"
|
||
|
|
echo "${CYAN}Destination : ${ARCHIVE}${RESET}"
|
||
|
|
|
||
|
|
mkdir -p "$WORK_DIR"
|
||
|
|
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
# 1) Vérifie que docker tourne et que les conteneurs sont up
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
if ! command -v docker >/dev/null 2>&1; then
|
||
|
|
echo "${RED}docker introuvable dans le PATH${RESET}" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
ensure_running() {
|
||
|
|
name="$1"
|
||
|
|
if ! docker ps --format '{{.Names}}' | grep -q "^${name}$"; then
|
||
|
|
echo "${ORANGE}> Conteneur ${name} arrêté, démarrage...${RESET}"
|
||
|
|
docker compose up -d "$(echo "$name" | sed 's/^e-cosplay_//')" || true
|
||
|
|
sleep 3
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
ensure_running "$DB_CONTAINER"
|
||
|
|
ensure_running "$MINIO_CONTAINER"
|
||
|
|
ensure_running "$VAULT_CONTAINER"
|
||
|
|
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
# 2) Dump PostgreSQL (logique, portable entre versions mineures)
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
echo "${CYAN}> Dump de la base PostgreSQL (${DB_NAME})...${RESET}"
|
||
|
|
docker exec -t "$DB_CONTAINER" \
|
||
|
|
pg_dump -U "$DB_USER" -d "$DB_NAME" --clean --if-exists --no-owner --no-privileges \
|
||
|
|
| gzip -9 > "$WORK_DIR/database.sql.gz"
|
||
|
|
echo "${GREEN} ✓ database.sql.gz ($(du -h "$WORK_DIR/database.sql.gz" | cut -f1))${RESET}"
|
||
|
|
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
# 3) Snapshot des données MinIO (tar du dossier /data du conteneur)
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
echo "${CYAN}> Sauvegarde des données MinIO...${RESET}"
|
||
|
|
docker exec "$MINIO_CONTAINER" tar -C /data -czf - . > "$WORK_DIR/minio_data.tar.gz"
|
||
|
|
echo "${GREEN} ✓ minio_data.tar.gz ($(du -h "$WORK_DIR/minio_data.tar.gz" | cut -f1))${RESET}"
|
||
|
|
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
# 4) Snapshot des données Vault
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
echo "${CYAN}> Sauvegarde des données Vault...${RESET}"
|
||
|
|
if docker exec "$VAULT_CONTAINER" sh -c '[ -d /vault ]' 2>/dev/null; then
|
||
|
|
docker exec "$VAULT_CONTAINER" tar -C /vault -czf - . > "$WORK_DIR/vault_data.tar.gz"
|
||
|
|
echo "${GREEN} ✓ vault_data.tar.gz ($(du -h "$WORK_DIR/vault_data.tar.gz" | cut -f1))${RESET}"
|
||
|
|
else
|
||
|
|
echo "${ORANGE} ! /vault introuvable, vault ignoré${RESET}"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
# 5) Fichiers d'environnement et credentials
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
echo "${CYAN}> Copie des fichiers d'environnement et credentials...${RESET}"
|
||
|
|
mkdir -p "$WORK_DIR/env"
|
||
|
|
for f in .env .env.local .env.prod .env.prod.local google.json account.json; do
|
||
|
|
if [ -f "$PROJECT_DIR/$f" ]; then
|
||
|
|
cp -a "$PROJECT_DIR/$f" "$WORK_DIR/env/$f"
|
||
|
|
echo "${GREEN} ✓ $f${RESET}"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
# 6) Métadonnées (utiles côté restore pour vérifier la cohérence)
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
{
|
||
|
|
echo "timestamp=$TIMESTAMP"
|
||
|
|
echo "hostname=$(hostname)"
|
||
|
|
echo "git_commit=$(git -C "$PROJECT_DIR" rev-parse HEAD 2>/dev/null || echo unknown)"
|
||
|
|
echo "git_branch=$(git -C "$PROJECT_DIR" rev-parse --abbrev-ref HEAD 2>/dev/null || echo unknown)"
|
||
|
|
echo "db_container=$DB_CONTAINER"
|
||
|
|
echo "db_name=$DB_NAME"
|
||
|
|
echo "db_user=$DB_USER"
|
||
|
|
echo "minio_container=$MINIO_CONTAINER"
|
||
|
|
echo "vault_container=$VAULT_CONTAINER"
|
||
|
|
} > "$WORK_DIR/manifest.txt"
|
||
|
|
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
# 7) Empaquetage final
|
||
|
|
# ---------------------------------------------------------------------------
|
||
|
|
echo "${CYAN}> Empaquetage de l'archive finale...${RESET}"
|
||
|
|
tar -C "$BACKUP_DIR" -czf "$ARCHIVE" "tmp_$TIMESTAMP"
|
||
|
|
rm -rf "$WORK_DIR"
|
||
|
|
|
||
|
|
echo "${GREEN}############################${RESET}"
|
||
|
|
echo "${GREEN}# BACKUP TERMINÉ #${RESET}"
|
||
|
|
echo "${GREEN}############################${RESET}"
|
||
|
|
echo "${GREEN}Archive : ${ARCHIVE}${RESET}"
|
||
|
|
echo "${GREEN}Taille : $(du -h "$ARCHIVE" | cut -f1)${RESET}"
|
||
|
|
echo
|
||
|
|
echo "${CYAN}Pour transférer vers le nouveau serveur :${RESET}"
|
||
|
|
echo " scp \"$ARCHIVE\" user@nouveau-serveur:/chemin/vers/e-cosplay/var/backups/"
|
||
|
|
echo " ssh user@nouveau-serveur 'cd /chemin/vers/e-cosplay && ./restore.sh \"var/backups/$(basename "$ARCHIVE")\"'"
|