- 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.
115 lines
3.3 KiB
Bash
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 "$@"
|