qvest-task/scripts/backup.sh
aviyadeveloper 153bd11b05 feat: implement update automation and backup system with CI tests
- Diun monitors Docker images
- Automated updates for nginx, manual approval for gitea/postgres
- Weekly cert renewal automation via cron
- Health checks with automatic rollback on failure
- AWS SES email notifications on update failures
- Daily S3 backups + pre-update snapshots
- Integration tests with Gitea Actions quality gate

Deployment + optional PoC complete.
2026-06-11 14:03:57 +02:00

115 lines
3.3 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"
# 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 "$@"