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:
parent
67d35c5d61
commit
e116eeadc6
@ -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`
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user