#!/bin/bash
# backup_databases.sh - Скрипт бэкапа для трех кластеров PostgreSQL

# ===========================================
# КОНФИГУРАЦИЯ
# ===========================================

# Локальный бэкап
BACKUP_FILE="/home/crazygnome/db.tar.gz"

# Удаленный сервер
REMOTE_HOST="93.88.205.163"
REMOTE_PORT="4162"
REMOTE_USER="crazygnome"
REMOTE_PATH="/home/crazygnome"

# Конфигурация кластеров (порт|пользователь|пароль|база)
# Данные из вашего сообщения
declare -A CLUSTERS
CLUSTERS["freesurf"]="5432|freesurf|gXGQZ_w44f05_IbKF3bBkAJK99_r2R2C|freesurf"
CLUSTERS["ghostway"]="5433|ghostway|BHySDRAiYX-bUamciAQsbt3Y70M6PJlI|ghostway"
CLUSTERS["testbot"]="5434|testbot|ONRx-deA5PHYAfk-Pl7sUt-8lldiX2hn|testbot"

# Цвета для вывода
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'

# ===========================================
# ФУНКЦИИ
# ===========================================

log() {
    echo -e "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# ===========================================
# ОСНОВНАЯ ЧАСТЬ
# ===========================================

echo "========================================="
echo "    PostgreSQL Backup Script v3.0"
echo "    Бэкап трех независимых кластеров"
echo "========================================="
echo ""

# Создаем временную папку
log "Создание временной директории..."
rm -rf /tmp/postgres_backup
mkdir -p /tmp/postgres_backup
log "  ${GREEN}✓${NC} Временная директория создана"

# Проверяем подключение к каждому кластеру
log "Проверка подключения к кластерам..."
ALL_OK=true

for DB in "${!CLUSTERS[@]}"; do
    IFS='|' read -r PORT USER PASS DB_NAME <<< "${CLUSTERS[$DB]}"
    
    if PGPASSWORD=$PASS psql -h localhost -p $PORT -U $USER -d $DB_NAME -c "SELECT 1" > /dev/null 2>&1; then
        log "  ${GREEN}✓${NC} $DB_NAME (порт $PORT) - доступен"
    else
        log "  ${RED}✗${NC} $DB_NAME (порт $PORT) - НЕ ДОСТУПЕН"
        ALL_OK=false
    fi
done

if [ "$ALL_OK" = false ]; then
    log "${RED}✗ Ошибка: некоторые кластеры недоступны. Бэкап прерван${NC}"
    exit 1
fi

echo ""

# Создаем бэкапы для каждого кластера
log "Создание бэкапов..."

for DB in "${!CLUSTERS[@]}"; do
    IFS='|' read -r PORT USER PASS DB_NAME <<< "${CLUSTERS[$DB]}"
    
    echo -n "  Бэкап $DB_NAME (порт $PORT)... "
    
    export PGPASSWORD=$PASS
    pg_dump -h localhost -p $PORT -U $USER -Fc -b "$DB_NAME" > "/tmp/postgres_backup/${DB}.dump" 2>/dev/null
    
    if [ $? -eq 0 ] && [ -s "/tmp/postgres_backup/${DB}.dump" ]; then
        SIZE=$(du -h "/tmp/postgres_backup/${DB}.dump" | cut -f1)
        echo -e "${GREEN}✓${NC} готово (размер: $SIZE)"
    else
        echo -e "${RED}✗${NC} ошибка"
        rm -rf /tmp/postgres_backup
        unset PGPASSWORD
        exit 1
    fi
done

unset PGPASSWORD

echo ""

# Создаем информационный файл
log "Создание информационного файла..."
cat > /tmp/postgres_backup/backup_info.txt << EOF
=========================================
Информация о бэкапе
=========================================
Дата: $(date)
Сервер: $(hostname)
IP: $(hostname -I | awk '{print $1}')

Содержимое бэкапа:
$(ls -lh /tmp/postgres_backup/ | grep -v "^total" | awk '{print "  " $9 " (" $5 ")"}')

Кластеры и базы:
EOF

for DB in freesurf ghostway testbot; do
    IFS='|' read -r PORT USER PASS DB_NAME <<< "${CLUSTERS[$DB]}"
    cat >> /tmp/postgres_backup/backup_info.txt << EOF
  $DB_NAME:
    Порт: $PORT
    Пользователь: $USER
    Пароль: $PASS
    Команда подключения: PGPASSWORD='$PASS' psql -h localhost -p $PORT -U $USER -d $DB_NAME
EOF
done

cat >> /tmp/postgres_backup/backup_info.txt << EOF

=========================================
Команды для восстановления:
=========================================
# Распаковать архив
tar -xzf db.tar.gz -C /tmp/

# Восстановить базы
PGPASSWORD='gXGQZ_w44f05_IbKF3bBkAJK99_r2R2C' pg_restore -h localhost -p 5432 -U freesurf -d freesurf -c --no-owner --no-privileges /tmp/postgres_backup/freesurf.dump
PGPASSWORD='BHySDRAiYX-bUamciAQsbt3Y70M6PJlI' pg_restore -h localhost -p 5433 -U ghostway -d ghostway -c --no-owner --no-privileges /tmp/postgres_backup/ghostway.dump
PGPASSWORD='ONRx-deA5PHYAfk-Pl7sUt-8lldiX2hn' pg_restore -h localhost -p 5434 -U testbot -d testbot -c --no-owner --no-privileges /tmp/postgres_backup/testbot.dump

# После восстановления назначить владельца
psql -p 5432 -d freesurf -c "ALTER SCHEMA public OWNER TO freesurf;"
psql -p 5433 -d ghostway -c "ALTER SCHEMA public OWNER TO ghostway;"
psql -p 5434 -d testbot -c "ALTER SCHEMA public OWNER TO testbot;"
=========================================
EOF

log "  ${GREEN}✓${NC} Информационный файл создан"

# Создаем контрольные суммы
log "Создание контрольных сумм..."
cd /tmp/postgres_backup
md5sum *.dump > checksums.md5
log "  ${GREEN}✓${NC} Контрольные суммы созданы"

# Создаем архив
log "Создание архива..."
cd /tmp
tar -czf "$BACKUP_FILE" postgres_backup/ 2>/dev/null

if [ -f "$BACKUP_FILE" ]; then
    ARCHIVE_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    log "  ${GREEN}✓${NC} Архив создан: $BACKUP_FILE (размер: $ARCHIVE_SIZE)"
else
    log "  ${RED}✗${NC} Ошибка создания архива"
    exit 1
fi

# Отправляем на удаленный сервер
echo ""
log "Отправка на удаленный сервер..."

# Проверяем доступность удаленного сервера
if nc -z -w 5 $REMOTE_HOST $REMOTE_PORT 2>/dev/null; then
    scp -P $REMOTE_PORT "$BACKUP_FILE" ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/db.tar.gz 2>/dev/null
    
    if [ $? -eq 0 ]; then
        log "  ${GREEN}✓${NC} Бэкап отправлен на $REMOTE_HOST:$REMOTE_PORT"
    else
        log "  ${RED}✗${NC} Ошибка отправки на удаленный сервер"
    fi
else
    log "  ${YELLOW}⚠${NC} Удаленный сервер недоступен, бэкап сохранен локально"
fi

# Очистка
log "Очистка временных файлов..."
rm -rf /tmp/postgres_backup
log "  ${GREEN}✓${NC} Временные файлы удалены"

# Финальный вывод
echo ""
echo "========================================="
echo -e "${GREEN}Бэкап успешно завершен!${NC}"
echo "========================================="
echo ""
echo "Локальный файл: $BACKUP_FILE"
echo "Размер: $ARCHIVE_SIZE"
echo "Удаленный сервер: $REMOTE_HOST:$REMOTE_PORT"
echo "Удаленный файл: $REMOTE_PATH/db.tar.gz"
echo ""
echo "Содержимое бэкапа:"
tar -tzf "$BACKUP_FILE" | head -10
echo ""
echo "Строки подключения к базам:"
for DB in freesurf ghostway testbot; do
    IFS='|' read -r PORT USER PASS DB_NAME <<< "${CLUSTERS[$DB]}"
    echo "  $DB: PGPASSWORD='$PASS' psql -h localhost -p $PORT -U $USER -d $DB_NAME"
done
echo "========================================="
