Sistema integrado de tickets HESK con monitoreo Zabbix, desplegado mediante contenedores Docker y automatizado con pipeline CI/CD.
Este proyecto implementa una solución completa DevOps que incluye:
- Sistema de Tickets: HESK (Help Desk Software) para gestión de tickets de soporte
- Monitoreo: Zabbix para supervisión de servicios y aplicaciones
- CI/CD: Pipeline automatizado con GitHub Actions para sincronización de categorías
- Infraestructura como Código: Docker Compose para orquestación de servicios
┌─────────────────────────────────────────────────────────┐
│ GitHub Actions │
│ (CI/CD - Sync Categories) │
└────────────────────┬────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Docker Compose │
├──────────────────────┬──────────────────────────────────┤
│ HESK (Tickets) │ Zabbix (Monitoring) │
│ - hesk-web:8081 │ - zabbix-web:80 │
│ - hesk-db (MySQL) │ - zabbix-server │
│ │ - zabbix-agent │
│ │ - zabbix-db (MySQL) │
└──────────────────────┴──────────────────────────────────┘
- front: Red pública para acceso web
- hesk-back: Red interna para comunicación HESK-DB
- zabbix-back: Red interna para comunicación Zabbix-DB
- Docker Engine 20.10+
- Docker Compose 2.0+
- Git 2.30+
- Node.js 20+ (para desarrollo local)
git clone https://github.com/tu-usuario/SGO-POC.git
cd SGO-POCcp .env.example .envEditar .env con tus credenciales:
# HESK Database
HESK_DB_NAME=hesk_db
HESK_DB_USER=hesk_user
HESK_DB_PASSWORD=tu_password_seguro
HESK_DB_ROOT_PASSWORD=root_password_seguro
# Zabbix Database
ZABBIX_DB_NAME=zabbix
ZABBIX_DB_USER=zabbix
ZABBIX_DB_PASSWORD=tu_password_zabbix
ZABBIX_DB_ROOT_PASSWORD=secret_rootdocker-compose up -ddocker-compose ps| Servicio | URL | Credenciales por Defecto |
|---|---|---|
| HESK | http://localhost:8081 | Configurar en primer acceso |
| Zabbix | http://localhost | Admin / zabbix |
El pipeline de GitHub Actions se activa automáticamente cuando se detectan cambios en categories.txt:
- Trigger: Push a
categories.txt - Runner: Self-hosted (ejecuta en el servidor)
- Proceso:
- Checkout del código
- Instalación de Node.js 20
- Ejecución de
sync_categories.js - Sincronización idempotente de categorías en HESK
El archivo sync_categories.js implementa:
- ✅ Idempotencia: Verifica existencia antes de insertar
- ✅ Validación: Comprueba categorías existentes
- ✅ Logging: Reporta operaciones realizadas
- ✅ Manejo de errores: Exit code apropiado en fallos
Secretos necesarios en GitHub:
DB_USER → Usuario de la base de datos HESK
DB_PASS → Contraseña de la base de datos HESK
- Editar
categories.txt:
Infraestructura
Aplicaciones
Redes
Seguridad
Desarrollo- Commit y push:
git add categories.txt
git commit -m "feat: agregar nueva categoría"
git push origin main- El pipeline se ejecutará automáticamente
DB_USER=hesk_user DB_PASS=hesk_password DB_NAME=hesk_db node sync_categories.js# Iniciar servicios
docker-compose up -d
# Ver logs
docker-compose logs -f [servicio]
# Detener servicios
docker-compose down
# Reiniciar un servicio
docker-compose restart [servicio]
# Ver estado de salud
docker-compose ps# MySQL HESK
docker exec -it hesk-db mysql -uhesk_user -p hesk_db
# MySQL Zabbix
docker exec -it zabbix-db mysql -uzabbix -p zabbix
# Shell del contenedor web
docker exec -it hesk-web bashTodos los servicios incluyen health checks configurados:
- Bases de datos:
mysqladmin pingcada 10s - HESK Web: Verificación HTTP endpoint cada 30s
- Zabbix: Ping del agente y verificación de servidor
- Acceder a http://localhost
- Login:
Admin/zabbix - Configurar hosts para monitorear
- Agregar templates según necesidad
El agente Zabbix está configurado para monitorear:
- Disponibilidad de servicios
- Uso de recursos (CPU, RAM, Disco)
- Estado de bases de datos
- Métricas personalizadas
- ✅ Redes internas aisladas para bases de datos
- ✅ Variables de entorno para credenciales
- ✅ Health checks para alta disponibilidad
- ✅ Volúmenes persistentes para datos
⚠️ Importante: Cambiar contraseñas por defecto en producción
- Usar secretos de Docker/Kubernetes
- Implementar HTTPS con certificados válidos
- Configurar firewall y restricción de puertos
- Habilitar logs centralizados
- Implementar backups automáticos
# Probar script localmente
DB_USER=hesk_user DB_PASS=hesk_password DB_NAME=hesk_db node sync_categories.js
# Verificar en base de datos
docker exec -it hesk-db mysql -uhesk_user -p hesk_db -e "SELECT * FROM hesk_categories;"SGO-POC/
├── .github/
│ └── workflows/
│ └── deploy.yml # Pipeline CI/CD
├── hesk-docker/ # Dockerfile para HESK
├── hesk/ # Archivos fuente de HESK
├── actions-runner/ # GitHub Actions self-hosted runner
├── docker-compose.yml # Orquestación de servicios
├── sync_categories.js # Script de sincronización
├── categories.txt # Categorías de HESK
├── .env # Variables de entorno (no versionado)
├── .env.example # Template de variables
└── README.md # Este archivo
# Ver logs detallados
docker-compose logs -f
# Verificar puertos en uso
sudo netstat -tulpn | grep -E ':(80|8081)'
# Recrear contenedores
docker-compose down -v
docker-compose up -d- Verificar secretos en GitHub Settings
- Comprobar que el runner esté activo: Settings → Actions → Runners
- Revisar logs del workflow en GitHub Actions
# Verificar conectividad con DB
docker exec hesk-db mysqladmin -uhesk_user -p ping
# Ejecutar script manualmente con debug
DB_USER=hesk_user DB_PASS=hesk_password DB_NAME=hesk_db node sync_categories.jsEste es un proyecto de prueba técnica. Para contribuir:
- Fork del repositorio
- Crear rama feature (
git checkout -b feature/nueva-funcionalidad) - Commit cambios (
git commit -m 'feat: agregar funcionalidad') - Push a la rama (
git push origin feature/nueva-funcionalidad) - Abrir Pull Request
Este proyecto es una prueba técnica con fines educativos.
Desarrollado como parte de una prueba técnica DevOps.
Última actualización: Abril 2026