feat: replace Docker named volumes with local bind mounts and add backup script
- docker-compose.yml: sostituisce pgdata/uploads/caddy_data/caddy_config con bind mount su ./data/ - app/public/.gitkeep: crea cartella richiesta dal Dockerfile durante il build - scripts/backup.sh: backup automatico di DB (pg_dump) e uploads con rotazione 30 giorni - docs/BACKUP.md: guida completa backup, ripristino e setup cron - .gitignore: aggiorna con data/ e backups/
This commit is contained in:
Executable
+29
@@ -0,0 +1,29 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||
BACKUP_DIR="${BACKUP_DIR:-$PROJECT_DIR/backups}"
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_PATH="$BACKUP_DIR/$TIMESTAMP"
|
||||
|
||||
mkdir -p "$BACKUP_PATH"
|
||||
|
||||
echo "[1/2] Backup database..."
|
||||
docker compose -f "$PROJECT_DIR/docker-compose.yml" exec -T db \
|
||||
pg_dump -U ecommerce ecommerce | gzip > "$BACKUP_PATH/db.sql.gz"
|
||||
echo " → $BACKUP_PATH/db.sql.gz"
|
||||
|
||||
echo "[2/2] Backup uploads..."
|
||||
if [ -d "$PROJECT_DIR/data/uploads" ] && [ "$(ls -A "$PROJECT_DIR/data/uploads")" ]; then
|
||||
tar -czf "$BACKUP_PATH/uploads.tar.gz" -C "$PROJECT_DIR/data" uploads
|
||||
echo " → $BACKUP_PATH/uploads.tar.gz"
|
||||
else
|
||||
echo " (nessun file in data/uploads, saltato)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Backup completato: $BACKUP_PATH"
|
||||
|
||||
# Rimuovi backup più vecchi di 30 giorni
|
||||
find "$BACKUP_DIR" -maxdepth 1 -type d -mtime +30 -exec rm -rf {} + 2>/dev/null || true
|
||||
Reference in New Issue
Block a user