#!/bin/bash # ============================================================================ # Gitea Backup Script # ============================================================================ # Backs up PostgreSQL database and Gitea data directory to AWS S3 # # Usage: ./backup.sh # ============================================================================ set -e # ============================================================================ # Configuration # ============================================================================ readonly TIMESTAMP=$(date +%Y%m%d_%H%M%S) readonly BACKUP_DIR="/tmp/gitea-backup-${TIMESTAMP}" readonly S3_BUCKET="qvest-task-backups" readonly S3_PREFIX="backups" readonly LOG_FILE="/var/log/gitea-backup.log" readonly DB_CONTAINER="gitea-postgres" readonly DB_USER="gitea" readonly DB_NAME="gitea" readonly DATA_VOLUME="gitea_gitea-data" # Output colors readonly GREEN='\033[0;32m' readonly YELLOW='\033[1;33m' readonly RED='\033[0;31m' readonly NC='\033[0m' # ============================================================================ # Logging Functions # ============================================================================ log_info() { echo -e "${YELLOW}[INFO]${NC} $1" | tee -a "${LOG_FILE}" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a "${LOG_FILE}" } log_error() { echo -e "${RED}[ERROR]${NC} $1" | tee -a "${LOG_FILE}" >&2 } error_exit() { log_error "$1" cleanup exit 1 } # ============================================================================ # Core Functions # ============================================================================ cleanup() { if [ -d "${BACKUP_DIR}" ]; then rm -rf "${BACKUP_DIR}" fi } create_backup_dir() { mkdir -p "${BACKUP_DIR}" || error_exit "Failed to create backup directory" } backup_database() { log_info "Backing up PostgreSQL database..." docker exec "${DB_CONTAINER}" pg_dump -U "${DB_USER}" -d "${DB_NAME}" \ | gzip > "${BACKUP_DIR}/database-${TIMESTAMP}.sql.gz" \ || error_exit "Database backup failed" } backup_gitea_data() { log_info "Backing up Gitea data..." docker run --rm \ -v "${DATA_VOLUME}:/data:ro" \ -v "${BACKUP_DIR}:/backup" \ alpine tar czf "/backup/gitea-data-${TIMESTAMP}.tar.gz" -C /data . \ || error_exit "Gitea data backup failed" } upload_to_s3() { log_info "Uploading to S3..." local db_backup="${BACKUP_DIR}/database-${TIMESTAMP}.sql.gz" local data_backup="${BACKUP_DIR}/gitea-data-${TIMESTAMP}.tar.gz" aws s3 cp "${db_backup}" "s3://${S3_BUCKET}/${S3_PREFIX}/" \ || error_exit "Failed to upload database backup" aws s3 cp "${data_backup}" "s3://${S3_BUCKET}/${S3_PREFIX}/" \ || error_exit "Failed to upload Gitea data backup" } # ============================================================================ # Main Execution # ============================================================================ main() { log_info "Starting backup process..." create_backup_dir backup_database backup_gitea_data upload_to_s3 cleanup log_success "Backup completed successfully" log_info "Database: s3://${S3_BUCKET}/${S3_PREFIX}/database-${TIMESTAMP}.sql.gz" log_info "Data: s3://${S3_BUCKET}/${S3_PREFIX}/gitea-data-${TIMESTAMP}.tar.gz" } main "$@"