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.txtna raiz do repositório, com versões fixadas- Um servidor de produção (
uvicornougunicorn) listado norequirements.txt - Conta GitHub conectada à Zenifra
Gere o arquivo a partir do seu ambiente virtual:
pip freeze > requirements.txtUsa 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
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Olá da Zenifra"}
@app.get("/health")
def health():
return {"status": "ok"}fastapi==0.115.0
uvicorn[standard]==0.30.6| Campo | Valor |
|---|---|
| Runtime | Python 3.12 |
| Porta | 8000 |
build | vazio |
start | uvicorn 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 2Adicione 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
from flask import Flask
app = Flask(__name__)
@app.get("/")
def root():
return {"message": "Olá da Zenifra"}
@app.get("/health")
def health():
return {"status": "ok"}flask==3.0.3
gunicorn==23.0.0| Campo | Valor |
|---|---|
| Porta | 8000 |
build | vazio |
start | gunicorn 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 8000Com 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
| Sintoma | Correção |
|---|---|
ModuleNotFoundError | Pacote ausente no requirements.txt |
Error loading ASGI app | Caminho errado no start: o formato é arquivo:variavel, por exemplo main:app |
| URL pública não responde | Servidor em 127.0.0.1 ou porta diferente do campo Porta |
| Instância reinicia por falta de memória | Reduza --workers ou escolha um plano maior |
Redirecionamentos para http:// | Habilite os headers de proxy, como mostrado acima |
Próximos passos
Última atualização em
Sites estáticos e SPAs (Vite, React, Vue, Astro)
Publique sites estáticos e SPAs feitos com Vite, React, Vue, Angular ou Astro na Zenifra, pelo runtime Node.js ou por uma imagem NGINX oficial.
Publicar Django na Zenifra
Publique Django na Zenifra com gunicorn, arquivos estáticos via WhiteNoise, ALLOWED_HOSTS, CSRF, HTTPS atrás de proxy, migrations e banco gerenciado.