Add Flask Nubes howto doc
This commit is contained in:
@@ -0,0 +1,124 @@
|
|||||||
|
# Как писать Flask-приложение для Nubes
|
||||||
|
|
||||||
|
## Структура папок (ОБЯЗАТЕЛЬНО)
|
||||||
|
|
||||||
|
```
|
||||||
|
repo/
|
||||||
|
├── requirements.txt
|
||||||
|
└── site/
|
||||||
|
├── app.py # точка входа
|
||||||
|
├── static/
|
||||||
|
│ └── style.css
|
||||||
|
└── templates/
|
||||||
|
└── index.html
|
||||||
|
```
|
||||||
|
|
||||||
|
**БЕЗ `site/` папки — НЕ ЗАПУСТИТСЯ.** Платформа ждёт именно `site/app.py`.
|
||||||
|
|
||||||
|
## app.py — точка входа
|
||||||
|
|
||||||
|
### Минимальный рабочий вариант:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from flask import Flask, render_template
|
||||||
|
|
||||||
|
app = Flask(__name__, template_folder="templates", static_folder="static")
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def index():
|
||||||
|
return render_template("index.html")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(debug=True, host="0.0.0.0", port=5000)
|
||||||
|
```
|
||||||
|
|
||||||
|
### КЛЮЧЕВЫЕ МОМЕНТЫ:
|
||||||
|
|
||||||
|
1. **`if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)` — ОБЯЗАТЕЛЬНО!**
|
||||||
|
Платформа запускает `python site/app.py`. Без `app.run()` скрипт определит `app` и выйдет — контейнер упадёт.
|
||||||
|
|
||||||
|
2. **`template_folder="templates"`, `static_folder="static"` — указывать явно.**
|
||||||
|
Без них Flask может не найти шаблоны при запуске из корня репо.
|
||||||
|
|
||||||
|
3. **`debug=True`** — как в рабочем шаблоне. На проде заменить на `False`.
|
||||||
|
|
||||||
|
## Модули (если нужно)
|
||||||
|
|
||||||
|
Можно дробить на модули внутри `site/`:
|
||||||
|
|
||||||
|
```
|
||||||
|
site/
|
||||||
|
├── app.py
|
||||||
|
├── api/
|
||||||
|
│ └── http_client.py
|
||||||
|
├── operations/
|
||||||
|
│ └── get_instances.py
|
||||||
|
├── routes/
|
||||||
|
│ └── main.py
|
||||||
|
├── static/
|
||||||
|
└── templates/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Импорты внутри site/:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# app.py
|
||||||
|
from routes.main import bp as main_bp
|
||||||
|
app.register_blueprint(main_bp)
|
||||||
|
```
|
||||||
|
|
||||||
|
```python
|
||||||
|
# routes/main.py
|
||||||
|
from api.http_client import HttpClient
|
||||||
|
from operations.get_instances import get_organization
|
||||||
|
```
|
||||||
|
|
||||||
|
**НЕ НУЖЕН `sys.path.insert`!** При запуске `python site/app.py` Python сам добавляет `site/` в `sys.path[0]`.
|
||||||
|
|
||||||
|
### ⛔ НЕЛЬЗЯ:
|
||||||
|
|
||||||
|
- **`site/__init__.py`** — удалить! Конфликтует со stdlib `site.py`, ломает импорты.
|
||||||
|
- **`from site.xxx import ...`** — никогда. Импорт всегда без префикса `site.`
|
||||||
|
- **Factory pattern (`create_app()`)** — платформа ждёт `app` на уровне модуля.
|
||||||
|
|
||||||
|
## requirements.txt
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Flask>=3.0
|
||||||
|
gunicorn>=21.2
|
||||||
|
requests>=2.31
|
||||||
|
```
|
||||||
|
|
||||||
|
## Переменные окружения (jsonEnv в параметрах сервиса)
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"NUBES_API_TOKEN": "...",
|
||||||
|
"NUBES_API_ENDPOINT": "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
В коде читать через `os.getenv("NUBES_API_TOKEN", "")`.
|
||||||
|
|
||||||
|
## Деплой
|
||||||
|
|
||||||
|
- `gitPath`: URL репозитория
|
||||||
|
- `jsonEnv`: переменные окружения
|
||||||
|
- `healthPath`: можно оставить `""`
|
||||||
|
|
||||||
|
## Отладка
|
||||||
|
|
||||||
|
Если под не стартует — смотреть логи в кубере:
|
||||||
|
```bash
|
||||||
|
kubectl -n <instanceUid> logs deploy/pythonk8s --tail=50
|
||||||
|
kubectl -n <instanceUid> get pods
|
||||||
|
```
|
||||||
|
|
||||||
|
## Частые ошибки
|
||||||
|
|
||||||
|
| Ошибка | Причина | Решение |
|
||||||
|
|--------|---------|---------|
|
||||||
|
| Под Completed, рестарты | Нет `app.run()` | Добавить `if __name__ == "__main__": app.run(...)` |
|
||||||
|
| ModuleNotFoundError | Есть `site/__init__.py` | Удалить `site/__init__.py` |
|
||||||
|
| 500 на / | API недоступен или токен неверный | Обернуть в try/except |
|
||||||
|
| Нет папки site/ | Другая структура | Всегда `site/app.py` |
|
||||||
Reference in New Issue
Block a user