77 lines
2.5 KiB
Bash
Executable File
77 lines
2.5 KiB
Bash
Executable File
#!/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
|