wsl-labs GitHub

🛠️ Developing#

Guía para extender y mantener wsl-labs sin romper la coherencia del proyecto ni el flujo real de Windows ↔ contenedores wslc.

Para operar el día a día (construir, levantar, bajar, logs) usa el RUNBOOK.md. Este documento es para desarrollar el repo: añadir casos de contenedor, tocar el panel y validar antes de subir.

<!-- -->

wsl-labs es un WSL Container Center: levanta contenedores reales con wslc (motor nativo de WSL 2.9+, tipo Docker). Las guías de fundamentos de WSL (docs/00-05, historia, cheatsheets) quedan como documentación de contexto; el foco operativo son los contenedores.

🧭 Principios#

wslc, portado de docker-labs o nuevo.

reemplazan a wslc ni al panel Node.js.

containers/containers.config.json** y refléjalo en el README del caso. No lo dupliques.


🗂️ Estructura del repo#

PiezaRol
📇 containers/containers.config.jsonFuente única de verdad del catálogo (casos, puertos, imágenes, contenedores, redes)
🐳 containers/NN-nombre/Un directorio por caso: Dockerfile (si es imagen propia), código y README.md
🧭 dashboard-server/Panel Node.js (:9092), servidor HTTP con http nativo
dashboard-server/server.jsBackend: overview + acciones wslc
dashboard-server/verify-localhost.jsVerificador del catálogo y disponibilidad local
index.html · dashboard.css · dashboard.jsUI web del panel
🪟 launcher/windows/main.goLauncher Go (solo stdlib, sin dependencias)
📦 installer/wsl-labs.issScript de Inno Setup que empaqueta el launcher
⚙️ .github/workflows/CI/CD: docs, dashboard, build-windows
docs/Guías de contexto de WSL (00-05, historia) + wslc-contenedores.md
version.txtFuente única de la versión del proyecto

🐳 Cómo añadir un caso de contenedor#

1 · Naming y estructura#

Formato NN-nombre-kebab, número de dos dígitos:

containers/13-mi-caso/
├── Dockerfile   # solo si construyes una imagen propia (FROM …)
├── server.js    # (opcional) código de la app
└── README.md
El Dockerfile solo hace falta si la imagen es propia. Si el caso usa una imagen oficial tal cual (p. ej. prom/prometheus, jenkins/jenkins:lts), el array build va vacío y solo defines containers.

2 · Registro en containers/containers.config.json#

Añade una entrada al array cases:

{
  "id": "13",
  "name": "mi-caso",
  "title": "Mi caso",
  "description": "Descripción corta (imagen base, qué expone).",
  "category": "starter",
  "port": 8115,
  "url": "http://localhost:8115",
  "healthProtocol": "http",
  "build": [{ "image": "wsl-labs/mi-caso:latest", "context": "containers/13-mi-caso" }],
  "containers": [{ "name": "wslc-mi-caso", "image": "wsl-labs/mi-caso:latest", "ports": ["8115:3000"] }]
}
CampoUso
categorystarter, platform o infra
port / urlPuerto host publicado y URL de verificación
healthProtocolhttp (sonda HTTP en el puerto)
networkNombre de red wslc cuando hay varios contenedores comunicándose
buildImágenes propias (image + context); vacío si usas imagen oficial
containersContenedores a levantar (name, image, ports, env opcional)
Para multi-contenedor, referencia el otro contenedor por su name (DNS interno de la red wslc) en las variables env, p. ej. PG_HOST=wslc-postgres. El panel crea la red declarada en network y conecta los contenedores.

3 · Contenedor único vs. stack#

FormaCuándoEn el catálogo
🧩 Contenedor únicoUna sola imagen expone un puertoUn elemento en containers, sin network
🕸️ Stack multi-contenedorApp + dependencia (Redis, Postgres, Mongo…)Varios containers + network, comunicados por nombre

4 · README del caso#

Sigue la plantilla de los casos existentes (mira containers/01-node-api/README.md): datos del caso en tabla, comandos wslc build/run, verificación con curl, uso desde el panel, bajar, y un diagrama Mermaid opcional.


🖥️ Cómo tocar el panel#

El panel es un servidor Node.js con el módulo http nativo (sin dependencias npm). Escucha solo en 127.0.0.1:9092 y ejecuta wslc.exe en Windows (lo localiza en C:\Program Files\WSL\wslc.exe, o vía WSL_LABS_WSLC).

EndpointMétodoUso
/api/wslc/overviewGETEstado global de todos los casos
/api/wslc/buildPOSTConstruye la(s) imagen(es) del caso ({ "id": "NN" })
/api/wslc/upPOSTCrea red (si aplica) y levanta los contenedores del caso
/api/wslc/downPOSTDetiene y elimina los contenedores del caso
/api/wslc/logsPOSTÚltimas líneas de log de los contenedores del caso
El panel corre wslc en Windows y no necesita wsl -u root, contraseñas ni sudo. No lo expongas a la red: mantenlo en 127.0.0.1. Si tocas el binding o la seguridad, revisa SECURITY.md.

Reglas al modificar el servidor:


✅ Validación local#

Antes de abrir un PR, ejecuta lo que aplique a tu cambio:

# 1. Catálogo + endpoint overview (equivale al workflow dashboard)
node dashboard-server/verify-localhost.js
#   o
make test-dashboard

# 2. Construye y levanta el caso, y comprueba localhost
Invoke-RestMethod -Method Post -Headers @{ 'Content-Type'='application/json' } `
  -Body '{ "id": "13" }' http://localhost:9092/api/wslc/build
Invoke-RestMethod -Method Post -Headers @{ 'Content-Type'='application/json' } `
  -Body '{ "id": "13" }' http://localhost:9092/api/wslc/up
Invoke-WebRequest http://localhost:8115 -UseBasicParsing

Los mismos checks que corre CI (replícalos en local cuando puedas):

WorkflowQué validaHerramienta
docs.ymlMarkdown de todo el repomarkdownlint-cli2
dashboard.ymlCatálogo y panelverify-localhost.js (Node)
build-windows.ymlLauncher + instalador Inno SetupSolo en tag vX.Y.Z
Para el launcher Go, compila local con cd launcher\windows; go build -ldflags "-X main.launcherVersion=0.1.0" -o wsl-labs-launcher.exe .

🌿 Flujo git sugerido#

  1. 🌿 Crea una rama descriptiva.
  2. ✏️ Haz cambios pequeños y verificables (carpeta + Dockerfile + catálogo + README).
  3. 📖 Actualiza docs si cambias flujo operativo.
  4. ✅ Corre las validaciones que apliquen.
  5. 🚀 Abre el PR con contexto claro.
feat: add mi-caso container (13) to catalog
fix: harden localhost dashboard for IPv6 health check
docs: align wslc setup with pre-release update

📖 Ver también: RUNBOOK.md · RELEASE.md · CONTRIBUTING.md · docs/MAINTAINERS.md · FILE_ARCHITECTURE.md

Fuente: DEVELOPING.md