#!/bin/bash # # NordaBiz Disaster Recovery Restore Script # # Przywraca bazę danych PostgreSQL z backupu i restartuje aplikację. # # Użycie: # ./dr-restore.sh /path/to/backup.dump # ./dr-restore.sh /var/backups/nordabiz/daily/nordabiz_20260202.dump # # Wymagania: # - Uruchomienie jako root lub z sudo # - Backup w formacie pg_dump -Fc (custom format) # # Autor: NordaBiz Team # Data: 2026-02-02 set -e # Kolory dla output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Konfiguracja DB_NAME="nordabiz" DB_USER="nordabiz_app" APP_SERVICE="nordabiznes" HEALTH_URL="http://localhost:5000/health" LOG_FILE="/var/log/nordabiznes/dr-restore.log" # Funkcje pomocnicze log() { echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE" } error() { echo -e "${RED}[ERROR]${NC} $1" >&2 echo "[ERROR] $1" >> "$LOG_FILE" exit 1 } warn() { echo -e "${YELLOW}[WARN]${NC} $1" echo "[WARN] $1" >> "$LOG_FILE" } # Sprawdzenie argumentów if [ -z "$1" ]; then echo "Użycie: $0 <ścieżka_do_backupu>" echo "" echo "Przykłady:" echo " $0 /var/backups/nordabiz/daily/nordabiz_20260202.dump" echo " $0 /var/backups/nordabiz/hourly/nordabiz_20260202_14.dump" echo "" echo "Dostępne backupy:" echo " Dzienne: ls /var/backups/nordabiz/daily/" echo " Godzinowe: ls /var/backups/nordabiz/hourly/" exit 1 fi BACKUP_FILE="$1" # Sprawdzenie czy backup istnieje if [ ! -f "$BACKUP_FILE" ]; then error "Plik backupu nie istnieje: $BACKUP_FILE" fi # Sprawdzenie uprawnień (root lub sudo) if [ "$EUID" -ne 0 ]; then error "Ten skrypt wymaga uprawnień root. Użyj: sudo $0 $1" fi # Potwierdzenie od użytkownika echo "" echo "==========================================" echo " NordaBiz Disaster Recovery Restore" echo "==========================================" echo "" echo "Backup: $BACKUP_FILE" echo "Rozmiar: $(du -h "$BACKUP_FILE" | cut -f1)" echo "Data modyfikacji: $(stat -c %y "$BACKUP_FILE" 2>/dev/null || stat -f %Sm "$BACKUP_FILE")" echo "" echo -e "${YELLOW}UWAGA: Ta operacja nadpisze obecną bazę danych!${NC}" echo "" read -p "Czy kontynuować? (tak/nie): " CONFIRM if [ "$CONFIRM" != "tak" ]; then echo "Anulowano." exit 0 fi # Rozpoczęcie procesu restore log "Rozpoczynam przywracanie z: $BACKUP_FILE" # Krok 1: Zatrzymanie aplikacji log "Krok 1/5: Zatrzymywanie aplikacji..." systemctl stop "$APP_SERVICE" || warn "Aplikacja już zatrzymana" # Krok 2: Backup obecnej bazy (na wszelki wypadek) SAFETY_BACKUP="/tmp/nordabiz_pre_restore_$(date +%Y%m%d_%H%M%S).dump" log "Krok 2/5: Tworzenie backupu bezpieczeństwa: $SAFETY_BACKUP" sudo -u postgres pg_dump -Fc "$DB_NAME" > "$SAFETY_BACKUP" 2>/dev/null || warn "Nie udało się utworzyć backupu bezpieczeństwa (baza może być uszkodzona)" # Krok 3: Usunięcie i odtworzenie bazy log "Krok 3/5: Przywracanie bazy danych..." # Zamknięcie wszystkich połączeń sudo -u postgres psql -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$DB_NAME' AND pid <> pg_backend_pid();" 2>/dev/null || true # Usunięcie i utworzenie bazy sudo -u postgres psql -c "DROP DATABASE IF EXISTS $DB_NAME;" 2>/dev/null || error "Nie można usunąć bazy danych" sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_USER;" || error "Nie można utworzyć bazy danych" # Przywrócenie z backupu sudo -u postgres pg_restore -d "$DB_NAME" -O --role="$DB_USER" "$BACKUP_FILE" || error "Nie można przywrócić bazy z backupu" log "Baza danych przywrócona pomyślnie" # Krok 4: Nadanie uprawnień log "Krok 4/5: Nadawanie uprawnień..." sudo -u postgres psql -d "$DB_NAME" -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO $DB_USER;" sudo -u postgres psql -d "$DB_NAME" -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO $DB_USER;" # Krok 5: Uruchomienie aplikacji log "Krok 5/5: Uruchamianie aplikacji..." systemctl start "$APP_SERVICE" # Oczekiwanie na uruchomienie sleep 5 # Weryfikacja health check log "Weryfikacja health check..." HEALTH_RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" "$HEALTH_URL" 2>/dev/null || echo "000") if [ "$HEALTH_RESPONSE" = "200" ]; then log "Health check: OK (HTTP 200)" else warn "Health check zwrócił: HTTP $HEALTH_RESPONSE" warn "Sprawdź logi: journalctl -u $APP_SERVICE -n 50" fi # Podsumowanie echo "" echo "==========================================" echo " Restore zakończony" echo "==========================================" echo "" log "Restore zakończony pomyślnie" echo "Backup bezpieczeństwa: $SAFETY_BACKUP" echo "" echo "Weryfikacja:" echo " - Health check: curl -I http://localhost:5000/health" echo " - Logi: journalctl -u $APP_SERVICE -f" echo " - Status: systemctl status $APP_SERVICE" echo "" # Sprawdzenie liczby rekordów COMPANY_COUNT=$(sudo -u postgres psql -d "$DB_NAME" -t -c "SELECT COUNT(*) FROM companies;" 2>/dev/null | xargs) log "Liczba firm w bazie: $COMPANY_COUNT" exit 0