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

11 KiB

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
  2. Lokalizacje backupów
  3. Scenariusze awarii
  4. Procedury odtwarzania
  5. Testy DR
  6. 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:

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

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):
    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
  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:

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:
    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

# 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

# 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)

# 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

# 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

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

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

# 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

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

# 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

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

# 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:

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

# 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

# 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

# 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

# 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