#!/bin/bash # Supersam app code backup to S3 (Beget Cloud Storage) # Archives /opt/supersam source code (excluding node_modules, .git, dist) # and uploads to S3. Retention: keeps last 30 days. # # Cron: 0 1 * * * /opt/supersam/scripts/backup-code-s3.sh >> /var/log/supersam-backup-code.log 2>&1 # Also triggered after deploy via deploy.sh set -euo pipefail # ── Config ──────────────────────────────────────────────────────────────── AWS_ACCESS_KEY_ID="YG4MQNKAPNL65200MBUY" AWS_SECRET_ACCESS_KEY="8mXkFM2VRQ3pN1Nx4mhmJ2jrZoB5YTPUa4CaZh43" S3_BUCKET="02f162ff4a18-supersam-s3" S3_PREFIX="backups" SOURCE_DIR="/opt/supersam" RETENTION_DAYS=30 # ── Runtime ─────────────────────────────────────────────────────────────── TIMESTAMP=$(date +%Y-%m-%d_%H%M) ARCHIVE_FILE="/tmp/supersam-code-${TIMESTAMP}.tar.gz" export AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY echo "[$(date)] Starting code backup..." # ── Archive ────────────────────────────────────────────────────────────── echo "[$(date)] Archiving ${SOURCE_DIR}..." tar -czf "${ARCHIVE_FILE}" \ --directory="${SOURCE_DIR}" \ --exclude="node_modules" \ --exclude=".git" \ --exclude="dist" \ --exclude="volumes" \ --exclude="__pycache__" \ . 2>/dev/null ARCHIVE_SIZE=$(du -h "${ARCHIVE_FILE}" | cut -f1) echo "[$(date)] Archive created: ${ARCHIVE_FILE} (${ARCHIVE_SIZE})" # ── Upload via mc ───────────────────────────────────────────────────────── echo "[$(date)] Uploading to S3..." mc cp "${ARCHIVE_FILE}" "beget/${S3_BUCKET}/${S3_PREFIX}/code/supersam-code-${TIMESTAMP}.tar.gz" --quiet 2>&1 echo "[$(date)] Uploaded to s3://${S3_BUCKET}/${S3_PREFIX}/code/supersam-code-${TIMESTAMP}.tar.gz" # ── Cleanup local ───────────────────────────────────────────────────────── rm -f "${ARCHIVE_FILE}" echo "[$(date)] Local cleanup done" # ── Retention: delete S3 code backups older than RETENTION_DAYS ─────────── echo "[$(date)] Cleaning S3 code backups older than ${RETENTION_DAYS} days..." CUTOFF=$(date -d "-${RETENTION_DAYS} days" +%Y-%m-%d) mc ls "beget/${S3_BUCKET}/${S3_PREFIX}/code/" 2>/dev/null \ | awk '{print $NF}' \ | while read -r fname; do file_date=$(echo "$fname" | grep -oP '\d{4}-\d{2}-\d{2}' || echo "") if [ -n "$file_date" ] && [[ "$file_date" < "$CUTOFF" ]]; then mc rm "beget/${S3_BUCKET}/${S3_PREFIX}/code/${fname}" --quiet 2>/dev/null echo "[$(date)] Deleted old backup: ${fname}" fi done echo "[$(date)] Code backup complete."