🐳 docker-labs GitHub ↗

⚙️ Especificaciones Técnicas — Docker Labs#

Versión: 1.6.0 Estado: 🟢 Activo Audiencia: 👥 Técnico, DevOps, reclutadores Objetivo: Stacks, puertos, endpoints, CI y capa de distribución Windows

🖥️ Base de ejecución#

ComponenteEstado actual
Docker runtimeDocker Desktop / Docker Engine con Compose
Panel principaldashboard-control en 9090
Gateway06-nginx-proxy en 8085
Core principal05-postgres-api en 8000
Portal principal09-multi-service-app en 8083
Launcher Windowsdocker-labs-launcher.exe compilado con Go 1.21 (stdlib puro, cero dependencias externas)
Instalador WindowsInno Setup .exe distribuido por GitHub Releases

🔌 Puertos — todos los labs#

LabServicioPuerto host
dashboard-controlControl Center9090
01-node-apiAPI Node.js3000
02-php-lampApache + PHP8081
02-php-lampphpMyAdmin8082
02-php-lampMariaDB3306
03-python-apiAPI Python5000
04-redis-cacheAPI Node.js3001
04-redis-cacheRedis6379
05-postgres-apiAPI FastAPI8000
05-postgres-apiPostgreSQL5432
06-nginx-proxyGateway Nginx8085
07-rabbitmq-messagingRabbitMQ AMQP5672
07-rabbitmq-messagingRabbitMQ Management15672
08-prometheus-grafanaPrometheus9091
08-prometheus-grafanaGrafana3002
09-multi-service-appFrontend Nginx8083
09-multi-service-appBackend Node.js3003
09-multi-service-appMongoDB27017
10-go-apiAPI Go8084
11-elasticsearch-searchAPI Python8001
11-elasticsearch-searchElasticsearch9200
12-jenkins-ciJenkins UI8080
12-jenkins-ciJenkins agentes50000
Los puertos de 08 y 11 fueron ajustados en la auditoría técnica para evitar conflictos con la plataforma principal. Ver technical-audit.md.

✅ Health checks — cobertura 12/12 labs#

LabServicioCheck
01-node-apiAPIwget -qO- http://localhost:3000/health
02-php-lampMariaDBmysqladmin ping -h 127.0.0.1
02-php-lampApache + PHPcurl -f http://localhost/
03-python-apiAPIcurl -f http://localhost:5000/health
04-redis-cacheRedisredis-cli ping
04-redis-cacheAPIwget -qO- http://localhost:3001/health
05-postgres-apiAPIcurl -f http://localhost:8000/health
05-postgres-apiPostgreSQLpg_isready
06-nginx-proxyGatewaywget -qO- http://127.0.0.1/gateway-health
07-rabbitmq-messagingRabbitMQrabbitmq-diagnostics -q ping
08-prometheus-grafanaPrometheuswget -qO- http://localhost:9091/-/ready
08-prometheus-grafanaGrafanawget -qO- http://localhost:3002/api/health
09-multi-service-appMongoDBmongosh --eval "db.adminCommand('ping').ok"
09-multi-service-appBackendwget -qO- http://localhost:3003/api/health
10-go-apiAPIwget -qO- http://localhost:8084/health
11-elasticsearch-searchElasticsearchwget -qO- http://localhost:9200/_cluster/health
11-elasticsearch-searchAPIcurl -f http://localhost:8001/health
12-jenkins-ciJenkinscurl -f http://localhost:8080/login
dashboard-controlControl Centercurl -f http://localhost:9090/api/overview

🧪 CI/CD#

JobTriggerDescripcion
quality-pythonpush / PRpytest sobre 05-postgres-api con base de datos real
quality-nodepush / PRnode test sobre 09-multi-service-app/backend
discoverpush / PRDescubre dinámicamente todos los docker-compose.yml del repo
test (matriz)push / PRLevanta y valida cada lab por separado (10 labs; excluye 11 y 12 por recursos)
smoke-platformpush / PRLevanta 05 + 09 + 06 con sus compose propios y valida flujo Core → Portal → Gateway
build-windowstag v*.*.*Compila el launcher Go y el instalador Inno Setup; publica en GitHub Releases

Labs excluidos de la matriz de CI (validos en local):


🪟 Capa Windows#

PiezaTecnología
LauncherGo 1.21 (stdlib puro, sin dependencias externas)
Build del launchergo build -ldflags "-X main.launcherVersion=X.Y.Z"
InstaladorInno Setup 6.x
Script de buildscripts/windows/build-launcher.ps1 + build-installer.ps1
Manifest centrallabs.config.json (fuente única de labs, puertos y URLs)
ChecksumsSHA256
Release automationGitHub Actions — .github/workflows/build-windows.yml

📦 Artefactos del release Windows#

ArtefactoDescripción
docker-labs-setup-{version}.exeInstalador Inno Setup para Windows 10+
SHA256SUMS.txtChecksums para verificación de integridad
El instalador no se versiona dentro del repo. Se publica como asset de GitHub Releases. Ver github-releases-distribution.md.

📝 Notas de implementación#


📡 Observabilidad (v1.6.0+)#

Control Center — endpoint /metrics#

El servidor dashboard-control/server.js expone métricas propias en

MétricaTipoDescripción
docker_labs_requests_totalcounterRequests HTTP totales recibidos
docker_labs_request_errors_totalcounterRequests con respuesta de error
docker_labs_lab_actions_totalcounterAcciones Docker ejecutadas (up, down, etc.)
docker_labs_lab_action_errors_totalcounterAcciones Docker que terminaron con error
docker_labs_uptime_secondsgaugeSegundos desde inicio del proceso
docker_labs_known_labsgaugeLabs cargados desde labs.config.json

El endpoint no requiere autenticación para permitir scraping desde Prometheus aunque DASHBOARD_TOKEN esté configurado.

Prometheus — scrape targets#

JobTargetDescripción
node-apihost.docker.internal:3000Lab 01
python-apihost.docker.internal:5000Lab 03
inventory-corehost.docker.internal:8000Lab 05
operations-portalhost.docker.internal:3003Lab 09
go-apihost.docker.internal:8084Lab 10
docker-labs-control-centerhost.docker.internal:9090Control Center
prometheuslocalhost:9090Self-scrape

Grafana — dashboards incluidos#

ArchivoUIDPaneles
08-prometheus-grafana/grafana-dashboards/control-center.jsondocker-labs-control-center8 (6 stat + 2 timeseries)

🔒 Seguridad y robustez (v1.6.0+)#

Control Center#

AspectoImplementación
CORSRestringido a http://localhost:{DASHBOARD_PORT} — no comodín
AutenticaciónToken Bearer/Cookie opcional via DASHBOARD_TOKEN env var
Validación de inputslabId validado con regex [\w-]+ contra lista conocida antes de ejecutar Docker
Body limit10 KB máximo en requests POST
Rate limiting30 requests POST / IP / 60 s (en memoria, sin dependencias externas)
Timeoutsdocker compose up/down: 120 s · ps/inspect: 15 s · logs: 10 s
Error handlingErrores internos logueados en stderr JSON — respuesta al cliente sin internals
LoggingEstructurado JSON con niveles (debug/info/warn/error) — controlado por LOG_LEVEL

Labs#

AspectoImplementación
CredencialesTodas via ${VAR:-default} en env · .env en .gitignore · .env.example en cada lab
Resource limitsdeploy.resources.limits.memory en todos los docker-compose.yml
XSSsanitizeText() y sanitizeUrl() aplicados en todo innerHTML de dashboard.js

09-multi-service-app#

AspectoImplementación
Circuit breaker3 fallos consecutivos abren el circuito hacia Inventory API · recuperación a 30 s
Fetch timeout8 s por request a Inventory API
MongoDB retry5 intentos con backoff de 3 s antes de abortar el proceso

📚 Documentos relacionados#