API backend de LleidaHack construida con FastAPI, SQLAlchemy y Alembic.
- Python 3.12+
- uv
- PostgreSQL (local o remoto)
- Redis compartido para limitar peticiones (ver configuración)
Desde la raíz del proyecto:
uv sync --frozen
cp .env.example .envEdita .env y configura al menos:
DATABASE__URL=postgresql://usuario:password@host:5432/base_de_datos
SECURITY__SECRET_KEY=tu-secret-key
SECURITY__SERVICE_TOKEN=tu-service-token
CLIENTS__MAIL_CLIENT__URL=http://mail:8000/
RATE_LIMIT__REDIS_URL=redis://127.0.0.1:6379/0Notas:
- Sustituye los secretos de ejemplo por valores aleatorios independientes de al menos 32 caracteres.
- Redis debe estar disponible: sin él, el backend rechaza temporalmente las peticiones con 503.
DATABASE__URLes obligatorio en entornoENV=main.- Para integración usa
ENV=integrationy configura tambiénDATABASE__URL.
Aplica todas las migraciones:
uv run --env-file .env alembic upgrade headPara el entorno de pruebas aislado con PostgreSQL, Redis y correo capturado (requiere Docker):
uv run python install/local.pyModo desarrollo (autoreload), con los servicios ya configurados:
uv run --env-file .env uvicorn main:app --host 127.0.0.1 --port 8000 --reloadModo similar a producción (Gunicorn + Uvicorn workers):
uv run --env-file .env gunicorn main:app -c gunicorn_conf.py- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
- OpenAPI: http://localhost:8000/openapi.json
El Dockerfile ya instala dependencias, ejecuta migraciones y levanta Gunicorn.
docker build -t lleidahack-backend .
docker run --rm -p 127.0.0.1:8000:8000 --env-file .env lleidahack-backendAsegúrate de que la DATABASE__URL del .env sea accesible desde el contenedor.
Crear nueva migración:
uv run --env-file .env alembic revision --autogenerate -m "descripcion_del_cambio"Aplicar migraciones pendientes:
uv run --env-file .env alembic upgrade headRevertir última migración:
uv run --env-file .env alembic downgrade -1- Error de
DATABASE__URLfaltante: revisa.envy que estés ejecutando en la raíz del repo. - Error de conexión a BD: valida host, puerto, usuario, password y permisos.
- Fallo con
uv: instalauvo usa Python 3.12 con entorno virtual y pip (no recomendado en este repo porque existeuv.lock).
La imagen empaqueta este checkout, se ejecuta sin root y no incluye archivos de secretos. Configura CORS_ORIGINS con los orígenes exactos del frontend. Ver revisión de seguridad.