Guía por framework

Cómo desplegar una app de Python: FastAPI, Django o Flask

Para desplegar una app de FastAPI, Django o Flask en Codara Cloud, sube un requirements.txt o un pyproject.toml, haz que el servidor escuche en 0.0.0.0 y en la variable PORT, y crea una app desde el repositorio de GitHub. Codara la construye con Railpack, que detecta las estructuras habituales y arranca uvicorn o gunicorn por ti. Para cualquier otra estructura, define el comando de arranque en un archivo railpack.json.

Por Codara Solutions · Revisada el

¿Qué necesita Codara de un proyecto de Python?

Un archivo de dependencias en la raíz del repositorio: requirements.txt, pyproject.toml o un Pipfile. Un uv.lock o un poetry.lock junto a pyproject.toml hace que Railpack instale con uv o con Poetry. Fija la versión de Python en un archivo .python-version.

Tu servidor web debe escuchar en todas las interfaces y en el puerto de la variable de entorno PORT, que define Codara (8080 salvo que elijas otro puerto). uvicorn necesita --host 0.0.0.0 --port $PORT. gunicorn escucha en 0.0.0.0:$PORT por sí solo cuando PORT está definida.

.python-version
3.12

¿Qué comando de arranque usa Codara?

Railpack reconoce tres estructuras habituales y escribe él mismo el comando de arranque. Para cualquier otra, añade en la raíz un archivo railpack.json con tu propio comando; tiene prioridad sobre el detectado.

railpack.json · app de FastAPI en app/main.py
{
  "deploy": {
    "startCommand": "uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-8080}"
  }
}
Comandos de arranque que detecta Railpack, y cuándo
FrameworkSe detecta cuandoComando de arranque
FastAPIfastapi y uvicorn son dependencias y el objeto app está en main.py, en la raízuvicorn main:app --host 0.0.0.0 --port ${PORT:-8000}
Flaskgunicorn es una dependencia y el objeto app está en main.py, en la raízgunicorn --bind 0.0.0.0:${PORT:-8000} main:app
Djangomanage.py está en la raíz y django es una dependencia; añade también gunicornpython manage.py migrate && gunicorn --bind 0.0.0.0:${PORT:-8000} <proyecto>.wsgi:application
Cualquier otraTu propia estructura, p. ej. app/main.pyEl deploy.startCommand de railpack.json

¿Cómo creas la app?

Instala la GitHub App de Codara en la cuenta propietaria del repositorio y crea un proyecto. En la consola, abre Apps → New app, elige el proyecto y el entorno, selecciona GitHub repository y la rama, y envía. El asistente crea la app y lanza su primer build; cada push posterior a la rama vuelve a desplegar. Define una ruta de health check, como /health, en los ajustes de la app.

Terminal · lo mismo desde la CLI
codaracloud apps create api --client my-workspace --project research \
  --repo acme/research-api --branch main
codaracloud deploy api --client my-workspace --project research --source

codaracloud logs api --follow

¿Cómo conectas Postgres y ejecutas las migraciones?

Crea una base de datos Postgres en el mismo entorno y conéctala a la app: Codara inyecta DATABASE_URL y DATABASE_DIRECT_URL y reinicia la app. Lee la URL de conexión de DATABASE_URL en tu código; en Django, dj-database-url lo hace por ti.

Ejecuta las migraciones como comando previo al despliegue de la app, por ejemplo alembic upgrade head o python manage.py migrate. Se ejecuta una vez en la imagen nueva antes de mover el tráfico, y si falla, la versión actual sigue sirviendo. El comando por defecto de Railpack para Django también ejecuta migrate cada vez que arranca un contenedor; si prefieres migrar solo en el comando previo al despliegue, define tu propio comando de arranque en railpack.json.

settings.py · Django
import os
import dj_database_url

DATABASES = {"default": dj_database_url.config(conn_max_age=600)}
ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "").split(",")
CSRF_TRUSTED_ORIGINS = [f"https://{h}" for h in ALLOWED_HOSTS if h]

Define ALLOWED_HOSTS con tu dominio codara.cloud y tu propio dominio como variable de ejecución, y SECRET_KEY como secreto. Para los archivos estáticos, WhiteNoise es la opción habitual con un solo contenedor: ejecuta python manage.py collectstatic --noinput en tu comando de arranque antes de gunicorn.

¿Dónde van los workers de Celery y las tareas programadas?

Un worker de Celery o RQ es un servicio aparte en el mismo entorno, construido desde el mismo repositorio con su propio comando de arranque. Codara también ofrece Redis gestionado para el broker. El trabajo programado, como un informe nocturno o un script de limpieza, va en un job de Codara con una expresión cron, no en un bucle dentro del proceso web.

Preguntas

¿Necesito un Dockerfile para una app de Python?
No. Railpack construye apps de Python desde requirements.txt, pyproject.toml o un Pipfile. Añade un Dockerfile solo si necesitas bibliotecas del sistema o tu propia imagen base; Codara lo usa entonces tal cual.
¿Por qué mi app funciona en local y no en Codara?
Normalmente porque el servidor escucha en 127.0.0.1 o en un puerto fijo. Escucha en 0.0.0.0 y en la variable PORT, y revisa los logs de la app después de publicar.
¿Puedo usar uv o Poetry?
Sí. Con pyproject.toml, un uv.lock hace que Railpack instale con uv, y un poetry.lock, con Poetry.

Sigue leyendo