- Add 80+ company logo images (webp/svg) - Add membership_fees migration SQL - Add incident report doc - Update .gitignore for worktrees 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
284 lines
7.5 KiB
Markdown
284 lines
7.5 KiB
Markdown
# Raport Incydentu - nordabiznes.pl ERR_TOO_MANY_REDIRECTS
|
|
|
|
**Data incydentu:** 2026-01-02
|
|
**Czas wykrycia:** ~18:00 CET
|
|
**Czas rozwiązania:** ~18:30 CET
|
|
**Czas trwania:** ~30 minut
|
|
**Severity:** CRITICAL (portal niedostępny z zewnątrz)
|
|
**Status:** ROZWIĄZANY
|
|
|
|
---
|
|
|
|
## 1. OPIS PROBLEMU
|
|
|
|
### Objawy
|
|
- Portal https://nordabiznes.pl całkowicie niedostępny z zewnątrz
|
|
- Błąd w przeglądarce: `ERR_TOO_MANY_REDIRECTS` (zbyt wiele przekierowań)
|
|
- Dotyczyło WSZYSTKICH zewnętrznych użytkowników
|
|
- Dostęp z sieci wewnętrznej INPI działał poprawnie
|
|
|
|
### Zgłoszenie
|
|
Użytkownik zgłosił problem:
|
|
> "krytyczne!!! z zewnatrz nie dziala !!!"
|
|
> "To nie działa na nowym komputerze nowy test pierwszy raz i od razu jest taki błąd także to nie jest jakiś cash"
|
|
|
|
---
|
|
|
|
## 2. PRZYCZYNA GŁÓWNA (ROOT CAUSE)
|
|
|
|
### Błędna konfiguracja Nginx Proxy Manager (NPM)
|
|
|
|
**Proxy Host ID:** 27
|
|
**Domena:** nordabiznes.pl, www.nordabiznes.pl
|
|
|
|
**Problem:** NPM był skonfigurowany do przekazywania ruchu na **port 80** zamiast **port 5000**
|
|
|
|
```
|
|
BŁĘDNA KONFIGURACJA:
|
|
NPM (10.22.68.250) → Backend (10.22.68.249:80) ← ŹRÓDŁO PROBLEMU
|
|
|
|
PRAWIDŁOWA KONFIGURACJA:
|
|
NPM (10.22.68.250) → Backend (10.22.68.249:5000) ✓
|
|
```
|
|
|
|
### Dlaczego to powodowało pętlę przekierowań?
|
|
|
|
1. Na serwerze backend (10.22.68.249) działają DWA serwisy:
|
|
- **Port 80:** Nginx (system) - przekierowuje na HTTPS
|
|
- **Port 5000:** Flask/Gunicorn (aplikacja NordaBiznes)
|
|
|
|
2. Przepływ ruchu z błędną konfiguracją:
|
|
```
|
|
Użytkownik → https://nordabiznes.pl
|
|
↓
|
|
NPM (SSL termination) → http://10.22.68.249:80
|
|
↓
|
|
Nginx (port 80) → 301 redirect → https://nordabiznes.pl
|
|
↓
|
|
NPM (SSL termination) → http://10.22.68.249:80
|
|
↓
|
|
... PĘTLA NIESKOŃCZONA ...
|
|
```
|
|
|
|
3. Po 20 przekierowaniach przeglądarka przerywa z błędem `ERR_TOO_MANY_REDIRECTS`
|
|
|
|
---
|
|
|
|
## 3. DIAGNOZA
|
|
|
|
### Kroki diagnostyczne
|
|
|
|
1. **Sprawdzenie logów NPM:**
|
|
```bash
|
|
ssh maciejpi@10.22.68.250 "docker logs nginx-proxy-manager_app_1 --tail 50"
|
|
# Wynik: Wszystkie requesty zwracały 301 redirect
|
|
```
|
|
|
|
2. **Test bezpośredni na backend:**
|
|
```bash
|
|
# Test portu 80 (nginx systemowy)
|
|
curl -I http://10.22.68.249:80/
|
|
# Wynik: HTTP 301 → https://nordabiznes.pl/ ← PROBLEM!
|
|
|
|
# Test portu 5000 (Flask/Gunicorn)
|
|
curl -I http://10.22.68.249:5000/
|
|
# Wynik: HTTP 200 OK ← DZIAŁA!
|
|
```
|
|
|
|
3. **Sprawdzenie konfiguracji NPM:**
|
|
```bash
|
|
docker exec nginx-proxy-manager_app_1 sqlite3 /data/database.sqlite \
|
|
"SELECT forward_port FROM proxy_host WHERE id = 27;"
|
|
# Wynik: 80 ← BŁĘDNY PORT!
|
|
```
|
|
|
|
---
|
|
|
|
## 4. ROZWIĄZANIE
|
|
|
|
### Zmiana portu w NPM z 80 na 5000
|
|
|
|
**Metoda:** NPM API (PUT request)
|
|
|
|
```python
|
|
import requests
|
|
|
|
NPM_URL = "http://10.22.68.250:81/api"
|
|
# ... autentykacja ...
|
|
|
|
data = {
|
|
"domain_names": ["nordabiznes.pl", "www.nordabiznes.pl"],
|
|
"forward_scheme": "http",
|
|
"forward_host": "10.22.68.249",
|
|
"forward_port": 5000, # ZMIANA: 80 → 5000
|
|
"certificate_id": 27,
|
|
"ssl_forced": True,
|
|
"http2_support": True,
|
|
"block_exploits": True,
|
|
"allow_websocket_upgrade": True,
|
|
"hsts_enabled": True,
|
|
"hsts_subdomains": True
|
|
}
|
|
|
|
resp = requests.put(f"{NPM_URL}/nginx/proxy-hosts/27", headers=headers, json=data)
|
|
```
|
|
|
|
### Weryfikacja po naprawie
|
|
|
|
```bash
|
|
curl -I https://nordabiznes.pl/
|
|
# HTTP/2 200 ✓
|
|
# server: nginx/1.24.0 (Ubuntu)
|
|
# strict-transport-security: max-age=31536000; includeSubDomains
|
|
```
|
|
|
|
---
|
|
|
|
## 5. KIEDY I JAK POWSTAŁ PROBLEM?
|
|
|
|
### Analiza historii
|
|
|
|
1. **Pierwotna konfiguracja (2025-11-23):** Proxy utworzony z portem 5000 - POPRAWNIE
|
|
2. **Okres działania:** 2025-11-23 do ~2026-01-02 - portal działał poprawnie
|
|
3. **Zmiana konfiguracji:** Podczas dodawania maintenance mode lub innej modyfikacji NPM, port mógł zostać zmieniony na 80 (domyślny)
|
|
|
|
### Możliwe przyczyny zmiany portu:
|
|
|
|
1. **Edycja w NPM UI** - ktoś edytował proxy host i nie zwrócił uwagi na port
|
|
2. **Automatyczna zmiana** - NPM mógł zresetować do domyślnego portu 80 przy aktualizacji
|
|
3. **Maintenance mode** - konfiguracja maintenance mode mogła zmodyfikować inne ustawienia
|
|
|
|
### Lekcja na przyszłość:
|
|
> Port 5000 to niestandardowy port dla aplikacji Flask. Przy KAŻDEJ modyfikacji proxy hosta należy sprawdzić czy port jest poprawny!
|
|
|
|
---
|
|
|
|
## 6. ŚRODKI ZAPOBIEGAWCZE
|
|
|
|
### Natychmiastowe (wdrożone)
|
|
|
|
1. **Dokumentacja konfiguracji NPM:**
|
|
- Proxy Host 27: nordabiznes.pl → 10.22.68.249:**5000**
|
|
- Zapisane w tym raporcie incydentu
|
|
|
|
2. **Procedura weryfikacji po zmianach NPM:**
|
|
```bash
|
|
# Po KAŻDEJ zmianie w NPM sprawdź:
|
|
curl -I https://nordabiznes.pl/health
|
|
# Oczekiwany wynik: HTTP 200
|
|
```
|
|
|
|
### Długoterminowe (do wdrożenia)
|
|
|
|
1. **Monitoring zewnętrzny:**
|
|
- Dodać monitoring https://nordabiznes.pl do Zabbix
|
|
- Alert gdy HTTP != 200
|
|
- Sprawdzanie co 5 minut
|
|
|
|
2. **Backup konfiguracji NPM:**
|
|
```bash
|
|
# Regularny backup (raz dziennie)
|
|
docker cp nginx-proxy-manager_app_1:/data/database.sqlite /backup/npm/
|
|
```
|
|
|
|
3. **Checklist przy zmianach NPM:**
|
|
- [ ] Sprawdź forward_port (musi być 5000 dla nordabiznes.pl)
|
|
- [ ] Testuj z zewnętrznej sieci (telefon bez WiFi)
|
|
- [ ] Sprawdź health endpoint: /health
|
|
|
|
4. **Usunięcie zbędnego nginx na porcie 80:**
|
|
- Na serwerze 10.22.68.249 działa nginx na porcie 80 który tylko przekierowuje
|
|
- Rozważyć wyłączenie (NPM obsługuje SSL termination)
|
|
|
|
---
|
|
|
|
## 7. KLUCZOWE DANE TECHNICZNE
|
|
|
|
### Architektura
|
|
|
|
```
|
|
Internet
|
|
│
|
|
▼
|
|
[Fortigate 85.237.177.83] (NAT/Firewall)
|
|
│
|
|
▼ Port 443
|
|
[NPM R11-REVPROXY-01 10.22.68.250] (SSL Termination, Reverse Proxy)
|
|
│
|
|
▼ Port 5000 (HTTP)
|
|
[NORDABIZ-01 10.22.68.249] (Flask/Gunicorn Application)
|
|
│
|
|
▼
|
|
[PostgreSQL localhost:5432] (Database)
|
|
```
|
|
|
|
### Konfiguracja NPM (PRAWIDŁOWA)
|
|
|
|
| Parametr | Wartość |
|
|
|----------|---------|
|
|
| Proxy Host ID | 27 |
|
|
| Domeny | nordabiznes.pl, www.nordabiznes.pl |
|
|
| Backend IP | 10.22.68.249 |
|
|
| **Backend Port** | **5000** (NIE 80!) |
|
|
| SSL Certificate ID | 27 |
|
|
| SSL Forced | Yes |
|
|
| HTTP/2 | Yes |
|
|
| HSTS | Yes |
|
|
|
|
### Porty na backend server (10.22.68.249)
|
|
|
|
| Port | Serwis | Status |
|
|
|------|--------|--------|
|
|
| 22 | SSH | Aktywny |
|
|
| 80 | Nginx (redirect) | Aktywny (NIE UŻYWAĆ!) |
|
|
| 443 | Nginx (redirect) | Aktywny (NIE UŻYWAĆ!) |
|
|
| **5000** | **Gunicorn (Flask App)** | **WŁAŚCIWY PORT** |
|
|
| 5432 | PostgreSQL | Aktywny (tylko localhost) |
|
|
|
|
---
|
|
|
|
## 8. PODSUMOWANIE
|
|
|
|
| Aspekt | Wartość |
|
|
|--------|---------|
|
|
| Czas niedostępności | ~30 minut |
|
|
| Wpływ na użytkowników | 100% użytkowników zewnętrznych |
|
|
| Przyczyna główna | Błędny port w NPM (80 zamiast 5000) |
|
|
| Rozwiązanie | Zmiana portu na 5000 via NPM API |
|
|
| Status | ROZWIĄZANY |
|
|
| Ponowne wystąpienie | Mało prawdopodobne (monitoring do wdrożenia) |
|
|
|
|
---
|
|
|
|
## 9. ZAŁĄCZNIKI
|
|
|
|
### Polecenia diagnostyczne (do użycia w przyszłości)
|
|
|
|
```bash
|
|
# 1. Sprawdź status aplikacji
|
|
curl -I https://nordabiznes.pl/health
|
|
# Oczekiwany: HTTP 200
|
|
|
|
# 2. Sprawdź konfigurację NPM
|
|
ssh maciejpi@10.22.68.250 "docker exec nginx-proxy-manager_app_1 \
|
|
sqlite3 /data/database.sqlite \
|
|
\"SELECT id, domain_names, forward_host, forward_port FROM proxy_host WHERE id = 27;\""
|
|
# Oczekiwany: 27|["nordabiznes.pl","www.nordabiznes.pl"]|10.22.68.249|5000
|
|
|
|
# 3. Test bezpośredni na backend (z sieci INPI)
|
|
curl -I http://10.22.68.249:5000/health
|
|
# Oczekiwany: HTTP 200
|
|
|
|
# 4. Sprawdź logi NPM
|
|
ssh maciejpi@10.22.68.250 "docker logs nginx-proxy-manager_app_1 --tail 20"
|
|
|
|
# 5. Sprawdź status usługi
|
|
ssh maciejpi@10.22.68.249 "sudo systemctl status nordabiznes"
|
|
```
|
|
|
|
---
|
|
|
|
**Autor raportu:** Claude Code
|
|
**Data utworzenia:** 2026-01-02
|
|
**Wersja:** 1.0
|