Перенос: Python
Укажите в looma.yaml runtime: { kind: python, python: "3.12" }. Площадка ставит
зависимости из requirements.txt (или pip install . по pyproject.toml) и кладёт код
в /app. Если вы используете Poetry, Pipenv или uv, выгрузите зависимости в
requirements.txt (uv export --no-hashes -o requirements.txt,
poetry export -f requirements.txt) или соберите образ своим Dockerfile
(Dockerfile и docker-compose).
Запуск веба
Заголовок раздела «Запуск веба»Веб-процесс должен слушать 0.0.0.0 на порту $PORT. Команду запуска укажите в
processes.web.cmd: она выполняется через shell, поэтому $PORT раскрывается. Сервер
разработки (app.run(), runserver) замените на боевой.
| Фреймворк | cmd |
Зависимость |
|---|---|---|
| Flask | gunicorn app:app -b 0.0.0.0:$PORT --workers 2 --timeout 300 |
gunicorn |
| FastAPI, Starlette | uvicorn main:app --host 0.0.0.0 --port $PORT |
uvicorn |
| Django | python manage.py migrate --noinput && gunicorn proj.wsgi -b 0.0.0.0:$PORT |
gunicorn |
| aiohttp | python -m aiohttp.web -H 0.0.0.0 -P $PORT app:init или web.run_app(app, host="0.0.0.0", port=int(os.environ["PORT"])) |
не нужна |
свой if __name__ == "__main__" |
python app.py и в коде port=int(os.environ.get("PORT", 8080)), host="0.0.0.0" |
не нужна |
Модели могут отвечать долго. Таймаут воркера gunicorn (--timeout) должен быть больше
времени ответа модели. Для потоковых ответов используйте uvicorn или
gunicorn -k uvicorn.workers.UvicornWorker.
- В
ALLOWED_HOSTSдобавьте хост изLOOMA_APP_URL(или.apps.loomafloat.ru). - Если в сервисе есть формы, задайте
CSRF_TRUSTED_ORIGINS = [os.environ["LOOMA_APP_URL"]]. - Базу подключите через
dj-database-urlизDATABASE_URL(Данные). - Статику отдавайте через
whitenoise: задайтеSTATIC_ROOTи выполнитеcollectstaticвcmdперед запуском или при сборке. - Медиа храните в бакете через
django-storages(Данные). SECRET_KEYиDEBUGчитайте из переменных окружения.SECRET_KEYзадайте секретом,DEBUGпо умолчанию держитеFalse.- HTTPS обеспечивает шлюз, поэтому задайте
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https").
Фоновые задачи
Заголовок раздела «Фоновые задачи»- Celery или RQ с Redis замените очередью в Postgres (
procrastinate) и процессомworker(Данные). Если задачи короткие и редкие, выполняйте их в потоке веб-процесса, а состояние храните в базе. APSchedulerилиscheduleвнутри веба замените процессом по расписанию:nightly: { schedule: "0 3 * * *", cmd: "python -m app.nightly" }(время в UTC). Веб сmin: 0засыпает, и планировщик внутри него не сработает.
В OpenAI SDK укажите адрес $LOOMA_API_URL (он уже оканчивается на /v1) и ключ $LOOMA_APP_TOKEN или
используйте SDK loomafloat (Модели). requests, httpx, urllib и
boto3 берут прокси из окружения сами. aiohttp этого не делает: создавайте сессию
как aiohttp.ClientSession(trust_env=True).
Gradio, Streamlit, Chainlit
Заголовок раздела «Gradio, Streamlit, Chainlit»Streamlit работает через WebSocket, а шлюз WebSocket не пропускает. Интерфейс придётся переписать на обычный веб: FastAPI или Flask и простая страница, поток текста через SSE. Chainlit тоже работает через WebSocket, путь для него тот же.
Gradio проверьте на staging: выполните looma check, затем откройте адрес staging и
пройдите интерфейс. Если интерфейс не отвечает, перепишите его так же, как Streamlit.
Типичный набор правок
Заголовок раздела «Типичный набор правок»- В
requirements.txtдобавьтеgunicornилиuvicorn, драйвер Postgres иboto3. Уберитеtorch,transformersи прочее, если модели переехали в сеть Looma Float. - Слушайте
0.0.0.0на порту изPORT. - Базу подключите по
DATABASE_URL, файлы храните в бакете. - Модели вызывайте по API сети Looma Float.
- Добавьте
looma.yamlи.loomaignore.