nordabiz/scripts/dr-restore.sh
Maciej Pienczyn a57187e05f
Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions
test: Add comprehensive testing infrastructure
- pytest framework with fixtures for auth (auth_client, admin_client)
- Unit tests for SearchService
- Integration tests for auth flow
- Security tests (OWASP Top 10: SQL injection, XSS, CSRF)
- Smoke tests for production health and backup monitoring
- E2E tests with Playwright (basic structure)
- DR tests for backup/restore procedures
- GitHub Actions CI/CD workflow (.github/workflows/test.yml)
- Coverage configuration (.coveragerc) with 80% minimum
- DR documentation and restore script

Staging environment: VM 248, staging.nordabiznes.pl

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 07:52:34 +01:00

165 lines
4.9 KiB
Bash

#!/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