Backend API — custodiam-api¶
Backend REST con FastAPI + SQLModel + PostgreSQL + Keycloak, gestionado con uv como package manager moderno.
Decisiones arquitectónicas relevantes
- ADR-026 — uv como package manager: el repo migró de
pip + venv + requirements.txtauv + pyproject.toml + uv.lock. - ADR-002 — SQLModel unifica SQLAlchemy 2.0 + Pydantic en un solo modelo.
- ADR-008 — psycopg3 como driver PostgreSQL (URL
postgresql+psycopg://...). - ADR-010 — PyJWT[crypto] para validación local de JWT emitidos por Keycloak.
Requisitos¶
uv0.9+ instalado (instrucciones aquí)- PostgreSQL accesible (lo más cómodo es arrancarlo vía Docker Compose desde
custodiam-infra, ver recorrido infra) - Keycloak accesible (idem, viene en el stack de
custodiam-infra)
Clonar y arrancar¶
git clone https://github.com/custodiam/custodiam-api.git
cd custodiam-api
# uv descarga Python 3.13 automáticamente si no está disponible.
uv sync --all-extras
# Configura las variables de entorno (DATABASE_URL, KEYCLOAK_URL, etc.)
cp .env.example .env
# Edita .env con valores reales o los del docker-compose del repo infra.
# Aplica migraciones de BD
uv run alembic upgrade head
# Arranca el servidor de desarrollo con hot reload
uv run uvicorn app.main:app --reload --port 8000
Abre http://localhost:8000/docs para acceder a la documentación Swagger UI interactiva de la API.
Comandos esenciales¶
# Sincronizar deps con el lockfile (idempotente)
uv sync --all-extras
# Ejecutar tests
uv run pytest tests/ -v
uv run pytest --cov=app --cov-report=term-missing
# Linter y formato
uv run ruff check app/ tests/
uv run ruff check --fix app/ tests/
uv run ruff format app/ tests/
# Migraciones Alembic
uv run alembic revision --autogenerate -m "descripción"
uv run alembic upgrade head
uv run alembic downgrade -1
uv run alembic current
# Añadir una dependencia nueva (actualiza pyproject.toml + uv.lock)
uv add nombre-paquete # runtime
uv add --dev nombre-paquete # extras dev
Gotcha — VIRTUAL_ENV heredado
Si tu terminal hereda VIRTUAL_ENV=... de otro venv padre (por ejemplo, de un proyecto Python distinto que tenías abierto), uv lo respeta por defecto y NO usa el .venv/ local del repo. Solución: unset VIRTUAL_ENV antes del primer uv sync en una terminal nueva.
Variables de entorno relevantes¶
| Variable | Valor por defecto (dev) | Descripción |
|---|---|---|
DATABASE_URL |
postgresql+psycopg://custodiam:password@localhost:5432/custodiam |
URL de PostgreSQL. Prefijo +psycopg es obligatorio (psycopg3, no psycopg2). |
KEYCLOAK_URL |
http://localhost:8080 |
URL base de Keycloak |
KEYCLOAK_REALM |
custodiam |
Nombre del realm |
DEBUG |
false |
Activa CORS abierto + logging extra |
Estructura del repo¶
custodiam-api/
├── app/
│ ├── core/ # config, database, security, permissions
│ ├── models/ # SQLModel (tabla=True)
│ ├── schemas/ # Pydantic para API
│ ├── routers/ # Endpoints REST agrupados
│ └── services/ # Lógica de negocio
├── alembic/
│ ├── versions/ # Migraciones generadas
│ └── env.py # Carga .env antes de leer DATABASE_URL
├── tests/ # pytest con fixtures de cliente autenticado
├── .github/workflows/
│ └── ci.yml # CI con astral-sh/setup-uv@v3
├── pyproject.toml # [project] PEP 621 + ruff + pytest config
├── uv.lock # Lockfile reproducible
└── Dockerfile # Multi-stage con ghcr.io/astral-sh/uv builder
Siguientes pasos¶
- Para tener BD + Keycloak + ntfy corriendo a la vez, ve al recorrido Infraestructura completa.
- Para entender el modelo de datos y las decisiones de diseño, revisa Arquitectura y ADRs.