Instalar en Windows (sin Docker Desktop)
En Windows no estás obligado a usar Docker Desktop. Es lo más fácil, pero tiene dos cosas a considerar: es un instalador con asistente/GUI, y su licencia es paga para empresas medianas o grandes (gratis solo para uso personal y empresas con menos de 250 empleados y menos de US$10M de facturación anual).
Si querés evitar ambas cosas, la alternativa estándar es Docker Engine dentro de WSL2, todo por línea de comandos.
Por qué siempre hay una capa Linux: las imágenes de Heskala son contenedores Linux. En Windows eso corre siempre sobre WSL2 (o una VM Linux). Docker Desktop también usa WSL2 internamente — con esta guía simplemente te salteás el Desktop y su licencia.
Opción recomendada: Docker Engine en WSL2
Sección titulada «Opción recomendada: Docker Engine en WSL2»1. Instalar WSL2 + Ubuntu
Sección titulada «1. Instalar WSL2 + Ubuntu»Preflight (sin esto wsl --install puede fallar silenciosamente):
- Windows 10 build 19041+ o Windows 11. En Windows 10 <19041 el kernel de WSL2 viene por Windows Update.
- Virtualización habilitada en BIOS/UEFI (VT-x en Intel, AMD-V en AMD).
Sin esto,
wsl --installfalla. - 4 GB de RAM libres (WSL2 reserva ~2 GB por default; el stack de Heskala ocupa otros ~2 GB encima).
En PowerShell como administrador, ejecutá estos comandos uno por uno (copiá, pegá, esperá el prompt de vuelta antes de seguir):
# 1) Bajá WSL a la última versión (recomendado por Microsoft; corrige bugs en systemd)wsl --update# 2) Fijá WSL2 como default ANTES del install (si quedó WSL1 de una migración vieja)wsl --set-default-version 2# 3) (Opcional) Listá las distros disponibles (si querés ver Debian, openSUSE, etc.)wsl --list --online# 4) Instalá Ubuntu. En Win11 / Win10 2004+ alcanza con el default; en máquinas# viejas pasale el nombre exacto, p.ej.: wsl --install -d Ubuntu-22.04wsl --installReiniciá cuando lo pida, creá el usuario de Ubuntu (nombre + contraseña), y verificá. Un comando por bloque:
# 5) Versión de WSL (tiene que decir 2.x)wsl --version# 6) Versión por distro (la columna "Version" tiene que decir 2)wsl --list --verboseSi wsl --list --verbose muestra WSL1, migrá con wsl --set-version Ubuntu 2
(tarda varios minutos).
2. Instalar Docker Engine dentro de Ubuntu
Sección titulada «2. Instalar Docker Engine dentro de Ubuntu»Abrí Ubuntu desde el menú inicio. El primer comando con sudo te va a
pedir la contraseña que pusiste en el paso 1.
Ejecutá cada bloque por separado (no los pegues todos juntos: el primero puede pedirte password y los siguientes se perderían en el stdin):
# 1) Verificá que curl esté (Ubuntu lo trae de base; distros minimal pueden no)which curlSi el comando anterior no devuelve nada, instalalo:
sudo apt-get update && sudo apt-get install -y curl# 2a) Opción preferida: script oficial de Docker (última versión)curl -fsSL https://get.docker.com | shSi esto falla (proxy corporativo, error de GPG, conflicto de paquetes, etc.), usá el paquete oficial de Ubuntu. Es más viejo pero está testeado con tu versión de distro:
# 2b) Fallback: Docker desde los repos de Ubuntusudo apt-get updatesudo apt-get install -y docker.ioVerificá que quedó instalado antes de seguir:
docker --version# 3) Para usar docker sin sudo el resto de la sesiónsudo usermod -aG docker $USERCerrá y reabrí Ubuntu para que tome el grupo docker.
3. Habilitar systemd (para que Docker arranque como servicio)
Sección titulada «3. Habilitar systemd (para que Docker arranque como servicio)»sudo tee /etc/wsl.conf >/dev/null <<'EOF'[boot]systemd=trueEOFDespués, en PowerShell: wsl --shutdown. Reabrí Ubuntu y habilitá Docker.
Dos bloques separados:
# Habilita Docker para que arranque como servicio en cada bootsudo systemctl enable --now docker# Verificá que el daemon responde (tiene que listar Server + Client)docker version3.5 Sanity check antes de instalar Heskala
Sección titulada «3.5 Sanity check antes de instalar Heskala»Confirmá que docker compose está disponible y funciona. Cada bloque es
una verificación independiente — ejecutá uno, mirá el resultado, y si está
OK seguí con el siguiente. Si alguno falla, no sigas: revisá la
sección Diagnóstico al final.
1) ¿Existe el binario de docker?
command -v dockerTiene que devolver una ruta (ej. /usr/bin/docker). Si devuelve vacío, el
install de Docker no quedó aplicado al PATH: reinstalá con el paso 2.
2) ¿El daemon está corriendo y responde?
docker infoLas primeras líneas tienen que decir Server Version: 20.10+ y NO tiene que
aparecer permission denied ni Cannot connect to the Docker daemon. Si
aparece permission denied, te falta el paso 3 (usermod) o no re-abriste
Ubuntu.
3) ¿Está el plugin docker compose v2?
docker compose version⚠️ Cuidado con la sintaxis:
docker compose -vydocker compose --versionNO funcionan. Compose v2 solo expone la versión como subcomando explícito (version). Si te equivocás, el CLI tira el help largo en lugar de la versión, y parece que no hay plugin cuando sí lo hay.
Tiene que decir Docker Compose version v2.x.x (el v2 es importante).
Si en cambio te aparece cualquiera de estos mensajes, no tenés el plugin v2 instalado:
docker: 'compose' is not a docker command"docker compose" is not a docker command (unknown command)Esto pasa en dos casos:
- Caso A: tenés Docker Engine pero sin el plugin (común en instalaciones viejas o en algunas distros que separan los paquetes).
- Caso B: tenés el binario viejo standalone
docker-composecon guion (versión 1.x), que es un binario distinto y no se invoca comodocker compose.
Distinguí uno del otro:
command -v docker-compose- Si devuelve una ruta (ej.
/usr/bin/docker-compose), tenés el binario viejo standalone v1. Desinstalalo primero (entra en conflicto con el plugin v2):
sudo apt-get remove -y docker-compose- Si devuelve vacío, no hay plugin ni binario viejo. Saltá al install de abajo.
Después, instalá el plugin v2:
sudo apt-get update && sudo apt-get install -y docker-compose-plugin# Verificádocker compose versionTiene que decir ahora Docker Compose version v2.x.x.
4) ¿El usuario puede correr contenedores sin sudo?
docker run --rm hello-worldTiene que bajar la imagen, ejecutarla y mostrar Hello from Docker!. Si
falla con permission denied, volvé a hacer el paso 3 y re-abrí la terminal.
4. Instalar Heskala
Sección titulada «4. Instalar Heskala»Ya con Docker funcionando dentro de WSL, seguí el
quickstart normal (el install.sh corre igual dentro de
Ubuntu):
curl -fsSL https://docs.heskala.com/install.sh | bashAccedés desde el navegador de Windows a http://localhost:3000 (WSL2 publica los
puertos en localhost).
Arranque automático tras un reinicio / corte de energía
Sección titulada «Arranque automático tras un reinicio / corte de energía»Es el punto más importante en una PC de mostrador. Necesitás dos cosas:
-
Que los contenedores tengan
restart: unless-stopped— ya viene así en eldocker-compose.ymlde Heskala (backend, frontend y dashboard). Con systemd habilitado +systemctl enable docker, apenas WSL arranca, Docker y el stack se levantan solos. -
Que WSL2 arranque con Windows — WSL no arranca solo en el boot. Creá una tarea programada (Task Scheduler) que lo dispare al iniciar sesión:
- Programa/script:
wsl - Argumentos:
-d Ubuntu -u root docker compose -f /home/<usuario>/heskala-onprem/docker-compose.yml up -d - Disparador: Al iniciar sesión (y activá “Ejecutar con los privilegios más altos”).
Si el
install.shquedó bajo un usuario no-root (caso default en~/heskala-onprem), reemplazá<usuario>por ese usuario, o cambiá el default user de Ubuntu a root (comando oficial de Microsoft) con:ubuntu config --default-user root. Si no,docker composefalla por permisos del socket.Para que no dependa de que alguien inicie sesión a mano, configurá auto-login del usuario de Windows (así al encender, la sesión arranca sola y con ella la tarea).
- Programa/script:
Verificá el ciclo completo sin cortar la luz: reiniciá la máquina y, sin tocar
nada, abrí http://localhost:3000.
Diagnóstico rápido
Sección titulada «Diagnóstico rápido»Comandos útiles de la doc oficial de Microsoft cuando algo no anda. Un comando por bloque, ejecutá solo el que aplique al síntoma que tengas.
Desde PowerShell:
# Versión de WSL, kernel, default distrowsl --status# Distros instaladas + estado + WSL1/WSL2 (la columna "Version" tiene que decir 2)wsl --list --verbose# IP de la VM de WSL2 (si localhost no carga, probá esta)wsl hostname -I# Reinicia la VM (útil tras tocar .wslconfig o systemd)wsl --shutdownDesde Ubuntu:
# ¿Docker arrancó como servicio?sudo systemctl status docker# Plugin "docker compose" v2 (NO "docker-compose" con guion)docker compose version# ¿systemd=true está aplicado?cat /etc/wsl.conf# Logs del backend de Heskaladocker compose logs backendSíntomas comunes:
http://localhost:3000no carga → probá con la IP dewsl hostname -I(algunos firewalls de Windows filtran el port-forwarding de WSL2).wsl --list --verbosemuestra WSL1 → migrá conwsl --set-version Ubuntu 2(tarda varios minutos, no cortar).systemctl: command not found→ systemd no quedó habilitado. Verificá/etc/wsl.confy re-ejecutáwsl --shutdown.docker: permission denied→ faltasudo usermod -aG docker $USERo no re-abriste Ubuntu tras hacerlo.- Puertos ocupados tras reinicio → WSL2 los mapea dinámicamente;
wsl --shutdownlos libera. wsl --installfalla con error de virtualización → habilitar VT-x/AMD-V en BIOS/UEFI y volver a intentar.
Otras alternativas
Sección titulada «Otras alternativas»| Opción | Sin licencia paga | Asistente/GUI | Nota |
|---|---|---|---|
| Docker Engine en WSL2 | ✅ | No (CLI) | Recomendada para on-prem |
| Rancher Desktop | ✅ (open source) | Sí | Reemplazo de Docker Desktop; usa WSL2 igual |
| Podman (+ podman-compose) | ✅ | CLI/GUI | Motor distinto; compatibilidad con docker-compose.yml no es 100% |
| Docker Desktop | Depende del tamaño | Sí | Lo más simple; licencia paga para empresas grandes |
Recomendación
Sección titulada «Recomendación»Para un cliente típico en Windows que corre Heskala como instalación local:
WSL2 + Docker Engine — evita la licencia y el asistente, y con systemd + una
tarea programada + restart: unless-stopped queda con arranque automático tras un
corte de energía. Si el cliente prefiere algo con interfaz y no le pesa la
licencia (empresa chica), Docker Desktop sigue siendo la vía más rápida.