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>
426 lines
10 KiB
Markdown
426 lines
10 KiB
Markdown
# 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
|