2025-12-31 18:24:15 +03:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
|
|
# Скрипт для создания дампа базы данных
|
|
|
|
|
|
# Использование:
|
2025-12-31 19:11:28 +03:00
|
|
|
|
# ./dump-db.sh [имя_дампа] # Дамп из .env
|
|
|
|
|
|
# ./dump-db.sh --env-file .env.prod [имя] # Дамп из указанного файла
|
|
|
|
|
|
# ./dump-db.sh production-backup # Именованный дамп из .env
|
2025-12-31 18:24:15 +03:00
|
|
|
|
|
|
|
|
|
|
set -e
|
|
|
|
|
|
|
|
|
|
|
|
# Значения по умолчанию
|
2025-12-31 19:11:28 +03:00
|
|
|
|
DEFAULT_ENV_FILE=".env"
|
2025-12-31 18:24:15 +03:00
|
|
|
|
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 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 для создания дампа
|
|
|
|
|
|
# Используем 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-compose не запущен и Docker недоступен"
|
|
|
|
|
|
echo " Установите PostgreSQL клиент или Docker"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
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
|
|
|
|
|
|
|