Files
play-life/dump-db.sh
poignatov 6015b62d29
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 15s
Исправлена логика dump-db.sh для работы с удаленными хостами
2026-01-01 17:04:10 +03:00

139 lines
5.8 KiB
Bash
Executable File
Raw Permalink 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
# Скрипт для создания дампа базы данных
# Использование:
# ./dump-db.sh [имя_дампа] # Дамп из .env
# ./dump-db.sh --env-file .env.prod [имя] # Дамп из указанного файла
# ./dump-db.sh production-backup # Именованный дамп из .env
set -e
# Значения по умолчанию
DEFAULT_ENV_FILE=".env"
ENV_FILE="$DEFAULT_ENV_FILE"
DUMP_NAME=""
# Парсим аргументы
while [[ $# -gt 0 ]]; do
case $1 in
--env-file)
ENV_FILE="$2"
shift 2
;;
*)
if [ -z "$DUMP_NAME" ]; then
DUMP_NAME="$1"
else
echo "❌ Ошибка: Неизвестный аргумент: $1"
echo "Использование: ./dump-db.sh [--env-file FILE] [имя_дампа]"
exit 1
fi
shift
;;
esac
done
# Загружаем переменные окружения из указанного файла
if [ -f "$ENV_FILE" ]; then
export $(cat "$ENV_FILE" | grep -v '^#' | grep -v '^$' | xargs)
echo "📋 Используется файл окружения: $ENV_FILE"
else
echo "⚠️ Файл $ENV_FILE не найден, используются значения по умолчанию"
fi
DB_HOST=${DB_HOST:-localhost}
DB_PORT=${DB_PORT:-5432}
DB_USER=${DB_USER:-playeng}
DB_PASSWORD=${DB_PASSWORD:-playeng}
DB_NAME=${DB_NAME:-playeng}
# Создаем директорию для дампов, если её нет
mkdir -p database-dumps
# Генерируем имя файла с датой и временем, если не указано
if [ -z "$DUMP_NAME" ]; then
DUMP_NAME="dump_$(date +%Y%m%d_%H%M%S).sql"
else
DUMP_NAME="$DUMP_NAME.sql"
fi
DUMP_PATH="database-dumps/$DUMP_NAME"
echo "🗄️ Создание дампа базы данных..."
echo " База: $DB_NAME"
echo " Хост: $DB_HOST:$DB_PORT"
echo " Пользователь: $DB_USER"
echo " Файл: $DUMP_PATH"
# Создаем дамп через docker-compose, если контейнер запущен И хост локальный
if [ "$DB_HOST" = "localhost" ] || [ "$DB_HOST" = "127.0.0.1" ] || [ -z "$DB_HOST" ]; then
if docker-compose ps db 2>/dev/null | grep -q "Up"; then
echo " Используется docker-compose..."
docker-compose exec -T db pg_dump -U "$DB_USER" -d "$DB_NAME" > "$DUMP_PATH"
elif command -v pg_dump &> /dev/null; then
# Или напрямую через pg_dump, если БД доступна локально
echo " Используется локальный pg_dump..."
PGPASSWORD="$DB_PASSWORD" pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" > "$DUMP_PATH"
elif command -v docker &> /dev/null; then
# Используем Docker образ postgres для создания дампа
echo " Используется Docker (postgres:latest)..."
docker run --rm -i --network host \
-e PGPASSWORD="$DB_PASSWORD" \
postgres:latest \
pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" > "$DUMP_PATH"
else
echo "❌ Ошибка: pg_dump не найден, docker-compose не запущен и Docker недоступен"
echo " Установите PostgreSQL клиент или Docker"
exit 1
fi
else
# Для удаленных хостов используем pg_dump или Docker
if command -v pg_dump &> /dev/null; then
echo " Используется локальный pg_dump..."
PGPASSWORD="$DB_PASSWORD" pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" > "$DUMP_PATH"
elif command -v docker &> /dev/null; then
# Используем Docker образ postgres для создания дампа
# Используем latest для совместимости с разными версиями сервера
echo " Используется Docker (postgres:latest)..."
# Используем --network host для доступа к удаленным хостам
docker run --rm -i --network host \
-e PGPASSWORD="$DB_PASSWORD" \
postgres:latest \
pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" > "$DUMP_PATH"
else
echo "❌ Ошибка: pg_dump не найден и Docker недоступен"
echo " Установите PostgreSQL клиент или Docker"
exit 1
fi
fi
# Сжимаем дамп
echo " Сжатие дампа..."
gzip -f "$DUMP_PATH"
DUMP_PATH="${DUMP_PATH}.gz"
echo "✅ Дамп успешно создан: $DUMP_PATH"
echo " Размер: $(du -h "$DUMP_PATH" | cut -f1)"
# Ограничиваем количество дампов (максимум 10)
MAX_DUMPS=10
DUMP_COUNT=$(ls -1 database-dumps/*.sql.gz 2>/dev/null | wc -l | tr -d ' ')
if [ "$DUMP_COUNT" -gt "$MAX_DUMPS" ]; then
echo ""
echo "🧹 Очистка старых дампов (максимум $MAX_DUMPS)..."
# Сортируем по дате модификации (новые первыми) и удаляем самые старые
OLD_DUMPS=$(ls -1t database-dumps/*.sql.gz 2>/dev/null | tail -n +$((MAX_DUMPS + 1)))
if [ -n "$OLD_DUMPS" ]; then
REMOVED_COUNT=0
for old_dump in $OLD_DUMPS; do
rm -f "$old_dump"
REMOVED_COUNT=$((REMOVED_COUNT + 1))
echo " Удален: $(basename "$old_dump")"
done
echo " Удалено дампов: $REMOVED_COUNT"
echo " Осталось дампов: $MAX_DUMPS"
fi
fi