/home/suroeste/public_html/payments.transportessuroeste.com/scripts
Edit: /home/suroeste/public_html/payments.transportessuroeste.com/scripts/backup.sh (2638B)
#!/usr/bin/env bash
# ============================================================================
# TRANSPORTES SUROESTE - Database Backup Script
# ============================================================================
# Usage: ./scripts/backup.sh
# Cron: 0 2 * * * /path/to/project/scripts/backup.sh >> /var/log/ts-backup.log 2>&1
# ============================================================================
set -euo pipefail
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
BACKUP_DIR="${PROJECT_DIR}/backups"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="${DB_NAME:-transportes_suroeste_payments}"
RETENTION_DAYS=${BACKUP_RETENTION_DAYS:-30}
CONTAINER_NAME="ts-mysql"
# Colors (only for interactive terminal)
if [ -t 1 ]; then
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
RESET='\033[0m'
else
GREEN='' YELLOW='' RED='' RESET=''
fi
log() { echo -e "[$(date '+%Y-%m-%d %H:%M:%S')] $1"; }
# Load environment variables
if [ -f "${PROJECT_DIR}/.env" ]; then
set -a
source "${PROJECT_DIR}/.env"
set +a
fi
# Create backup directory
mkdir -p "${BACKUP_DIR}"
# Check if MySQL container is running
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log "${RED}ERROR: MySQL container '${CONTAINER_NAME}' is not running${RESET}"
exit 1
fi
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz"
log "${YELLOW}Starting backup of '${DB_NAME}'...${RESET}"
# Create backup using mysqldump via Docker
docker exec "${CONTAINER_NAME}" \
mysqldump \
--user=root \
--password="${MYSQL_ROOT_PASSWORD}" \
--single-transaction \
--routines \
--triggers \
--events \
--add-drop-table \
--set-gtid-purged=OFF \
"${DB_NAME}" 2>/dev/null | gzip > "${BACKUP_FILE}"
# Verify backup
if [ -s "${BACKUP_FILE}" ]; then
BACKUP_SIZE=$(du -h "${BACKUP_FILE}" | cut -f1)
log "${GREEN}Backup created: ${BACKUP_FILE} (${BACKUP_SIZE})${RESET}"
else
log "${RED}ERROR: Backup file is empty${RESET}"
rm -f "${BACKUP_FILE}"
exit 1
fi
# Cleanup old backups
DELETED=$(find "${BACKUP_DIR}" -name "*.sql.gz" -mtime +${RETENTION_DAYS} -delete -print | wc -l)
if [ "${DELETED}" -gt 0 ]; then
log "${YELLOW}Cleaned ${DELETED} backups older than ${RETENTION_DAYS} days${RESET}"
fi
# Summary
TOTAL_BACKUPS=$(find "${BACKUP_DIR}" -name "*.sql.gz" | wc -l)
TOTAL_SIZE=$(du -sh "${BACKUP_DIR}" | cut -f1)
log "${GREEN}Backup complete. Total: ${TOTAL_BACKUPS} backups (${TOTAL_SIZE})${RESET}"