Manual de Integración
Este manual proporciona información sobre integración, instalación y configuración del sistema UnoSportClub (v0.4.1).
UnoSportClub es una plataforma para gestión de clubes deportivos: monorepo Angular 21 + Express 5, OAuth2 local y PostgreSQL. Cinco SPAs (cliente, panel, trainer, sudo, accounting) comparten API en functions/server.js.
Arquitectura del Sistema
Componentes Principales
Frontend (Angular 21)
-
App cliente (
src/, puerto 6100) -
Panel operador (
projects/panel/, 6101) -
Panel entrenador (
projects/trainer/, 6102) -
Panel sudo (
projects/sudo/, 6103) -
Contabilidad (
projects/accounting/, 6104)
Estructura del Proyecto
unosportclub/
├── src/ # App cliente
├── projects/ # panel, trainer, sudo, accounting, common
├── functions/ # API Express, migraciones, OAuth2
├── docs/ # Antora (este manual)
├── docker/ # Imagen unificada
└── Dockerfile
Instalación y Configuración
Resumen
-
git clonedel monorepo (sin submódulos) -
npm install -
Configurar
functions/.env(verfunctions/.env.example) -
npm run db:migrateynode functions/db/install-accounting.jssi aplica -
Desarrollo:
npm run dev:serve -
Producción: Despliegue con Docker
Variables de entorno
PostgreSQL
DB_HOST=localhost
DB_PORT=5432
DB_NAME=postgres
DB_USER=postgres
DB_PASSWORD=postgres
DB_NAME_ACCOUNTING=postgres
DB_SSL=false
Despliegue
Detalle completo: Despliegue con Caddy y Docker
Apéndice: referencia legado pre-v0.4
Las secciones siguientes de este archivo pueden mencionar Firebase Hosting, emuladores o firebase deploy. No aplican a v0.4.1; se conservan solo como histórico.
Entornos (referencia histórica)
Production
-
app.unosportclub.com.co- Aplicación principal -
panel.unosportclub.com.co- Panel de operador -
entrenador.unosportclub.com.co- Panel de entrenador -
control.unosportclub.com.co- Panel de super administrador -
Base de datos: Cloud SQL externa (PostgreSQL)
-
Imágenes: Tags específicos de versión
Desarrollo Local
El sistema puede ejecutarse localmente de dos formas:
Opción 1: Desarrollo local (recomendado)
npm run dev:serve
Levanta API (:6000) y las cinco SPAs (:6100–:6104).
Opción 2: Desarrollo local con Docker (pruebas completas)
Para ejecutar el sistema completo localmente usando Docker, puedes crear un archivo docker-compose.local.yml:
version: '3.8'
services:
# Base de datos local
unosport-db-local:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: unosportclub_local
POSTGRES_USER: unosport_admin
POSTGRES_PASSWORD: local_password
ports:
- "5432:5432"
volumes:
- unosport_db_local:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U unosport_admin"]
interval: 10s
timeout: 5s
retries: 5
networks:
- unosport_local
# Backend local (desde código fuente)
unosport-backend-local:
build:
context: .
dockerfile: Dockerfile.functions
restart: unless-stopped
depends_on:
unosport-db-local:
condition: service_healthy
environment:
NODE_ENV: development
DATABASE_URL: postgresql://unosport_admin:local_password@unosport-db-local:5432/unosportclub_local
DB_HOST: unosport-db-local
DB_PORT: 5432
DB_NAME: unosportclub_local
DB_USER: unosport_admin
DB_PASSWORD: local_password
DB_SSL: "false"
PORT: 6000
HOST: 0.0.0.0
ports:
- "6000:6000"
volumes:
- ./functions:/app
- /app/node_modules
command: >
sh -c "
cd /app &&
npm install &&
node db/install.js &&
node server_wrapper.js
"
networks:
- unosport_local
# Frontend - Aplicación Principal
unosport-app-local:
build:
context: .
dockerfile: Dockerfile
args:
PROJECT: unosportclub
restart: unless-stopped
ports:
- "6100:80"
environment:
API_URL: http://unosport-backend-local:6000
networks:
- unosport_local
# Frontend - Panel
unosport-panel-local:
build:
context: .
dockerfile: Dockerfile
args:
PROJECT: panel
restart: unless-stopped
ports:
- "6101:80"
environment:
API_URL: http://unosport-backend-local:6000
networks:
- unosport_local
networks:
unosport_local:
volumes:
unosport_db_local:
Requisitos Previos
Antes de usar Docker localmente, asegúrate de tener instalado:
-
Docker: Versión 20.10 o superior
-
Docker Compose: Versión 2.0 o superior
Verifica la instalación:
docker --version
docker-compose --version
Configuración Inicial
-
Crear archivo de configuración Docker Compose:
Crea un archivo docker-compose.local.yml en la raíz del proyecto con la configuración mostrada arriba.
-
Configurar variables de entorno:
Crea un archivo .env.local en la raíz del proyecto:
# Base de datos local
DB_NAME=unosportclub_local
DB_USER=unosport_admin
DB_PASSWORD=local_password
# Backend
PORT=6000
NODE_ENV=development
-
Iniciar servicios:
# Construir e iniciar todos los servicios
docker-compose -f docker-compose.local.yml up -d --build
# Ver logs de todos los servicios
docker-compose -f docker-compose.local.yml logs -f
# Ver logs de un servicio específico
docker-compose -f docker-compose.local.yml logs -f unosport-backend-local
Acceso a los Servicios
Una vez iniciados los servicios, estarán disponibles en:
-
Aplicación Principal: http://localhost:6100
-
Panel de Operador: http://localhost:6101
-
API Backend: http://localhost:6000/api
-
Health Check: http://localhost:6000/health
-
Base de Datos: localhost:5432
Gestión de Base de Datos Local
Ejecutar migraciones manualmente:
# Ejecutar migraciones dentro del contenedor
docker-compose -f docker-compose.local.yml exec unosport-backend-local sh -c "cd /app && node db/install.js"
Acceder a la base de datos:
# Conectarse a PostgreSQL
docker-compose -f docker-compose.local.yml exec unosport-db-local psql -U unosport_admin -d unosportclub_local
# O desde fuera del contenedor (si tienes psql instalado)
psql -h localhost -U unosport_admin -d unosportclub_local
# Password: local_password
Ver estado de migraciones:
docker-compose -f docker-compose.local.yml exec unosport-db-local psql -U unosport_admin -d unosportclub_local -c "SELECT * FROM schema_migrations ORDER BY id;"
Resetear base de datos:
# Detener servicios
docker-compose -f docker-compose.local.yml down
# Eliminar volumen de base de datos (CUIDADO: elimina todos los datos)
docker volume rm unosportclub_unosport_db_local
# Reiniciar servicios (creará nueva base de datos)
docker-compose -f docker-compose.local.yml up -d
Desarrollo con Hot Reload
Para desarrollo con recarga automática, puedes montar el código fuente como volumen:
volumes:
- ./functions:/app
- /app/node_modules # Evita sobrescribir node_modules del contenedor
Luego usa herramientas como nodemon o node --watch en el contenedor:
# Modificar el comando en docker-compose para usar nodemon
command: >
sh -c "
cd /app &&
npm install &&
npx nodemon server_wrapper.js
"
Comandos Útiles
Ver estado de servicios:
docker-compose -f docker-compose.local.yml ps
Reiniciar un servicio:
docker-compose -f docker-compose.local.yml restart unosport-backend-local
Detener todos los servicios:
docker-compose -f docker-compose.local.yml down
Detener y eliminar volúmenes:
docker-compose -f docker-compose.local.yml down -v
Reconstruir un servicio específico:
docker-compose -f docker-compose.local.yml build --no-cache unosport-backend-local
docker-compose -f docker-compose.local.yml up -d unosport-backend-local
Ver logs en tiempo real:
# Todos los servicios
docker-compose -f docker-compose.local.yml logs -f
# Servicio específico
docker-compose -f docker-compose.local.yml logs -f unosport-backend-local
# Últimas 100 líneas
docker-compose -f docker-compose.local.yml logs --tail=100 unosport-backend-local
Ejecutar comandos dentro del contenedor:
# Shell interactivo en el contenedor de backend
docker-compose -f docker-compose.local.yml exec unosport-backend-local sh
# Ejecutar comando específico
docker-compose -f docker-compose.local.yml exec unosport-backend-local npm test
Solución de Problemas Comunes
Error: Puerto ya en uso
Si un puerto está ocupado, puedes cambiarlo en docker-compose.local.yml:
ports:
- "6001:6000" # Cambiar puerto externo
Error: Base de datos no conecta
Verifica que el servicio de base de datos esté saludable:
docker-compose -f docker-compose.local.yml ps unosport-db-local
docker-compose -f docker-compose.local.yml logs unosport-db-local
Error: Permisos en volúmenes
En Linux, puede ser necesario ajustar permisos:
sudo chown -R $USER:$USER ./functions
Limpiar todo y empezar de nuevo:
# Detener y eliminar contenedores, redes y volúmenes
docker-compose -f docker-compose.local.yml down -v
# Limpiar imágenes no utilizadas
docker system prune -a
# Reconstruir e iniciar
docker-compose -f docker-compose.local.yml up -d --build
Despliegue con Docker Compose
Para desplegar en servidor con Docker Compose:
# Iniciar todos los servicios
docker-compose up -d
# Actualizar servicios específicos
docker-compose pull unosport-backend
docker-compose up -d unosport-backend
# Ver logs
docker-compose logs -f unosport-backend
# Reiniciar servicios
docker-compose restart unosport-backend
Para más detalles sobre el despliegue con Docker y Caddy, consulta: Despliegue con Caddy y Docker
Seguridad
Autenticación
-
Todos los endpoints requieren autenticación (excepto endpoints públicos)
-
Los tokens JWT se validan en cada petición
-
Los custom claims determinan los permisos
Solución de Problemas Comunes
Error de Conexión a Base de Datos
-
Verifica que PostgreSQL esté corriendo
-
Verifica las credenciales en
functions/.env -
Verifica que el firewall permita conexiones
-
Para bases de datos en la nube, verifica la configuración de SSL
Próximos Pasos
Una vez completada la integración:
-
Revisa la Documentación del Desarrollador
-
Consulta la Referencia de API
-
Configura dominios personalizados si es necesario
-
Configura monitoreo y alertas
Actualización del Sistema
Proceso de Actualización
Para actualizar el sistema a una nueva versión:
-
Backup: Realiza un backup completo antes de actualizar
-
Revisa el changelog: Consulta los cambios en la nueva versión
-
Actualiza código:
git pullo descarga la nueva versión -
Actualiza dependencias:
npm installen el proyecto principal yfunctions/ -
Ejecuta migraciones:
npm run db:migratesi hay nuevas migraciones -
Reconstruye:
npm run build:all -
Despliega:
npm run deploy:firebase -
Verifica: Prueba las funcionalidades principales
Mantenimiento Regular
Tareas de Mantenimiento Diarias
-
Revisar logs de errores
-
Verificar que los backups se ejecuten correctamente
-
Monitorear el uso de recursos
-
Revisar métricas de rendimiento