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ść
|
## 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ą)
|
- 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:**
|
2. **Kolejność operacji:**
|
||||||
- Najpierw blueprinty + aliasy
|
- **NAJPIERW szablony** - zaktualizuj url_for
|
||||||
- Potem dezaktywacja duplikatów
|
- Potem blueprinty
|
||||||
- Cleanup dopiero po teście PROD
|
- Cleanup dopiero po teście PROD
|
||||||
|
|
||||||
3. **Bezpieczeństwo:**
|
3. **Bezpieczeństwo:**
|
||||||
- Zawsze zachowuj martwy kod do weryfikacji
|
- Zawsze testuj renderowanie stron, nie tylko status HTTP
|
||||||
- Prefix `_old_` dla zdezaktywowanych funkcji
|
- Prefix `_old_` dla zdezaktywowanych funkcji
|
||||||
- Rollback: odkomentuj `@app.route`
|
- Rollback: odkomentuj `@app.route`
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user