sync
This commit is contained in:
105
src/backup.sh
105
src/backup.sh
@@ -24,7 +24,7 @@ OPERATION_MODE="${OPERATION_MODE:-backup}"
|
||||
|
||||
#######################################
|
||||
# Determine backup mode from the environment only.
|
||||
# Valid values: "directory" or "postgres".
|
||||
# Valid values: "directory", "postgres", or "s3".
|
||||
# Default to "directory" if not provided.
|
||||
#######################################
|
||||
BACKUP_MODE="${BACKUP_MODE:-directory}"
|
||||
@@ -39,6 +39,8 @@ if [ "$BACKUP_MODE" = "postgres" ]; then
|
||||
elif [ "$OPERATION_MODE" = "restore" ]; then
|
||||
REQUIRED_CMDS+=(psql)
|
||||
fi
|
||||
elif [ "$BACKUP_MODE" = "s3" ]; then
|
||||
REQUIRED_CMDS+=(mc)
|
||||
fi
|
||||
|
||||
for cmd in "${REQUIRED_CMDS[@]}"; do
|
||||
@@ -107,8 +109,16 @@ case "$BACKUP_MODE" in
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
s3)
|
||||
: "${S3_BUCKET:?Environment variable S3_BUCKET is not set (required for S3 mode)}"
|
||||
: "${S3_ENDPOINT:?Environment variable S3_ENDPOINT is not set (required for S3 mode)}"
|
||||
: "${MINIO_ACCESS_KEY:?Environment variable MINIO_ACCESS_KEY is not set (required for S3 mode)}"
|
||||
: "${MINIO_SECRET_KEY:?Environment variable MINIO_SECRET_KEY is not set (required for S3 mode)}"
|
||||
# Optional: S3 path prefix
|
||||
: "${S3_PREFIX:=}"
|
||||
;;
|
||||
*)
|
||||
echo "Error: Unknown backup mode '$BACKUP_MODE'. Valid modes are 'directory' and 'postgres'." >&2
|
||||
echo "Error: Unknown backup mode '$BACKUP_MODE'. Valid modes are 'directory', 'postgres', and 's3'." >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
@@ -287,6 +297,91 @@ restore_postgres() {
|
||||
fi
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Backup an S3 bucket.
|
||||
# Syncs the S3 bucket to a temporary directory and then backs it up.
|
||||
#######################################
|
||||
backup_s3() {
|
||||
log "Starting S3 backup for bucket '${S3_BUCKET}' at endpoint '${S3_ENDPOINT}'"
|
||||
|
||||
# Create a temporary directory for the S3 sync.
|
||||
TEMP_BACKUP_DIR=$(mktemp -d)
|
||||
log "Created temporary directory: ${TEMP_BACKUP_DIR}"
|
||||
|
||||
# Configure MinIO Client alias
|
||||
local alias_name="backupsidecar"
|
||||
if ! mc alias set "${alias_name}" "${S3_ENDPOINT}" "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}"; then
|
||||
local msg="Failed to configure MinIO client alias"
|
||||
log "$msg"
|
||||
send_notification "$msg"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Build S3 path
|
||||
local s3_path="${alias_name}/${S3_BUCKET}"
|
||||
if [ -n "${S3_PREFIX}" ]; then
|
||||
s3_path="${s3_path}/${S3_PREFIX}"
|
||||
fi
|
||||
|
||||
log "Syncing S3 bucket from ${s3_path} to ${TEMP_BACKUP_DIR}..."
|
||||
if mc mirror "${s3_path}" "${TEMP_BACKUP_DIR}" --remove; then
|
||||
log "S3 sync completed successfully."
|
||||
else
|
||||
local exit_code=$?
|
||||
local msg="S3 sync failed with error code ${exit_code}"
|
||||
log "$msg"
|
||||
send_notification "$msg"
|
||||
exit "$exit_code"
|
||||
fi
|
||||
|
||||
# Back up the directory containing the S3 content.
|
||||
run_restic_backup "${TEMP_BACKUP_DIR}"
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Restore an S3 bucket.
|
||||
# Restores the S3 content from the backup and syncs it back to S3.
|
||||
#######################################
|
||||
restore_s3() {
|
||||
local snapshot_id="${RESTORE_SNAPSHOT_ID:-latest}"
|
||||
log "Starting S3 restore for bucket '${S3_BUCKET}' at endpoint '${S3_ENDPOINT}'"
|
||||
|
||||
# Create a temporary directory for the restore.
|
||||
TEMP_RESTORE_DIR=$(mktemp -d)
|
||||
log "Created temporary directory: ${TEMP_RESTORE_DIR}"
|
||||
|
||||
# Restore the backup to the temporary directory
|
||||
run_restic_restore "${TEMP_RESTORE_DIR}" "${snapshot_id}"
|
||||
|
||||
# Configure MinIO Client alias
|
||||
local alias_name="backupsidecar"
|
||||
if ! mc alias set "${alias_name}" "${S3_ENDPOINT}" "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}"; then
|
||||
local msg="Failed to configure MinIO client alias"
|
||||
log "$msg"
|
||||
send_notification "$msg"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Build S3 path
|
||||
local s3_path="${alias_name}/${S3_BUCKET}"
|
||||
if [ -n "${S3_PREFIX}" ]; then
|
||||
s3_path="${s3_path}/${S3_PREFIX}"
|
||||
fi
|
||||
|
||||
log "Syncing restored content from ${TEMP_RESTORE_DIR} to ${s3_path}..."
|
||||
if mc mirror "${TEMP_RESTORE_DIR}" "${s3_path}" --remove; then
|
||||
local msg="S3 restore completed successfully"
|
||||
log "$msg"
|
||||
send_notification "$msg"
|
||||
else
|
||||
local exit_code=$?
|
||||
local msg="S3 restore failed with error code ${exit_code}"
|
||||
log "$msg"
|
||||
send_notification "$msg"
|
||||
exit "$exit_code"
|
||||
fi
|
||||
}
|
||||
|
||||
#######################################
|
||||
# Cleanup temporary resources.
|
||||
#######################################
|
||||
@@ -315,6 +410,9 @@ main() {
|
||||
postgres)
|
||||
backup_postgres
|
||||
;;
|
||||
s3)
|
||||
backup_s3
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
restore)
|
||||
@@ -325,6 +423,9 @@ main() {
|
||||
postgres)
|
||||
restore_postgres
|
||||
;;
|
||||
s3)
|
||||
restore_s3
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
Reference in New Issue
Block a user