# NordaBiz Disaster Recovery Playbook **Wersja:** 1.0 **Data utworzenia:** 2026-02-02 **Ostatnia aktualizacja:** 2026-02-02 --- ## Spis treści 1. [Przegląd systemu backupów](#przegląd-systemu-backupów) 2. [Lokalizacje backupów](#lokalizacje-backupów) 3. [Scenariusze awarii](#scenariusze-awarii) 4. [Procedury odtwarzania](#procedury-odtwarzania) 5. [Testy DR](#testy-dr) 6. [Kontakty i eskalacja](#kontakty-i-eskalacja) --- ## Przegląd systemu backupów ### Metryki SLA | Metryka | Wartość | Opis | |---------|---------|------| | **RTO** | 30-60 min | Recovery Time Objective - czas do przywrócenia | | **RPO** | 1 godzina | Recovery Point Objective - maksymalna utrata danych | | **Retencja hourly** | 24 godziny | Backupy co godzinę | | **Retencja daily** | 30 dni | Backupy dzienne | | **Offsite** | PBS (10.22.68.127) | Proxmox Backup Server | ### Harmonogram backupów | Typ | Częstotliwość | Godzina | Retencja | |-----|---------------|---------|----------| | Hourly DB | Co godzinę | :00 | 24h | | Daily DB | Codziennie | 02:00 | 30 dni | | Config | Tygodniowo | Niedziela 03:00 | 4 tygodnie | | Offsite sync | Codziennie | 04:00 | 30 dni | | VM Snapshot | Przed deployment | Manual | 3 snapshoty | --- ## Lokalizacje backupów ### Backup lokalny (NORDABIZ-01) ``` /var/backups/nordabiz/ ├── hourly/ # Backupy co godzinę (retencja 24h) │ ├── nordabiz_20260202_00.dump │ ├── nordabiz_20260202_01.dump │ └── ... ├── daily/ # Backupy dzienne (retencja 30 dni) │ ├── nordabiz_20260201.dump │ ├── nordabiz_20260202.dump │ └── ... └── config/ # Konfiguracja (retencja 4 tygodnie) ├── config_20260126.tar.gz └── config_20260202.tar.gz ``` ### Backup offsite (PBS - 10.22.68.127) ``` /backup/nordabiz/ ├── daily/ # Mirror backupów dziennych └── config/ # Mirror konfiguracji ``` ### VM Snapshots (Proxmox) - **Lokalizacja:** Proxmox VE (hypervisor) - **VM ID:** 249 (NORDABIZ-01), 119 (R11-REVPROXY-01) - **Storage:** local-lvm lub PBS - **Dostęp:** Proxmox Web UI (https://10.22.68.10:8006) --- ## Scenariusze awarii ### Scenariusz 1: Uszkodzenie bazy danych **Objawy:** - Błędy SQL w logach aplikacji - HTTP 500 na stronie - `psql: FATAL: database "nordabiz" does not exist` **Procedura:** 1. Zatrzymaj aplikację: `sudo systemctl stop nordabiznes` 2. Zidentyfikuj ostatni działający backup 3. Użyj skryptu restore: `sudo ./scripts/dr-restore.sh /var/backups/nordabiz/hourly/latest.dump` 4. Zweryfikuj: `curl -I http://localhost:5000/health` **RTO:** ~15 minut --- ### Scenariusz 2: Awaria VM (NORDABIZ-01) **Objawy:** - Brak odpowiedzi SSH - HTTP 502 na https://nordabiznes.pl - VM nie odpowiada w Proxmox **Procedura:** #### Opcja A: Restart VM 1. Zaloguj się do Proxmox: https://10.22.68.10:8006 2. VM 249 → Stop → Start 3. Poczekaj 2-3 minuty 4. Zweryfikuj: `curl -I https://nordabiznes.pl/health` #### Opcja B: Rollback do snapshotu 1. Proxmox → VM 249 → Snapshots 2. Wybierz ostatni działający snapshot 3. Kliknij "Rollback" 4. Start VM 5. Zweryfikuj #### Opcja C: Pełne odtworzenie (nowa VM) 1. Utwórz nową VM w Proxmox (4 vCPU, 8GB RAM, 100GB SSD) 2. Zainstaluj Ubuntu 22.04 LTS 3. Postępuj zgodnie z sekcją [Pełne odtworzenie systemu](#pełne-odtworzenie-systemu) **RTO:** 5 min (opcja A), 10 min (opcja B), 60 min (opcja C) --- ### Scenariusz 3: Ransomware / kompromitacja **Objawy:** - Zaszyfrowane pliki - Nieautoryzowane zmiany w bazie - Podejrzana aktywność w logach **Procedura:** 1. **NATYCHMIAST** odłącz VM od sieci (Proxmox → VM → Network → Disconnect) 2. Utwórz snapshot stanu (dla forensics) 3. Przywróć z offsite backup (PBS): ```bash scp maciejpi@10.22.68.127:/backup/nordabiz/daily/nordabiz_YYYYMMDD.dump /tmp/ ``` 4. Utwórz nową VM (nie używaj starej!) 5. Postępuj zgodnie z [Pełne odtworzenie systemu](#pełne-odtworzenie-systemu) 6. Zmień wszystkie hasła i klucze API 7. Zgłoś incydent bezpieczeństwa **RTO:** 60-120 minut --- ### Scenariusz 4: Awaria NPM (Reverse Proxy) **Objawy:** - ERR_CONNECTION_REFUSED na https://nordabiznes.pl - NPM container nie działa **Procedura:** 1. SSH do R11-REVPROXY-01: `ssh maciejpi@10.22.68.250` 2. Sprawdź container: `docker ps | grep nginx-proxy-manager` 3. Restart containera: `docker restart nginx-proxy-manager_app_1` 4. Jeśli nie działa, sprawdź logi: `docker logs nginx-proxy-manager_app_1` 5. Zweryfikuj konfigurację proxy: ```bash docker exec nginx-proxy-manager_app_1 sqlite3 /data/database.sqlite \ "SELECT forward_port FROM proxy_host WHERE id = 27;" # Musi być: 5000 ``` **RTO:** 5-10 minut --- ## Procedury odtwarzania ### Przywracanie z backupu godzinowego ```bash # 1. Lista dostępnych backupów ls -la /var/backups/nordabiz/hourly/ # 2. Wybierz backup (np. z godziny 14:00) BACKUP_FILE="/var/backups/nordabiz/hourly/nordabiz_20260202_14.dump" # 3. Uruchom skrypt restore sudo /var/www/nordabiznes/scripts/dr-restore.sh $BACKUP_FILE # 4. Weryfikacja curl -I http://localhost:5000/health ``` ### Przywracanie z backupu dziennego ```bash # 1. Lista backupów dziennych ls -la /var/backups/nordabiz/daily/ # 2. Uruchom restore sudo /var/www/nordabiznes/scripts/dr-restore.sh /var/backups/nordabiz/daily/nordabiz_20260201.dump ``` ### Przywracanie z offsite (PBS) ```bash # 1. Skopiuj backup z PBS scp maciejpi@10.22.68.127:/backup/nordabiz/daily/nordabiz_20260201.dump /tmp/ # 2. Uruchom restore sudo /var/www/nordabiznes/scripts/dr-restore.sh /tmp/nordabiz_20260201.dump ``` ### Pełne odtworzenie systemu Wykonaj gdy VM jest całkowicie niedostępna lub skompromitowana. #### Krok 1: Przygotowanie nowej VM ```bash # Na Proxmox - utwórz VM: # - ID: 249 (lub nowy) # - CPU: 4 vCPU # - RAM: 8 GB # - Disk: 100 GB SSD # - Network: vmbr0 # - IP: 10.22.68.249/24 # - Gateway: 10.22.68.1 # - OS: Ubuntu 22.04 LTS ``` #### Krok 2: Instalacja pakietów ```bash sudo apt update && sudo apt upgrade -y sudo apt install -y python3 python3-venv python3-pip postgresql-14 git nginx rsync ``` #### Krok 3: Konfiguracja PostgreSQL ```bash sudo -u postgres createuser nordabiz_app sudo -u postgres createdb nordabiz -O nordabiz_app sudo -u postgres psql -c "ALTER USER nordabiz_app WITH PASSWORD 'NOWE_HASLO';" ``` #### Krok 4: Przywrócenie bazy z backup ```bash # Skopiuj backup z PBS scp maciejpi@10.22.68.127:/backup/nordabiz/daily/nordabiz_LATEST.dump /tmp/ # Restore sudo -u postgres pg_restore -d nordabiz -O --role=nordabiz_app /tmp/nordabiz_LATEST.dump # Nadaj uprawnienia sudo -u postgres psql -d nordabiz -c "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO nordabiz_app;" sudo -u postgres psql -d nordabiz -c "GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO nordabiz_app;" ``` #### Krok 5: Instalacja aplikacji ```bash sudo mkdir -p /var/www/nordabiznes sudo chown www-data:www-data /var/www/nordabiznes # Clone z Gitea sudo -u www-data git clone https://10.22.68.180:3000/maciejpi/nordabiz.git /var/www/nordabiznes # Virtualenv cd /var/www/nordabiznes sudo -u www-data python3 -m venv venv sudo -u www-data venv/bin/pip install -r requirements.txt ``` #### Krok 6: Przywrócenie konfiguracji ```bash # Skopiuj .env z backup scp maciejpi@10.22.68.127:/backup/nordabiz/config/latest/.env /var/www/nordabiznes/.env sudo chown www-data:www-data /var/www/nordabiznes/.env sudo chmod 600 /var/www/nordabiznes/.env # WAŻNE: Zaktualizuj DATABASE_URL w .env jeśli zmieniłeś hasło! ``` #### Krok 7: Konfiguracja systemd ```bash sudo cp /var/www/nordabiznes/docs/nordabiznes.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable nordabiznes sudo systemctl start nordabiznes ``` #### Krok 8: Weryfikacja ```bash # Status usługi sudo systemctl status nordabiznes # Health check curl -I http://localhost:5000/health # Logi sudo journalctl -u nordabiznes -f ``` #### Krok 9: Aktualizacja NPM (jeśli zmieniono IP) Jeśli nowa VM ma inny IP, zaktualizuj NPM: ```bash ssh maciejpi@10.22.68.250 # NPM Admin: http://10.22.68.250:81 # Proxy Host 27 → Forward Host: NOWE_IP, Port: 5000 ``` --- ## Testy DR ### Test kwartalny Wykonuj co kwartał: 1. **Przygotowanie:** - Utwórz testową VM w Proxmox - Skopiuj backup z PBS 2. **Wykonanie:** - Pełne odtworzenie zgodnie z procedurą - Zmierz czas (RTO) - Zweryfikuj działanie aplikacji 3. **Dokumentacja:** - Zapisz wyniki w `docs/DR-TEST-RESULTS.md` - Zaktualizuj procedury jeśli potrzeba ### Checklist testu DR - [ ] Backup istnieje i jest aktualny (< 1h) - [ ] Backup offsite zsynchronizowany (< 24h) - [ ] Skrypt dr-restore.sh działa - [ ] Aplikacja startuje po restore - [ ] Health check zwraca HTTP 200 - [ ] Dane są kompletne (sprawdź liczbę firm) - [ ] Chat AI działa (testowe pytanie) - [ ] Logowanie działa --- ## Kontakty i eskalacja ### Poziomy eskalacji | Poziom | Czas reakcji | Kto | |--------|--------------|-----| | L1 | < 15 min | Administrator (self-service) | | L2 | < 1h | Wsparcie techniczne | | L3 | < 4h | Eskalacja do dostawcy | ### Komendy diagnostyczne ```bash # Quick health check curl -I https://nordabiznes.pl/health # Sprawdź status usługi ssh maciejpi@10.22.68.249 "sudo systemctl status nordabiznes" # Sprawdź logi ssh maciejpi@10.22.68.249 "sudo journalctl -u nordabiznes -n 50" # Sprawdź NPM ssh maciejpi@10.22.68.250 "docker ps | grep nginx-proxy-manager" # Sprawdź port forwarding ssh maciejpi@10.22.68.250 "docker exec nginx-proxy-manager_app_1 sqlite3 /data/database.sqlite \"SELECT forward_port FROM proxy_host WHERE id = 27;\"" ``` --- ## Appendix: Komendy referencyjne ### Backup ```bash # Ręczny backup bazy sudo -u postgres pg_dump -Fc nordabiz > /tmp/backup_manual.dump # Backup konfiguracji sudo tar -czf /tmp/config_backup.tar.gz /var/www/nordabiznes/.env /etc/systemd/system/nordabiznes.service ``` ### Restore ```bash # Szybki restore (skrypt) sudo /var/www/nordabiznes/scripts/dr-restore.sh /var/backups/nordabiz/hourly/latest.dump # Ręczny restore sudo systemctl stop nordabiznes sudo -u postgres dropdb nordabiz sudo -u postgres createdb nordabiz -O nordabiz_app sudo -u postgres pg_restore -d nordabiz -O /tmp/backup.dump sudo systemctl start nordabiznes ``` ### Monitoring ```bash # Sprawdź rozmiar backupów du -sh /var/backups/nordabiz/* # Sprawdź ostatni backup ls -lt /var/backups/nordabiz/hourly/ | head -5 # Sprawdź cron cat /etc/cron.d/nordabiz-backup ``` --- **Dokument utrzymywany przez:** Zespół NordaBiz **Następny przegląd:** 2026-05-02