#!/bin/sh # Backup giornaliero di produzione: dump dei due database + archivi dei file caricati, con rotazione. # Gira nel container "backup" (profilo tools) di docker-compose.prod.yml: # docker compose -f docker-compose.prod.yml run --rm backup (oppure: npm run backup:prod) # Risultato in BACKUP_DIR (host) → / # app.dump, medusa.dump pg_dump formato custom (pg_restore), proprietari inclusi # uploads.tar.gz volume uploads dell'API (public/ e private/) # medusa-files.tar.gz file caricati dal dashboard Medusa (immagini prodotto) # SHA256SUMS verificati dal ripristino # Tiene gli ultimi BACKUP_KEEP_DAYS backup (default 14). Redis non serve: cache, sessioni e code. set -eu umask 077 KEEP="${BACKUP_KEEP_DAYS:-14}" STAMP="$(date -u +%Y%m%dT%H%M%SZ)" TMP="/backups/.tmp-$STAMP" DEST="/backups/$STAMP" log() { echo "[backup $(date -u +%H:%M:%S)] $*"; } rm -rf /backups/.tmp-* mkdir -p "$TMP" log "dump $APP_DB_NAME" pg_dump --format=custom --dbname="$APP_DB_NAME" --file="$TMP/app.dump" log "dump $MEDUSA_DB_NAME" pg_dump --format=custom --dbname="$MEDUSA_DB_NAME" --file="$TMP/medusa.dump" log "archivio uploads" tar -C /data/uploads -czf "$TMP/uploads.tar.gz" . log "archivio medusa-files" tar -C /data/medusa-files -czf "$TMP/medusa-files.tar.gz" . (cd "$TMP" && sha256sum app.dump medusa.dump uploads.tar.gz medusa-files.tar.gz > SHA256SUMS) # Rinomina solo a backup completo: una cartella con il timestamp è sempre un backup integro mv "$TMP" "$DEST" log "completato: $DEST ($(du -sh "$DEST" | cut -f1))" # Rotazione: i nomi sono ordinabili, si tengono gli ultimi $KEEP OLD="$(ls -1d /backups/[0-9]*T*Z 2>/dev/null | sort | head -n "-$KEEP")" for d in $OLD; do log "rimosso $d" rm -rf "$d" done