cloud-init/postgres-backup.sh
2025-05-03 16:08:41 +03:00

86 lines
2.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Конфигурация
PG_HOST="10.7.0.10"
PG_USER="squiz" # Пользователь с правами бэкапа
PG_PASS="Redalert2" # Пароль (если есть)
BACKUP_DIR="postgres_backup"
ARCHIVE_NAME="$BACKUP_DIR.tar.gz"
S3_TARGET="tw/3c580be9-5ad7b4ab-08c3-4eeb-90b9-767746b1d4a7/postgres-staging"
TELEGRAM_BOT_TOKEN="6414077478:AAFk03HezovLT2kO_i9OYswH8Weirsgp9GU"
TELEGRAM_CHAT_ID=""-1002045305199
# Функции
send_telegram() {
local message="$1"
curl -s -X POST \
"https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d "chat_id=${TELEGRAM_CHAT_ID}" \
-d "text=${message}" \
-d "parse_mode=Markdown" >/dev/null
}
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# Создаем директорию для бэкапа
mkdir -p "$BACKUP_DIR"
# Получаем список всех баз (исключая шаблонные)
DATABASES=$(PGPASSWORD="$PG_PASS" psql -h "$PG_HOST" -U "$PG_USER" -t -c "SELECT datname FROM pg_database WHERE datname NOT IN ('template0', 'template1', 'postgres')")
if [ -z "$DATABASES" ]; then
error_msg="❌ Не удалось получить список баз данных PostgreSQL"
log "$error_msg"
send_telegram "$error_msg"
exit 1
fi
# Делаем бэкап каждой базы
for DB in $DATABASES; do
log "Бэкап базы $DB..."
PGPASSWORD="$PG_PASS" pg_dump -h "$PG_HOST" -U "$PG_USER" -F d -f "$BACKUP_DIR/$DB" "$DB"
if [ $? -ne 0 ]; then
error_msg="❌ Ошибка при бэкапе базы $DB"
log "$error_msg"
send_telegram "$error_msg"
exit 1
fi
done
# Архивируем
log "Создание архива $ARCHIVE_NAME..."
tar -czvf "$ARCHIVE_NAME" "$BACKUP_DIR"
if [ $? -ne 0 ]; then
error_msg="❌ Ошибка при создании архива"
log "$error_msg"
send_telegram "$error_msg"
exit 1
fi
# Загружаем в S3
log "Загрузка в S3..."
mc cp "$ARCHIVE_NAME" "$S3_TARGET/$ARCHIVE_NAME"
if [ $? -ne 0 ]; then
error_msg="❌ Ошибка при загрузке в S3"
log "$error_msg"
send_telegram "$error_msg"
exit 1
fi
# Очистка
log "Очистка временных файлов..."
rm -rf "$BACKUP_DIR" "$ARCHIVE_NAME"
# Уведомление
success_msg="✅ Бэкап PostgreSQL произведён\n\nАрхив: $ARCHIVE_NAME\nS3 путь: $S3_TARGET/$ARCHIVE_NAME\nБаз: $(echo "$DATABASES" | wc -w)"
log "$success_msg"
send_telegram "$success_msg"
log "Готово!"
exit 0