qvest-task/scripts/backup.sh
aviyadeveloper b8eb8e991c
All checks were successful
Update Automation Tests / Integration Tests (pull_request) Successful in 37s
feat: implement disaster recovery with automated restore
- Create restore.sh for automated S3 backup recovery
  - Fetches backups, stops services, restores database/data/config, restarts & validates
- Successfully tested on production system
- Document procedures in backup-strategy.md
- Add Test 6: Full backup/restore cycle with disaster simulation
- Rename test-update.sh → test-integration.sh
2026-06-11 19:27:49 +02:00

137 lines
4.0 KiB
Bash

#!/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"
readonly CONFIG_DIR="/opt/gitea"
# 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"
}
backup_configuration() {
log_info "Backing up configuration files..."
tar czf "${BACKUP_DIR}/config-${TIMESTAMP}.tar.gz" \
-C "${CONFIG_DIR}" \
docker-compose.yml \
nginx/ \
.env \
scripts/ \
diun/ \
2>/dev/null || error_exit "Configuration backup failed"
log_success "Configuration backup created"
}
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"
local config_backup="${BACKUP_DIR}/config-${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"
aws s3 cp "${config_backup}" "s3://${S3_BUCKET}/${S3_PREFIX}/" \
|| error_exit "Failed to upload configuration backup"
}
# ============================================================================
# Main Execution
# ============================================================================
main() {
log_info "Starting backup process..."
create_backup_dir
backup_database
backup_gitea_data
backup_configuration
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"
log_info "Config: s3://${S3_BUCKET}/${S3_PREFIX}/config-${TIMESTAMP}.tar.gz"
}
main "$@"