From f67fe6432dbd26208bb12d50f2acb0eaca32e1c0 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 22 Jul 2026 06:58:15 +0000 Subject: [PATCH] feat: backup code to S3 after deploy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scripts/backup-code-s3.sh — tar.gz (без node_modules/.git/dist) → S3 - deploy.sh: вызывает backup-code-s3.sh после деплоя - Retention 30 дней, Beget Cloud Storage - Также добавить в cron: 0 1 * * * --- deploy.sh | 6 ++++ scripts/backup-code-s3.sh | 65 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 scripts/backup-code-s3.sh diff --git a/deploy.sh b/deploy.sh index bb90c63..4a4d953 100755 --- a/deploy.sh +++ b/deploy.sh @@ -4,3 +4,9 @@ cd /opt/supersam git pull origin main docker compose -f docker-compose.app.yml up -d --build echo 'Deploy completed at' $(date) + +# ── Backup code to S3 after deploy ───────────────────────────────────────── +if [ -x ./scripts/backup-code-s3.sh ]; then + echo "Running code backup to S3..." + ./scripts/backup-code-s3.sh || echo "WARNING: code backup failed, deploy OK" +fi diff --git a/scripts/backup-code-s3.sh b/scripts/backup-code-s3.sh new file mode 100644 index 0000000..d7e2f59 --- /dev/null +++ b/scripts/backup-code-s3.sh @@ -0,0 +1,65 @@ +#!/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." \ No newline at end of file