nordabiz/docs/DR-PLAYBOOK.md
Maciej Pienczyn 110d971dca
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
feat: migrate prod docs to OVH VPS + UTC→Warsaw timezone in all templates
Production moved from on-prem VM 249 (10.22.68.249) to OVH VPS
(57.128.200.27, inpi-vps-waw01). Updated ALL documentation, slash
commands, memory files, architecture docs, and deploy procedures.

Added |local_time Jinja filter (UTC→Europe/Warsaw) and converted
155 .strftime() calls across 71 templates so timestamps display
in Polish timezone regardless of server timezone.

Also includes: created_by_id tracking, abort import fix, ICS
calendar fix for missing end times, Pros Poland data cleanup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 13:41:53 +02:00

417 lines
11 KiB
Markdown

# NordaBiz Disaster Recovery Playbook
**Wersja:** 1.1
**Data utworzenia:** 2026-02-02
**Ostatnia aktualizacja:** 2026-04-04
> **UWAGA (2026-04-04):** Produkcja przeniesiona z OVH VPS inpi-vps-waw01 (VM 249, 57.128.200.27) na OVH VPS (57.128.200.27, hostname inpi-vps-waw01). Deploy via rsync (brak .git na serwerze). Migracje: `sudo -u postgres psql nordabiz`. .env jest root-owned, skrypty wymagają `sudo`.
---
## 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 (OVH VPS — inpi-vps-waw01)
```
/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 — TYLKO STAGING)
- **Lokalizacja:** Proxmox VE (hypervisor)
- **VM ID:** 248 (NORDABIZ-STAGING-01), 119 (R11-REVPROXY-01)
- **Storage:** local-lvm lub PBS
- **Dostęp:** Proxmox Web UI (https://10.22.68.10:8006)
- **UWAGA:** Produkcja nie jest na Proxmox — snapshoty dotyczą tylko staging i reverse proxy
---
## 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 serwera produkcyjnego (OVH VPS)
**Objawy:**
- Brak odpowiedzi SSH na 57.128.200.27
- HTTP 502 na https://nordabiznes.pl
**Procedura:**
#### Opcja A: Restart VPS via OVH Panel
1. Zaloguj się do OVH Manager: https://www.ovh.com/manager/
2. Znajdź VPS inpi-vps-waw01
3. Wykonaj reboot
4. Poczekaj 2-3 minuty
5. Zweryfikuj: `curl -I https://nordabiznes.pl/health`
#### Opcja B: Pełne odtworzenie (nowy VPS lub VM)
1. Utwórz nowy VPS w OVH lub VM w Proxmox
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), 60 min (opcja B)
---
### 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 nowego serwera
```bash
# Na OVH Manager - utwórz VPS lub na Proxmox - utwórz VM:
# - CPU: 4 vCPU
# - RAM: 8 GB
# - Disk: 100 GB SSD
# - OS: Ubuntu 22.04 LTS
# - Publiczny IP (jeśli OVH VPS) lub IP wewnętrzny (jeśli Proxmox)
```
#### 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 maciejpi:maciejpi /var/www/nordabiznes
# Sync z lokalnej maszyny deweloperskiej (brak .git na serwerze!)
rsync -avz --exclude='.git' --exclude='venv' --exclude='.env' \
/path/to/nordabiz/ maciejpi@57.128.200.27:/var/www/nordabiznes/
# Virtualenv
cd /var/www/nordabiznes
python3 -m venv venv
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 root:root /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 DNS (jeśli zmieniono IP)
Jeśli nowy serwer ma inny publiczny IP, zaktualizuj DNS w OVH:
```bash
# OVH Manager → nordabiznes.pl → DNS Zone → rekord A → NOWE_IP
# Produkcja na OVH VPS ma publiczny IP — ruch nie przechodzi przez NPM (10.22.68.250)
# NPM obsługuje tylko staging (staging.nordabiznes.pl)
```
---
## 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 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@57.128.200.27 "sudo systemctl status nordabiznes"
# Sprawdź logi
ssh maciejpi@57.128.200.27 "sudo journalctl -u nordabiznes -n 50"
# Sprawdź NPM (tylko staging)
ssh maciejpi@10.22.68.250 "docker ps | grep nginx-proxy-manager"
```
---
## 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