Add Flask Nubes howto doc

This commit is contained in:
2026-07-23 11:43:12 +04:00
parent 7998d15da6
commit a0267b22f6
+124
View File
@@ -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` |