Despliegue y operación técnica¶
1. Variables de entorno¶
- Duplica
.env.example(si existe) o usa.envcomo base. Los campos importantes provienen deapp/core/settings.py: POSTGRES_*,REDIS_*,MONGODB_*SECRET_KEY,ACCESS_TOKEN_EXPIRE- Credenciales de superusuario (
SUPERUSER_*) para semillas iniciales. DOMAINpara definir cookies y URLs (domain_url,domain_auth_url).- Credenciales SMTP si deseas enviar correos (
smtp_host,smtp_user, etc.). - Revisa también las variables propias del frontend (
frontend/.env.localsi aplica) comoNEXT_PUBLIC_API_URL.
2. Servicios en Docker Compose¶
docker-compose.yml define seis contenedores:
| Servicio | Imagen / Build | Puerto | Rol |
|---|---|---|---|
db |
postgres:16 |
5433→5432 | Base de datos principal; inicializa con PGDATA separado y healthcheck pg_isready. |
redis |
redis:7 |
6379 | Cache de sesiones (get_current_user) y backend de Huey (jobs:*). Se configura con appendonly yes. |
backend |
Build ./app/Dockerfile |
expone 8000 | FastAPI + Uvicorn. Monta ./app para desarrollo en caliente. Requiere db (healthy) y redis. |
huey |
Misma imagen del backend | — | Ejecuta huey_consumer.py apuntando a app.huey_task.huey. Necesita DB y Redis. |
frontend |
Build ./frontend/Dockerfile |
expone 3000 | Next.js con modo watch habilitado (WATCHPACK, CHOKIDAR). Monta el código y cachea node_modules. |
nginx |
nginx:1.27-alpine |
80 | Reverse proxy para frontend/backend. Config definido en nginx/nginx.conf. Útil para entornos locales integrados. |
Cada servicio tiene límites de memoria (mem_limit, mem_reservation) para evitar que Docker Desktop se sature.
Levantar todo¶
La primera vez tarda un poco por instalación de dependencias. Usa -d si quieres correr en background.
3. Migraciones Alembic¶
- Entra al contenedor backend:
app/alembic/env.py lee settings.database_uri, así que no necesitas editar alembic.ini.
- Generar nuevas migraciones:
Asegúrate de que todos los modelos estén importados en app/models/__init__.py para que Alembic detecte los cambios.
4. Datos iniciales¶
- Al iniciar FastAPI se ejecuta
init_db(session)(app/scripts/init_db.py) vía lifespan, creando rolsuperuser, acceso('*', '*')y la cuenta base si no existían. - Si trabajas con entornos limpios, basta con levantar el backend una vez después de migrar.
5. Workers Huey¶
- El servicio
hueydel compose arranca automáticamente (huey_consumer.py app.huey_task.huey -w 2 -k thread). - Si prefieres correrlo manualmente (por ejemplo en desarrollo con backend fuera de Docker):
GET-ChildItem app\huey_task.py # asegura el módulo en PYTHONPATH
poetry run huey_consumer.py app.huey_task.huey -w 2 -k thread
(ajusta según tu gestor de dependencias).
6. Tareas de mantenimiento¶
- Backups cifrados: Usa
/api/admin/database(ver guía de usuario). Si lo haces desde CLI:
(puedes crear un script adicional si lo requieres).
-
Logs: Los archivos JSON se guardan en
app/logs/app.json.logcon rotación diaria. Monta el directorio en Docker o enrútalo a un volumen si quieres persistencia. -
Redis: Si necesitas limpiar locks o sesiones, puedes ejecutar:
Hazlo sólo en desarrollo; en producción evita borrar trabajos en curso.
7. CI/CD sugerido¶
Aunque el repo no incluye pipelines listos, un flujo típico sería:
- Ejecutar pruebas/lint (FastAPI + Next.js).
- Construir imágenes
backendyfrontend. - Ejecutar
alembic upgrade headcontra la base de staging/producción. - Desplegar contenedores y reiniciar
huey. - Verificar health endpoints (
/api/docs,/api/openapi.json) y logs iniciales.
8. Troubleshooting¶
| Síntoma | Posible causa | Acción |
|---|---|---|
| 401 en todas las rutas | settings.domain distinto al host real; la cookie session_token no se envía |
Ajusta DOMAIN en .env y reinicia backend/frontend. |
| Tablas vacías aun con datos | Cookie cfg:centros_costos inválida o centros dados de baja |
Borrar preferencia (DELETE /api/admin/centros_costos/select) y seleccionar de nuevo. |
| Tarea Huey no corre | Lock atascado en Redis (jobs:lock:*) |
Usa /api/admin/tasks/clean_lock/{task_id} o redis-cli DEL jobs:lock:.... |
| Restauración “replace” falla | Falta extensión ltree |
El wrapper _psql_load_data_with_triggers_off la crea automáticamente; revisa logs para confirmar permisos. |
| Migraciones no detectan cambios | Modelo no importado en app/models/__init__.py |
Añade el modelo y vuelve a generar la revisión. |
Con estos pasos puedes levantar un entorno completo, mantener migraciones y asegurar que los servicios acompañantes (Redis, Huey, Nginx) estén coordinados.