Guias por framework

Python com FastAPI e Flask

APIs Python são publicadas pelo Repositório GitHub com o runtime Python (3.11, 3.12 ou 3.13). A Zenifra instala as dependências com pip install -r requirements.txt e inicia a aplicação com o comando start.

Pré-requisitos

  • requirements.txt na raiz do repositório, com versões fixadas
  • Um servidor de produção (uvicorn ou gunicorn) listado no requirements.txt
  • Conta GitHub conectada à Zenifra

Gere o arquivo a partir do seu ambiente virtual:

pip freeze > requirements.txt

Usa Poetry ou uv? Exporte para requirements.txt antes de versionar: poetry export -f requirements.txt --output requirements.txt ou uv export --format requirements-txt > requirements.txt.

Bibliotecas com extensões nativas

O ambiente de build já inclui compilador C e as bibliotecas do cliente PostgreSQL, então pacotes como psycopg2 instalam sem passos extras. Prefira psycopg[binary] ou psycopg2-binary quando quiser builds mais rápidas.

FastAPI

main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
    return {"message": "Olá da Zenifra"}

@app.get("/health")
def health():
    return {"status": "ok"}
requirements.txt
fastapi==0.115.0
uvicorn[standard]==0.30.6
CampoValor
RuntimePython 3.12
Porta8000
buildvazio
startuvicorn main:app --host 0.0.0.0 --port 8000

Para usar mais de um processo por instância, rode o uvicorn com workers do gunicorn:

start: gunicorn main:app -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000 --workers 2

Adicione gunicorn ao requirements.txt. Comece com 2 workers e ajuste conforme a memória do plano: cada worker carrega uma cópia da aplicação.

Atrás do proxy HTTPS

A Zenifra encerra o HTTPS antes de encaminhar a requisição. Para que URLs geradas pelo FastAPI usem https, adicione --proxy-headers --forwarded-allow-ips="*" ao uvicorn.

Flask

app.py
from flask import Flask

app = Flask(__name__)

@app.get("/")
def root():
    return {"message": "Olá da Zenifra"}

@app.get("/health")
def health():
    return {"status": "ok"}
requirements.txt
flask==3.0.3
gunicorn==23.0.0
CampoValor
Porta8000
buildvazio
startgunicorn app:app --bind 0.0.0.0:8000 --workers 2

Não use flask run em produção

flask run e app.run() iniciam o servidor de desenvolvimento, que não aguenta carga real e, por padrão, escuta só em 127.0.0.1. Use gunicorn.

Se a aplicação usa o padrão application factory, aponte para a função: gunicorn "app:create_app()" --bind 0.0.0.0:8000.

Migrations com Alembic

As variáveis do projeto, incluindo DATABASE_URL, existem na execução. Aplique as migrations antes de iniciar o servidor:

start: alembic upgrade head && uvicorn main:app --host 0.0.0.0 --port 8000

Com Flask-Migrate, use flask db upgrade && gunicorn app:app --bind 0.0.0.0:8000.

Logs

Tudo o que a aplicação escreve em stdout e stderr aparece nos logs do projeto. A saída do Python já é enviada sem buffer, então print() e logging aparecem na hora. Para logs de acesso do gunicorn, adicione --access-logfile -.

Projetos com pyproject.toml

Se o repositório tem pyproject.toml ou setup.py, o pacote também é instalado depois da build. Mesmo assim, mantenha o requirements.txt com todas as dependências de execução.

Problemas comuns

SintomaCorreção
ModuleNotFoundErrorPacote ausente no requirements.txt
Error loading ASGI appCaminho errado no start: o formato é arquivo:variavel, por exemplo main:app
URL pública não respondeServidor em 127.0.0.1 ou porta diferente do campo Porta
Instância reinicia por falta de memóriaReduza --workers ou escolha um plano maior
Redirecionamentos para http://Habilite os headers de proxy, como mostrado acima

Próximos passos

Última atualização em

Nessa página