Резервирование Postgres
- Создать каталог для хранения резервной копии сервиса Postgres с помощью команды:
mkdir /opt/Pythagoras/backups/postgres
- Запуcтить скрипт
mount_s3.shна сервере с рольюinfraдля бакетаpostgresdump
./mount_s3.sh postgresdump /opt/Pythagoras/backups/postgres/
Пример скрипта mount_s3.sh
#!/bin/bash
# Script for mounting an S3-compatible bucket using s3fs
# Usage:
# ./mount_s3.sh my-bucket
# ./mount_s3.sh --help
show_help() {
cat <<EOF
Usage: $0 BUCKET_NAME [MOUNT_POINT]
Mounts the specified S3 bucket into a local directory using s3fs.
Arguments:
BUCKET_NAME Name of the S3 bucket (required)
MOUNT_POINT Local directory to mount into (default: ~/s3mount)
Environment variables:
S3_ACCESS_KEY Access Key
S3_SECRET_KEY Secret Key
S3_ENDPOINT S3 endpoint URL (default: http://localhost:9000)
Example:
export S3_ACCESS_KEY=minioadmin
export S3_SECRET_KEY=minioadmin
./mount_s3.sh my-bucket
EOF
}
# Show help and exit
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
show_help
exit 0
fi
# Check if bucket name is provided
if [[ -z "$1" ]]; then
echo "Error: Bucket name not specified"
show_help
exit 1
fi
BUCKET_NAME="$1"
MOUNT_POINT="${2:-$HOME/s3mount}"
S3_ENDPOINT="${S3_ENDPOINT:-http://localhost:9000}"
# Check if credentials are set
if [[ -z "$S3_ACCESS_KEY" || -z "$S3_SECRET_KEY" ]]; then
echo "Error: Set S3_ACCESS_KEY and S3_SECRET_KEY environment variables"
exit 1
fi
# Create password file
PASSWD_FILE="$HOME/.passwd-s3fs"
echo "${S3_ACCESS_KEY}:${S3_SECRET_KEY}" > "$PASSWD_FILE"
chmod 600 "$PASSWD_FILE"
# Create mount point directory
mkdir -p "$MOUNT_POINT"
# Mount the bucket
s3fs "$BUCKET_NAME" "$MOUNT_POINT" \
-o passwd_file="$PASSWD_FILE" \
-o url="$S3_ENDPOINT" \
-o use_path_request_style \
-o allow_other \
-o umask=000
echo "Bucket $BUCKET_NAME mounted to $MOUNT_POINT"
- Запустить скрипт, представленный в разделе «2.3.1 Резервное копирование данных».
./postgres2fs.sh
Пример скрипта:
#!/bin/bash
#
# Backup a Postgresql database into a daily file.
#
set -e
BACKUP_DIR="/opt/Pythagoras/backups/postgres"
POSTGRES_IMAGE="pythagoras/pgs-postgres"
POSTGRES_VERSION="<VERSION>"
POSTGRES_HOST="<HOST>"
POSTGRES_PORT="<PORT>"
DATABASE=$1
DATABASE_USER_PASS="<PASSWORD>"
DATABASE_USER=keycloak
CURRENT_DATETIME="$(date +%Y_%m_%d_%H%M)"
KEEP_BACKUPS="<RETENTION_TIME>"
FILE=$1_${CURRENT_DATETIME}
OUTPUT_FILE=${BACKUP_DIR}/${FILE}
RC=0
docker run \
--name postgres_backup \
--network pgs-network \
--env PGPASSWORD=${DATABASE_USER_PASS} \
--rm \
-v "${BACKUP_DIR}:${BACKUP_DIR}" \
--entrypoint pg_dump pgs-private-
registry:5001/${POSTGRES_IMAGE}:${POSTGRES_VERSION} \
-Fc -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} \
-U ${DATABASE_USER} \
-d ${DATABASE} \
-f ${OUTPUT_FILE}.gz -v || RC=1
# Delete archives older then KEEP_BACKUPS value
find "${BACKUP_DIR}"/ -mtime +"${KEEP_BACKUPS}" -name "*.gz" -delete || RC=1
if [ ${RC} = 0 ]
then
echo "Successfully backup"
else
echo "Backup Failed"
fi
- Задать переменные:
BACKUP_DIR="<BACKUP_DIR>"
MINIO_BUCKET="<MINIO_BUCKET>"
- Запустить скрипт:
#!/bin/bash
set -e
BACKUP_DIR="<BACKUP_DIR>"
MINIO_IMAGE="<MINIO_IMAGE_NAME>"
MINIO_VERSION="<VERSION>"
MINIO_URL="<MINIO_URL>"
MINIO_ACCESS_KEY="<ACCESS_KEY>"
MINIO_SECRET_KEY="<SECRET_KEY>"
MINIO_ALIAS_NAME="<MINIO_ALIAS_NAME>"
MINIO_BUCKET="<MINIO_BUCKET>"
RC=0
docker run --net=host -it --entrypoint=bash -v ${BACKUP_DIR}:${BACKUP_DIR} \
pgs-private-registry:5001/${MINIO_IMAGE}:${MINIO_VERSION} -c \
"mc alias set ${MINIO_ALIAS_NAME} ${MINIO_URL} ${MINIO_ACCESS_KEY} \
${MINIO_SECRET_KEY};
mc mirror --remove --preserve ${MINIO_ALIAS_NAME}/${MINIO_BUCKET} $BACKUP_DIR/" \
|| RC=1
if [ ${RC} = 0 ]
then
echo "Successfully backup"
else
echo "Backup Failed"
fi