#!/bin/bash # Скрипт для создания дампа базы данных # Использование: # ./dump-db.sh [имя_дампа] # Дамп из .env.prod # ./dump-db.sh --env-file .env.local [имя] # Дамп из указанного файла # ./dump-db.sh production-backup # Именованный дамп из .env.prod set -e # Значения по умолчанию DEFAULT_ENV_FILE=".env.prod" 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