¿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.
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.
{
"deploy": {
"startCommand": "uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-8080}"
}
}| Framework | Se detecta cuando | Comando de arranque |
|---|---|---|
| FastAPI | fastapi y uvicorn son dependencias y el objeto app está en main.py, en la raíz | uvicorn main:app --host 0.0.0.0 --port ${PORT:-8000} |
| Flask | gunicorn es una dependencia y el objeto app está en main.py, en la raíz | gunicorn --bind 0.0.0.0:${PORT:-8000} main:app |
| Django | manage.py está en la raíz y django es una dependencia; añade también gunicorn | python manage.py migrate && gunicorn --bind 0.0.0.0:${PORT:-8000} <proyecto>.wsgi:application |
| Cualquier otra | Tu propia estructura, p. ej. app/main.py | El 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.
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.
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.
