gabriel / musehub public
backup.sh bash
39 lines 1.2 KB
7f1d07e8 feat: domains, MCP expansion, MIDI player, and production hardening (#8) Gabriel Cardona <cgcardona@gmail.com> 4d ago
1 #!/usr/bin/env bash
2 # Postgres daily backup script — run via cron on the EC2 instance.
3 # Dumps the musehub database and rotates backups older than 14 days.
4 #
5 # Install (on EC2):
6 # sudo mkdir -p /opt/backups/musehub
7 # sudo chown ubuntu:ubuntu /opt/backups/musehub
8 # chmod +x /opt/musehub/deploy/backup.sh
9 # crontab -e
10 # # Add this line (runs daily at 3 AM):
11 # 0 3 * * * /opt/musehub/deploy/backup.sh >> /var/log/musehub-backup.log 2>&1
12
13 set -euo pipefail
14
15 APP_DIR="/opt/musehub"
16 BACKUP_DIR="/opt/backups/musehub"
17 TIMESTAMP=$(date +%Y%m%d_%H%M%S)
18 BACKUP_FILE="$BACKUP_DIR/musehub_${TIMESTAMP}.sql.gz"
19 RETAIN_DAYS=14
20
21 mkdir -p "$BACKUP_DIR"
22
23 echo "[$(date)] Starting backup..."
24
25 # Load DB_PASSWORD from the app's .env
26 DB_PASSWORD=$(grep '^DB_PASSWORD=' "$APP_DIR/.env" | cut -d'=' -f2-)
27
28 sudo docker compose -f "$APP_DIR/docker-compose.yml" exec -T postgres \
29 env PGPASSWORD="$DB_PASSWORD" \
30 pg_dump -U musehub musehub \
31 | gzip > "$BACKUP_FILE"
32
33 echo "[$(date)] Backup written: $BACKUP_FILE ($(du -sh "$BACKUP_FILE" | cut -f1))"
34
35 echo "[$(date)] Removing backups older than $RETAIN_DAYS days..."
36 find "$BACKUP_DIR" -name "musehub_*.sql.gz" -mtime "+$RETAIN_DAYS" -delete
37
38 echo "[$(date)] Backup complete. Files kept:"
39 ls -lh "$BACKUP_DIR"