docs: Add safe deployment methodology after production incident

- Document incident 2026-01-31 (alias failure)
- New rule: Use full blueprint names, NOT aliases
- New procedure: Update templates BEFORE moving routes
- Enhanced checklist: Test page rendering, not just HTTP status

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-01-31 08:29:24 +01:00
parent 67d35c5d61
commit e116eeadc6

View File

@ -224,20 +224,77 @@ curl -sI https://nordabiznes.pl/release-notes | head -1
---
## Metodologia Bezpiecznego Wdrażania (OBOWIĄZKOWA)
> **INCYDENT 2026-01-31:** Awaria produkcji spowodowana niedziałającymi aliasami.
> Szablony używały `url_for('admin_seo')` ale alias nie został utworzony.
### Zasady PRZED przeniesieniem trasy do blueprintu
1. **NAJPIERW zaktualizuj szablony** - zmień `url_for('stara_nazwa')` na `url_for('blueprint.endpoint')`
2. **Wdróż zmianę szablonów** - przetestuj na produkcji
3. **DOPIERO POTEM** przenieś trasę do blueprintu
### Zasada: Pełne nazwy blueprintów (NIE aliasy)
```python
# ❌ BŁĘDNIE - aliasy są zawodne
url_for('admin_seo')
# ✅ PRAWIDŁOWO - pełna nazwa blueprintu
url_for('admin.admin_seo')
```
**Dlaczego:** Aliasy mogą nie działać dla tras w oddzielnych plikach. Pełne nazwy są jawne i niezawodne.
### Checklist PRZED każdym deploy
```bash
# 1. Test importu
python3 -c "from app import app; print('OK')"
# 2. Test renderowania strony głównej (NIE tylko status!)
curl -s https://localhost:5000/ | head -50
# 3. Test url_for dla przeniesionych endpointów
python3 -c "
from app import app
from flask import url_for
with app.test_request_context():
print(url_for('admin.admin_seo')) # Musi działać
"
# 4. Dopiero po pozytywnych testach - deploy na PROD
```
### Procedura przenoszenia trasy (NOWA)
1. **Audit szablonów** - znajdź wszystkie `url_for('nazwa_trasy')` w templates/
2. **Zaktualizuj szablony** - zmień na `url_for('blueprint.nazwa_trasy')`
3. **Wdróż szablony** - commit, push, deploy, test PROD
4. **Utwórz trasę w blueprincie** - skopiuj kod do blueprints/
5. **Skomentuj trasę w app.py** - prefix `_old_`
6. **Test lokalny** - import + renderowanie stron
7. **Deploy** - commit, push, deploy
8. **Test PROD** - sprawdź czy strony się renderują
9. **Cleanup** - usuń martwy kod z app.py
---
## Lekcje na przyszłość
1. **url_for w blueprintach:**
1. **url_for w szablonach:**
- **ZAWSZE używaj pełnych nazw:** `url_for('blueprint.endpoint')`
- **NIE polegaj na aliasach** - są zawodne
- Wewnątrz blueprintu: `url_for('.endpoint')` (z kropką)
- W szablonach: `url_for('blueprint.endpoint')` (pełna nazwa)
- Aliasy: `url_for('stara_nazwa')` = `url_for('blueprint.nowa_nazwa')`
2. **Kolejność operacji:**
- Najpierw blueprinty + aliasy
- Potem dezaktywacja duplikatów
- **NAJPIERW szablony** - zaktualizuj url_for
- Potem blueprinty
- Cleanup dopiero po teście PROD
3. **Bezpieczeństwo:**
- Zawsze zachowuj martwy kod do weryfikacji
- Zawsze testuj renderowanie stron, nie tylko status HTTP
- Prefix `_old_` dla zdezaktywowanych funkcji
- Rollback: odkomentuj `@app.route`