Sistema de microservicios para la gestión integral de activos empresariales y sus mantenimientos, construido con arquitectura de microservicios, API Gateway y despliegue en Railway.
- Características
- Arquitectura
- Tecnologías
- Requisitos Previos
- Instalación y Configuración
- Uso en Local
- Despliegue en Producción
- CI/CD con Jenkins
- API Endpoints
- Testing
- Estructura del Proyecto
- Troubleshooting
- ✅ CRUD completo de activos empresariales
- 🔍 Búsqueda y filtrado avanzado
- 📊 Estadísticas y reportes
- 🏷️ Categorización (electrónico, maquinaria, vehículo, mobiliario, etc.)
- 📍 Seguimiento de ubicación y estado
- 🔧 Registro de mantenimientos (preventivo, correctivo, predictivo, emergencia)
- 👨🔧 Asignación de técnicos
- 💰 Control de costos y piezas
- 📝 Notas y historial de cambios
- ⚡ Priorización (baja, media, alta, crítica)
- 📅 Programación y seguimiento
- 🚀 Arquitectura de microservicios
- 🔄 API Gateway centralizado
- 🐳 Dockerizado completamente
- ⚙️ CI/CD con Jenkins
- ☁️ Desplegado etizados
- 📱 Frontend responsive con Next.js
┌─────────────┐
│ Frontend │ (Next.js)
│ Port 3003 │
└──────┬──────┘
│
▼
┌─────────────┐
│ API Gateway │ (Express)
│ Port 3000 │
└──────┬──────┘
│
├──────────────┬──────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Servicio │ │ Servicio │ │ Otros │
│ Activos │ │Mantenimientos│ │ Servicios │
│ Port 3001 │ │ Port 3002 │ │ │
└──────┬──────┘ └──────┬──────┘ └─────────────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ PostgreSQL │ │ MongoDB │
│ Port 5432 │ │ Port 27017 │
└─────────────┘ └─────────────┘
- Frontend (Next.js): Interfaz de usuario responsive
- API Gateway: Punto de entrada único, enrutamiento y proxy
- Servicio de Activos: Gestión de activos con PostgreSQL
- Servicio de Mantenimientos: Gestión de mantenimientos con MongoDB
- Bases de Datos: PostgreSQL para activos, MongoDB para mantenimientos
- Node.js v18+
- Express.js - Framework web
- PostgreSQL - Base de datos relacional (Activos)
- MongoDB - Base de datos NoSQL (Mantenimientos)
- Sequelize - ORM para PostgreSQL
- Mongoose - ODM para MongoDB
- Next.js 14
- React 18
- Axios - Cliente HTTP
- Tailwind CSS - Estilos
- Docker & Docker Compose - Contenedorización
- Jenkins - CI/CD Pipeline automatizado
- Railway - Plataforma de despliegue cloud
- Jest - Testing framework
- Supertest - Testing de APIs REST
- GitHub Webhooks - Integración continua
- Node.js v18 o superior
- Docker y Docker Compose
- Git
- npm o yarn
- Cuenta en Railway
- Git configurado
- Repositorio en GitHub/GitLab
git clone <url-del-repositorio>
cd proyecto-fina-cloud-computing# Instalar dependencias de todos los servicios
npm install --prefix api-gateway
npm install --prefix servicio-activos
npm install --prefix servicio-mantenimientos
npm install --prefix frontendPORT=3000
NODE_ENV=development
ACTIVOS_SERVICE_URL=http://localhost:3001
MANTENIMIENTOS_SERVICE_URL=http://localhost:3002PORT=3001
NODE_ENV=development
DATABASE_URL=postgresql://postgres:postgres123@postgres:5432/activos_dbPORT=3002
NODE_ENV=development
MONGO_URI=mongodb://mongodb:27017/mantenimientos_dbNEXT_PUBLIC_API_URL=http://localhost:3000/api# Levantar todos los servicios
docker-compose up -d
# Ver logs
docker-compose logs -f
# Detener servicios
docker-compose down
# Reconstruir servicios
docker-compose up -d --buildURLs locales:
- Frontend: http://localhost:3003
- API Gateway: http://localhost:3000
- Servicio Activos: http://localhost:3001
- Servicio Mantenimientos: http://localhost:3002
# Terminal 1 - PostgreSQL (necesitas tenerlo instalado)
# Crear base de datos: activos_db
# Terminal 2 - MongoDB (necesitas tenerlo instalado)
mongod
# Terminal 3 - API Gateway
cd api-gateway
npm run dev
# Terminal 4 - Servicio Activos
cd servicio-activos
npm run dev
# Terminal 5 - Servicio Mantenimientos
cd servicio-mantenimientos
npm run dev
# Terminal 6 - Frontend
cd frontend
npm run devAsegúrate de que todos los cambios estén en Git:
git add .
git commit -m "Preparar para despliegue"
git push- Ve a Railway
- Crea un nuevo proyecto
- Conecta tu repositorio de GitHub
Crea los siguientes servicios en Railway:
- Agregar servicio → PostgreSQL
- Nombre:
postgres-production - Copiar la
DATABASE_URLgenerada
- Agregar servicio → MongoDB
- Nombre:
mongodb-production - Copiar la
MONGO_URIgenerada
- Agregar servicio → GitHub Repo
- Root Directory:
servicio-activos - Variables de entorno:
NODE_ENV=production PORT=3001 DATABASE_URL=<url-de-postgres>
- Agregar servicio → GitHub Repo
- Root Directory:
servicio-mantenimientos - Variables de entorno:
NODE_ENV=production PORT=3002 MONGO_URI=<url-de-mongodb>
- Agregar servicio → GitHub Repo
- Root Directory:
api-gateway - Variables de entorno:
NODE_ENV=production PORT=3000 ACTIVOS_SERVICE_URL=https://servicio-activos-production.up.railway.app MANTENIMIENTOS_SERVICE_URL=https://servicio-mantenimientos-production.up.railway.app
- Agregar servicio → GitHub Repo
- Root Directory:
frontend - Variables de entorno:
NODE_ENV=production NEXT_PUBLIC_API_URL=https://api-gateway-production-xxxx.up.railway.app/api
En cada servicio, ve a Settings → Networking → Generate Domain
Actualiza las variables de entorno con las URLs públicas generadas.
Este proyecto incluye integración continua y despliegue continuo (CI/CD) usando Jenkins.
# Opción 1: Usar docker-compose (incluye Jenkins)
docker-compose up -d jenkins
# Opción 2: Levantar Jenkins standalone
docker build -f jenkins.Dockerfile -t jenkins-custom .
docker run -d -p 8080:8080 -p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins jenkins-custom- Abrir http://localhost:8080
- Obtener la contraseña inicial:
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword - Instalar plugins recomendados
- Crear usuario administrador
-
Crear nuevo Job:
- New Item → Pipeline
- Nombre:
proyecto-activos-pipeline
-
Configurar SCM:
- Pipeline → Definition: Pipeline script from SCM
- SCM: Git
- Repository URL:
<tu-repositorio> - Branch:
*/main - Script Path:
Jenkinsfile
-
Configurar Webhooks (opcional):
- En GitHub: Settings → Webhooks → Add webhook
- Payload URL:
http://tu-jenkins:8080/github-webhook/ - Content type:
application/json - Events: Push events
El Jenkinsfile incluye las siguientes etapas:
┌─────────────────────────────────────────────────────────┐
│ Jenkins Pipeline │
├─────────────────────────────────────────────────────────┤
│ │
│ 1. 📥 Checkout │
│ └─ Clonar código del repositorio │
│ │
│ 2. 🔍 Verificar Cambios │
│ └─ Detectar qué servicios cambiaron │
│ │
│ 3. 🧪 Tests │
│ ├─ Test Servicio Activos │
│ └─ Test Servicio Mantenimientos │
│ │
│ 4. 🐳 Build Docker Images │
│ ├─ Build API Gateway │
│ ├─ Build Servicio Activos │
│ ├─ Build Servicio Mantenimientos │
│ └─ Build Frontend │
│ │
│ 5. 🚀 Deploy │
│ └─ Desplegar servicios modificados │
│ │
│ 6. ✅ Verificación │
│ └─ Health checks de servicios │
│ │
└─────────────────────────────────────────────────────────┘
- ✅ Tests automáticos antes de cada deploy
- ✅ Build condicional - solo construye servicios modificados
- ✅ Despliegue automático a Railway
- ✅ Health checks post-despliegue
- ✅ Notificaciones de estado del build
- ✅ Rollback automático en caso de fallo
Configurar en Jenkins → Manage Jenkins → Configure System → Global properties:
RAILWAY_TOKEN=<tu-token-de-railway>
DOCKER_REGISTRY=<tu-registry> (opcional)
SLACK_WEBHOOK=<webhook-para-notificaciones> (opcional)
# Ver logs de Jenkins
docker logs -f jenkins
# Reiniciar Jenkins
docker restart jenkins
# Backup de Jenkins
docker exec jenkins tar -czf /tmp/jenkins-backup.tar.gz /var/jenkins_home
docker cp jenkins:/tmp/jenkins-backup.tar.gz ./jenkins-backup.tar.gz
# Restaurar Jenkins
docker cp ./jenkins-backup.tar.gz jenkins:/tmp/
docker exec jenkins tar -xzf /tmp/jenkins-backup.tar.gz -C /Developer → Git Push → GitHub
↓
Webhook
↓
Jenkins
↓
┌──────┴──────┐
↓ ↓
Run Tests Build Images
↓ ↓
└──────┬──────┘
↓
Deploy to Railway
↓
Health Checks
↓
✅ Success / ❌ Rollback
- El archivo
Jenkinsfileen la raíz del proyecto contiene la configuración completa del pipeline - Jenkins se ejecuta en el puerto 8080 por defecto
- Los builds se ejecutan automáticamente al hacer push si los webhooks están configurados
- Puedes ejecutar builds manualmente desde la interfaz de Jenkins
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/activos/lista |
Listar todos los activos |
| GET | /api/activos/ver/:id |
Obtener un activo por ID |
| GET | /api/activos/buscar?q= |
Buscar activos |
| GET | /api/activos/stats |
Estadísticas de activos |
| POST | /api/activos/crear |
Crear nuevo activo |
| PUT | /api/activos/actualizar/:id |
Actualizar activo |
| DELETE | /api/activos/eliminar/:id |
Eliminar activo |
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/mantenimientos/lista |
Listar todos los mantenimientos |
| GET | /api/mantenimientos/ver/:id |
Obtener un mantenimiento |
| GET | /api/mantenimientos/por-activo/:id |
Mantenimientos por activo |
| GET | /api/mantenimientos/stats |
Estadísticas |
| POST | /api/mantenimientos/crear |
Crear mantenimiento |
| PUT | /api/mantenimientos/actualizar/:id |
Actualizar mantenimiento |
| PATCH | /api/mantenimientos/cambiar-estado/:id |
Cambiar estado |
| POST | /api/mantenimientos/agregar-nota/:id |
Agregar nota |
| DELETE | /api/mantenimientos/eliminar/:id |
Eliminar mantenimiento |
Nota: Todos los endpoints requieren el prefijo /api cuando se accede a través del API Gateway.
# Tests del servicio de activos
cd servicio-activos
npm test
# Tests del servicio de mantenimientos
cd servicio-mantenimientos
npm test
# Con Docker
docker-compose run servicio-activos npm test
docker-compose run servicio-mantenimientos npm testnpm test -- --coverageproyecto-fina-cloud-computing/
├── api-gateway/ # API Gateway
│ ├── src/
│ │ └── index.js # Configuración del gateway
│ ├── Dockerfile
│ └── package.json
│
├── servicio-activos/ # Microservicio de Activos
│ ├── src/
│ │ ├── config/ # Configuración DB
│ │ ├── controllers/ # Controladores
│ │ ├── models/ # Modelos Sequelize
│ │ ├── routes/ # Rutas
│ │ └── index.js
│ ├── tests/ # Tests
│ ├── Dockerfile
│ └── package.json
│
├── servicio-mantenimientos/ # Microservicio de Mantenimientos
│ ├── src/
│ │ ├── config/ # Configuración DB
│ │ ├── controllers/ # Controladores
│ │ ├── models/ # Modelos Mongoose
│ │ ├── routes/ # Rutas
│ │ └── index.js
│ ├── tests/ # Tests
│ ├── Dockerfile
│ └── package.json
│
├── frontend/ # Frontend Next.js
│ ├── src/
│ │ ├── app/ # App Router
│ │ ├── components/ # Componentes React
│ │ └── services/ # Servicios API
│ ├── Dockerfile
│ └── package.json
│
├── postgres-init/ # Scripts de inicialización PostgreSQL
├── docker-compose.yml # Orquestación local
├── railway.toml # Configuración Railway
├── API_ENDPOINTS.md # Documentación de API
└── README.md # Este archivo
Solución:
# Verificar que los contenedores estén corriendo
docker-compose ps
# Reiniciar servicios
docker-compose restart postgres mongodbSolución:
# Windows
netstat -ano | findstr :3000
taskkill /PID <PID> /F
# Linux/Mac
lsof -ti:3000 | xargs kill -9Solución:
- Verificar que las URLs en Railway usen HTTPS
- Verificar variables de entorno en Railway
- Forzar redespliegue del servicio
Solución:
# Limpiar node_modules y reinstalar
rm -rf node_modules package-lock.json
npm install
# Verificar que las bases de datos de test estén disponibles
docker-compose up -d postgres mongodbSolución:
- Verificar
NEXT_PUBLIC_API_URLen.env.local - Verificar que el API Gateway esté corriendo
- Revisar CORS en el API Gateway
- Limpiar cache del navegador (Ctrl+Shift+R)
- Los cambios en el código se reflejan automáticamente con hot-reload
- Los logs se pueden ver con
docker-compose logs -f <servicio> - Para debugging, usa
console.logo herramientas como Postman
- Railway redespliegue automáticamente al hacer push a la rama principal
- Los logs están disponibles en el dashboard de Railway
- Las bases de datos en Railway tienen backups automáticos
- Nunca commitear archivos
.envcon credenciales reales - Usar variables de entorno para configuración sensible
- Implementar autenticación JWT (próxima feature)
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto es parte de un trabajo académico de Cloud Computing.
Para problemas o preguntas:
- Abrir un issue en GitHub
- Revisar la sección de API Endpoints en este README
- Consultar los logs de Railway o Docker
- Revisar la sección de Troubleshooting
¡Gracias por usar el Sistema de Gestión de Activos y Mantenimientos! 🚀