Saltar al contenido principal

Quick start — desarrollo local

Guía para levantar el backend de ConectaMed en tu máquina con Docker Compose. El panel NOC (ui/nwi-app-conectamed-noc-web) y el monitor-worker suelen ejecutarse en el host apuntando al mismo .env y Redis/Soketi del compose.

Requisitos​

  • Docker Engine + Docker Compose v2
  • Node.js ≥ 20 (para frontends y workers en host)
  • Token de GitHub Packages con lectura del paquete @observer-ltda/conectamed-lib-common
  • Puertos libres: 5432, 6379, 6001, 3001–3007, 8080, 1812/udp, 1813/udp

1. Clonar y ubicarse en el monorepo​

cd /ruta/a/0_repos/services

Estructura esperada (extracto):

services/
docker-compose.dev.yml # Orquestación dev (canónico)
.env # Tu copia local (no commitear)
nwi-app-conectamed-auth-ms/
nwi-app-conectamed-bff/
nwi-app-conectamed-captive-portal-ms/
nwi-app-conectamed-inventory-ms/
...
nwi-app-conectamed-docs-core/
docs/tecnico/desarrollo/ejemplos/ # Plantillas de referencia

2. Crear .env desde el ejemplo​

Copia la plantilla sin secretos reales incluida en esta documentación:

cp nwi-app-conectamed-docs-core/docs/tecnico/desarrollo/ejemplos/env.dev.example .env

Edita al menos:

VariableDescripción
DB_PASSWORDContraseña Postgres del compose
JWT_SECRETSecreto JWT (cadena larga aleatoria)
GITHUB_TOKENPAT para npm install de lib-common en el build
INTELLIGENCE_WORKER_INTERNAL_API_KEY / RADIUS_WORKER_INTERNAL_API_KEYClaves internas BFF ↔ workers
OPENAI_API_KEY o ANTHROPIC_API_KEYSolo si usas Smart Question
INTELLIGENCE_ENCRYPTION_KEYopenssl rand -base64 32 si cifras API keys en BD

Ejemplo .env (valores ficticios)​

.env — ejemplo
NODE_ENV=local

DB_PORT=5432
DB_AUTH_NAME=conectamed-auth
DB_INVENTORY_NAME=conectamed-inventory
DB_CAPTIVE_PORTAL_NAME=conectamed-captive-portal
DB_INTELLIGENCE_NAME=conectamed-intelligence

DB_HOST=postgres
DB_USER=app
DB_PASSWORD=change-me-db-password
DB_SSL_ENABLED=false
DB_NAME=appdb

AUTH_SERVICE_URL=http://nwi-app-conectamed-auth-ms:3001/v1
CAPTIVE_PORTAL_SERVICE_URL=http://nwi-app-conectamed-captive-portal-ms:3002/v1
INVENTORY_SERVICE_URL=http://nwi-app-conectamed-inventory-ms:3003/v1
INTELLIGENCE_WORKER_SERVICE_URL=http://intelligence-worker:3007/v1
INTELLIGENCE_WORKER_INTERNAL_API_KEY=change-me-intelligence-internal-key

LLM_PROVIDER=openai
OPENAI_API_KEY=sk-example-not-a-real-key
INTELLIGENCE_ENCRYPTION_KEY=base64-example-key-32-bytes-min=

JWT_SECRET=change-me-jwt-secret-use-long-random-string
GITHUB_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

SOKETI_DEFAULT_APP_ID=conectamed
SOKETI_DEFAULT_APP_KEY=conectamed-app-key-dev
SOKETI_DEFAULT_APP_SECRET=conectamed-app-secret-dev
SOKETI_HOST_PORT=6001

PASSWORD_RESET_APP_URL=http://localhost:9060
TZ=America/Bogota
aviso

Nunca subas .env con tokens, SMTP ni claves de Metabase al repositorio. El archivo real vive solo en tu disco.

3. Levantar servicios con Docker Compose​

El archivo canónico está en la raíz de services/:

docker compose -f docker-compose.dev.yml up -d --build

Plantilla equivalente documentada (misma estructura):
ejemplos/docker-compose.dev.example.yml

Servicios incluidos​

Servicio ComposePuerto hostFunción
postgres5432PostgreSQL (varias BDs vía init scripts)
redis6379Cache, sesiones, colas
soketi6001WebSockets (Pusher-compatible)
auth-service3001Usuarios y roles
captive-portal-service3002Portal cautivo API
inventory-service3003Inventario y mapa
worker-radius3004Integración RADIUS
notification-service3005Correo SMTP
bff-api8080API unificada /v1
intelligence-worker3007Smart Question / IA
radius-server1812/1813 udpFreeRADIUS

Extracto docker-compose.dev.yml (referencia)​

docker-compose.dev.yml (extracto)
name: conectamed-dev

services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: ${DB_USER:-app}
POSTGRES_PASSWORD: ${DB_PASSWORD:?set in .env}
POSTGRES_DB: ${DB_NAME:-appdb}
ports:
- "5432:5432"
volumes:
- ./docker/postgres-init:/docker-entrypoint-initdb.d:ro

bff-api:
build:
context: ./nwi-app-conectamed-bff
dockerfile: Dockerfile.dev
args:
GITHUB_TOKEN: ${GITHUB_TOKEN}
ports:
- "8080:8080"
environment:
AUTH_SERVICE_URL: ${AUTH_SERVICE_URL:-http://auth-service:3001/v1}
INVENTORY_SERVICE_URL: ${INVENTORY_SERVICE_URL:-http://inventory-service:3003/v1}
REDIS_HOST: redis
depends_on:
- auth-service
- inventory-service

# … auth-service, inventory-service, redis, soketi, workers, radius-server

El archivo completo está en el repositorio y en ejemplos/docker-compose.dev.example.yml.

4. Comprobar que el stack responde​

# BFF (ajusta la ruta de health si tu BFF expone /health o /v1/...)
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8080/

docker compose -f docker-compose.dev.yml ps
docker compose -f docker-compose.dev.yml logs -f bff-api

Migraciones: cada microservicio Nest suele ejecutarlas al arrancar (TYPEORM_MIGRATIONS en el compose) o vía script del README del MS.

5. Panel NOC (frontend)​

En otro terminal, desde el UI del monorepo:

cd ../ui/nwi-app-conectamed-noc-web
cp .env.example .env.local # si existe; define NEXT_PUBLIC_API_BASE_URL
# NEXT_PUBLIC_API_BASE_URL=http://localhost:8080/v1
npm install
npm run dev

Abre la URL que indique Next (p. ej. http://localhost:9060) y alinea PASSWORD_RESET_APP_URL en .env del compose con esa URL.

6. Monitor worker (opcional)​

nwi-app-conectamed-monitor-worker suele correr fuera del compose para pings y alertas en vivo. Usa REDIS_HOST=localhost, INVENTORY_SERVICE_URL=http://localhost:3003/v1 y la misma configuración Soketi que en .env raíz. Consulta el README de ese repositorio.

Parar y limpiar​

docker compose -f docker-compose.dev.yml down
# Volúmenes (borra datos locales de Postgres/Redis):
# docker compose -f docker-compose.dev.yml down -v

Siguiente paso​