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
- 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>
165 lines
4.9 KiB
Bash
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
|