#!/bin/bash # Gitea Dump Backup Script # Backs up Gitea using the native 'gitea dump' command and transfers to remote storage set -euo pipefail # Configuration BACKUP_DIR="./gitea-backups" REMOTE_HOST="workstation" REMOTE_PATH="/mnt/data/git-backups" REMOTE_USER="${REMOTE_USER:-$(whoami)}" CONTAINER_NAME="${CONTAINER_NAME:-gitea}" KEEP_LOCAL="${KEEP_LOCAL:-3}" LOG_FILE="${LOG_FILE:-/var/log/gitea-backup.log}" # Timestamps DATE=$(date +%Y%m%d) TIMESTAMP=$(date +%Y%m%d_%H%M%S) log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE" } error() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $*" | tee -a "$LOG_FILE" >&2 exit 1 } # Ensure local backup directory exists mkdir -p "$BACKUP_DIR" log "Starting Gitea backup process..." # Step 1: Execute gitea dump inside the container log "Creating Gitea dump inside container..." CONTAINER_DUMP_PATH="/data/gitea-dump-${TIMESTAMP}.zip" docker exec -u 1000 -i "$CONTAINER_NAME" bash -c "/app/gitea/gitea dump -c /data/gitea/conf/app.ini -f ${CONTAINER_DUMP_PATH}" \ || error "Failed to execute gitea dump command" log "Dump created in container at: $CONTAINER_DUMP_PATH" # Step 2: Copy the archive from container to host LOCAL_BACKUP="${BACKUP_DIR}/gitea-dump-${TIMESTAMP}.zip" log "Copying backup from container to host..." docker cp "${CONTAINER_NAME}:${CONTAINER_DUMP_PATH}" "$LOCAL_BACKUP" \ || error "Failed to copy backup from container" log "Backup saved locally: $LOCAL_BACKUP" # Step 3: Clean up the dump file inside the container log "Cleaning up container dump file..." docker exec "$CONTAINER_NAME" rm -f "$CONTAINER_DUMP_PATH" || log "Warning: Failed to clean up container dump file (non-fatal)" # Step 4: Upload to remote workstation log "Uploading backup to remote storage (${REMOTE_HOST}:${REMOTE_PATH})..." if ssh "$REMOTE_USER@$REMOTE_HOST" "test -d $REMOTE_PATH"; then rsync -avz --progress "$LOCAL_BACKUP" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/" \ || error "Failed to upload backup to remote storage" log "Backup uploaded successfully" else error "Remote backup directory does not exist: ${REMOTE_HOST}:${REMOTE_PATH}" fi # Step 5: Clean up old local backups (keep only KEEP_LOCAL most recent) log "Cleaning up old local backups (keeping last $KEEP_LOCAL)..." cd "$BACKUP_DIR" || error "Cannot access backup directory" ls -t gitea-dump-*.zip 2>/dev/null | tail -n +$((KEEP_LOCAL + 1)) | xargs -r rm -f log "Local cleanup complete" # Final status log "Backup completed successfully!" log "Backup file: $(ls -lh "$LOCAL_BACKUP" | awk '{print $5, $9}')" exit 0