- Prerrequisitos
- Configuración del Repositorio y Entorno
- Estructura del Proyecto
- Proceso de Compilación
- Ejecución del Instalador
- Escenarios de Prueba
- Solución de Problemas
| Herramienta | Versión | Propósito | Instalación |
|---|---|---|---|
| Windows 10/11 | Cualq. | SO Objetivo (servicios usan sc) |
— |
| Go | 1.25+ | Compilador | go.dev/dl |
| Task | 3.x | Orquestación de compilación | taskfile.dev/installation |
| Git | Cualq. | Clonar repositorios | git-scm.com |
| PowerShell | 5.1+ | Scripts de compilación (nativo) | Integrado |
Abra PowerShell como Administrador y ejecute:
go version # Esperado: go1.25+
task --version # Esperado: Task version 3.x
git --version # Esperado: git version 2.x+
Los tres repositorios deben ser directorios hermanos (al mismo nivel) — el Taskfile hace referencia a
../scale-daemon y ../ticket-daemon en relación con poster-tuis.
# Crear directorio de trabajo
mkdir C:\dev\r2k
cd C:\dev\r2k
# Clonar los tres repositorios uno al lado del otro
git clone https://github.com/adcondev/poster-tuis.git
git clone https://github.com/adcondev/scale-daemon.git
git clone https://github.com/adcondev/ticket-daemon.git
Después de clonar, verifique esta estructura de directorios:
C:\dev\r2k\
├── poster-tuis\ ← Instalador TUI (este proyecto)
├── scale-daemon\ ← Demonio del servicio Scale/Báscula
└── ticket-daemon\ ← Demonio del servicio de impresora de Tickets
El Taskfile.yml requiere un archivo .env en la raíz de poster-tuis para hashear e inyectar las credenciales por
seguridad.
Cree un archivo .env en C:\dev\r2k\poster-tuis\.env con el siguiente contenido (ajuste los valores según su
entorno):
SCALE_DASHBOARD_PASSWORD=scale
SCALE_AUTH_TOKEN=mi_token_secreto
SCALE_PORT=8765
TICKET_DASHBOARD_PASSWORD=ticket
TICKET_AUTH_TOKEN=mi_token_secreto
TICKET_PORT=8766
cd C:\dev\r2k\poster-tuis
go mod tidy
cd C:\dev\r2k\scale-daemon
go mod tidy
cd C:\dev\r2k\ticket-daemon
go mod tidy
poster-tuis/
├── main.go # Punto de entrada (check de admin + tea.NewProgram)
├── go.mod # Definición del módulo
├── go.sum # Checksums de dependencias
├── Taskfile.yml # Orquestación de compilación
├── .env # Variables de seguridad (IGNORADO POR GIT)
├── .gitignore # Excluye bin/, dist/, internal/assets/bin/
│
├── internal/
│ ├── assets/
│ │ ├── assets.go # Directivas //go:embed para los 4 binarios de servicio
│ │ └── bin/ # ← Generado por Taskfile (ignorado por git)
│ │ ├── R2k_BasculaServicio_Local.exe
│ │ ├── R2k_BasculaServicio_Remote.exe
│ │ ├── R2k_TicketServicio_Local.exe
│ │ └── R2k_TicketServicio_Remote.exe
│ │
│ ├── config/
│ │ └── config.go # BuildDate/Time, GenerateServiceNames(), GetBanner()
│ │
│ ├── service/
│ │ ├── registry.go # Structs de variantes de servicio + GetServiceRegistry()
│ │ ├── manager.go # Instalar/Desinstalar/Iniciar/Detener/Reiniciar
│ │ ├── status.go # Enum de estatus + FamilyStatus (exclusividad mutua)
│ │ └── logs.go # Resolución de ruta de logs + abrir en Notepad/Explorer
│ │
│ └── ui/
│ ├── screens.go # Enum de estado de pantalla (6 pantallas)
│ ├── builders.go # Construcción de ítems de menú (impone exclusividad mutua)
│ ├── model.go # Struct del modelo + InitialModel() + ayudas de navegación
│ ├── update.go # Update() + manejadores de teclas por pantalla + ayudas de acción
│ ├── view.go # View() + renderizadores de las 6 pantallas
│ └── styles.go # Colores + estilos lipgloss
│
└── dist/ # ← Generado por Taskfile (ignorado por git)
└── R2k_POS_Instalador.exe # Salida final (~15-20MB)
main.go → internal/ui
internal/ui → internal/service, internal/config
internal/service → internal/assets, internal/config
internal/config → (solo stdlib)
internal/assets → (solo stdlib embed)
Todos los comandos se ejecutan desde el directorio poster-tuis.
cd C:\dev\r2k\poster-tuis
task clean:all
Salida esperada:
✅ Artefactos del instalador limpiados
✅ Todos los proyectos limpiados
Esto compila los 4 archivos .exe de servicio desde los repositorios hermanos y los coloca en internal/assets/bin/:
task installer:build:services
Salida esperada:
✅ Compilado R2k_BasculaServicio_Local.exe para el instalador
✅ Compilado R2k_BasculaServicio_Remote.exe para el instalador
✅ Compilado R2k_TicketServicio_Local.exe para el instalador
✅ Compilado R2k_TicketServicio_Remote.exe para el instalador
══════════════════════════════════════════════════════════════
✅ Todos los binarios de servicios están listos para integrarse
══════════════════════════════════════════════════════════════
Verificar:
Get-ChildItem .\internal\assets\bin\
# Esperado: 4 archivos .exe
# R2k_BasculaServicio_Local.exe
# R2k_BasculaServicio_Remote.exe
# R2k_TicketServicio_Local.exe
# R2k_TicketServicio_Remote.exe
Esto compila la TUI en Go, incrustando los 4 binarios de servicio dentro del ejecutable final:
task installer:build
Salida esperada:
══════════════════════════════════════════════════════════════
✅ COMPILACIÓN DEL INSTALADOR FINALIZADA
📁 Salida: C:\dev\r2k\poster-tuis\dist
══════════════════════════════════════════════════════════════
Verificar tamaño del archivo (debe ser de ~15-20MB porque contiene 4 binarios de servicio incrustados):
(Get-Item .\dist\R2k_POS_Instalador.exe).Length / 1MB
# Esperado: aproximadamente 15-20
task installer:rebuild
Esto ejecuta la limpieza de artefactos y luego reconstruye los binarios y el instalador final de forma secuencial.
La TUI requiere privilegios de administrador para operaciones con sc.exe (control de servicios de Windows). Si se
lanza sin permisos de admin, muestra un mensaje de error y sale.
Opción A: Método de clic derecho
- Navegue a la carpeta
dist\en el Explorador de Archivos. - Haga clic derecho en
R2k_POS_Instalador.exe. - Seleccione "Ejecutar como administrador".
Opción B: PowerShell como Admin
# Abra PowerShell como Administrador, luego:
cd C:\dev\r2k\poster-tuis
.\dist\R2k_POS_Instalador.exe
Opción C: CMD como Admin
:: Abra CMD como Administrador, luego:
cd C:\dev\r2k\poster-tuis
dist\R2k_POS_Instalador.exe
Al iniciarse, la TUI muestra:
╔═════════════════════════════════════════════╗
║ SERVICE FAMILY MANAGER v2.0 ║
║ Build: 2026-02-05 14:30:22 ║
║ ║
║ Gestión de Servicios Red2000 ║
║ - Scale Service (Local/Remote) ║
║ - Ticket Service (Local/Remote) ║
║ ║
╚═════════════════════════════════════════════╝
SELECCIONE UNA FAMILIA DE SERVICIOS
[1] Scale Service No instalado
[2] Ticket Service No instalado
[Q] Salir
scale: [-] | ticket: [-]
| Tecla | Acción |
|---|---|
↑ / k |
Mover arriba |
↓ / j |
Mover abajo |
Enter |
Seleccionar elemento |
r |
Reinicio rápido (pantalla de familia, servicio debe correr) |
ESC / q |
Volver atrás / Salir |
? |
Alternar ayuda |
Ctrl+C |
Forzar salida (pantalla de procesamiento) |
Dashboard (selector de familia)
├── Scale Service
│ ├── [Sin servicio instalado] → Instalar Local / Instalar Remote
│ └── [Servicio instalado] → Iniciar / Detener / Reiniciar / Logs / Desinstalar
│ └── Logs → Abrir Archivo / Abrir Carpeta
└── Ticket Service
└── (misma estructura que Scale)
Abra Services.msc (Win+R → services.msc) junto a la TUI para verificar.
| Paso | Acción | Esperado |
|---|---|---|
| 1 | Lanzar instalador | Dashboard muestra ambas familias como "No instalado" |
| 2 | Seleccionar "Scale Service" | Menú de familia muestra: "Instalar LOCAL", "Instalar REMOTE", "Volver" |
| 3 | Selecc. "Instalar Versión LOCAL" | Diálogo de confirmación: "¿Instalar versión Local de Scale?" |
| 4 | Presionar S para confirmar |
Pantalla de procesamiento con spinner + barra de progreso |
| 5 | Esperar a que complete | Resultado: "[+] Local instalado e iniciado correctamente" |
| 6 | Presionar Enter para seguir |
Menú de familia ahora muestra: Detener, Reiniciar, Ver Logs, Desinstalar, etc. |
| 7 | Verificar en Services.msc | Servicio R2k_BasculaServicio_Local existe, estado RUNNING (En ejecución) |
| Paso | Acción | Esperado |
|---|---|---|
| 1 | Con Scale Local instalado | Menú de familia NO muestra "Instalar REMOTE" |
| 2 | Selecc. "Desinstalar Local" → S |
Procesando → "[-] Local desinstalado correctamente" |
| 3 | Presionar Enter |
Menú muestra "Instalar LOCAL" e "Instalar REMOTE" de nuevo |
| 4 | Verificar en Services.msc | Servicio R2k_BasculaServicio_Local ya no existe |
| Paso | Acción | Esperado |
|---|---|---|
| 1 | Instalar Scale Local | Dashboard muestra "Scale Service: Local - [+] EN EJECUCION" |
| 2 | Volver, selecc. Ticket | Menú muestra opciones de instalación |
| 3 | Instalar Ticket Remote | Barra de estado del Dashboard: `scale: [+] Local |
| 4 | Verificar Services.msc | Ambos R2k_BasculaServicio_Local y R2k_TicketServicio_Remote existen |
| Paso | Acción | Esperado |
|---|---|---|
| 1 | Con un servicio corriendo | Menú muestra "Detener" y "Reiniciar" |
| 2 | Selecc. "Detener Servicio" | Resultado: "[OK] Detener Servicio completado" |
| 3 | Volver al menú | Menú ahora muestra "Iniciar" (Detener/Reiniciar desaparecen) |
| 4 | Selecc. "Iniciar Servicio" | Resultado: "[OK] Iniciar Servicio completado" |
| 5 | Presionar atajo r |
Reinicio se ejecuta directamente (sin selección de menú) |
| Paso | Acción | Esperado |
|---|---|---|
| 1 | Con un servicio instalado | Seleccionar "Ver Logs" desde menú de familia |
| 2 | Selecc. "Abrir Archivo de Logs" | Se abre el Bloc de notas con el archivo .log |
| 3 | Selecc. "Abrir Carpeta de Logs" | Se abre Explorer en %PROGRAMDATA%\{ServiceName}\ |
| 4 | Presionar ESC |
Regresa al menú de familia |
| Paso | Acción | Esperado |
|---|---|---|
| 1 | Dejar TUI abierta en pantalla de familia | El servicio se muestra como "RUNNING" |
| 2 | En Services.msc, clic derecho servicio → Stop | — |
| 3 | Esperar ~5 segundos | Menú TUI se auto-actualiza: "DETENIDO", muestra opción "Iniciar" |
| 4 | En Services.msc, clic derecho servicio → Start | — |
| 5 | Esperar ~5 segundos | Menú TUI se auto-actualiza: "EN EJECUCION", muestra "Detener/Reiniciar" |
| Paso | Acción | Esperado |
|---|---|---|
| 1 | Doble clic en R2k_POS_Instalador.exe (sin admin) |
Muestra "[!] Permisos de Administrador Requeridos" |
| 2 | Presionar Enter | La ventana se cierra |
| Error | Causa | Solución |
|---|---|---|
pattern bin/*.exe: no matching files found |
internal/assets/bin/ está vacío |
Ejecute task installer:build:services primero |
cannot find package ".../internal/assets" |
Módulo no resuelto | Ejecute go mod tidy en poster-tuis/ |
undefined: assets.BasculaLocalBinary |
Nombre de paquete erróneo | Verifique package assets (no package main) en assets.go |
config.ScaleBaseName undefined |
ldflags no se están inyectando | Revise que LDFLAGS_INSTALLER en Taskfile incluya -X '...ScaleBaseName=...' |
cannot find module providing package .../scale-daemon |
Ruta hermana incorrecta | Verifique que exista ../scale-daemon/ relativo a poster-tuis/ |
La compilación tiene éxito pero el .exe pesa ~5MB |
Falló la incrustación | Verifique que existan 4 archivos en internal/assets/bin/ antes de compilar |
Error cargando .env o faltan variables |
Archivo .env ausente |
Asegúrese de haber creado .env en el root del proyecto como se indicó |
| Síntoma | Causa | Solución |
|---|---|---|
| TUI muestra error de admin y sale | No se ejecuta como administrador | Clic derecho → Ejecutar como administrador |
| Instala con éxito pero servicio no inicia | Binario de servicio necesita dependencias | Revise el log del servicio en %PROGRAMDATA%\{ServiceName}\ |
| El estado muestra "DESCONOCIDO" | Servicio está en estado de transición | Espere unos segundos, el estado debería resolverse |
| Notepad abre pero el archivo está vacío | Servicio aún no ha escrito logs | Inicie el servicio y espere actividad |
# Eliminar todos los servicios instalados por la TUI (ejecutar como admin)
sc stop R2k_BasculaServicio_Local 2>$null
sc delete R2k_BasculaServicio_Local 2>$null
sc stop R2k_BasculaServicio_Remote 2>$null
sc delete R2k_BasculaServicio_Remote 2>$null
sc stop R2k_TicketServicio_Local 2>$null
sc delete R2k_TicketServicio_Local 2>$null
sc stop R2k_TicketServicio_Remote 2>$null
sc delete R2k_TicketServicio_Remote 2>$null
# Eliminar binarios instalados
Remove-Item -Recurse -Force "$env:ProgramFiles\R2k_*" -ErrorAction SilentlyContinue
# Limpiar artefactos de compilación
cd C:\dev\r2k\poster-tuis
task clean:all
# No deberían existir servicios R2k
sc query state= all | findstr "R2k_"
# Esperado: sin salida
# No deberían haber directorios R2k en Archivos de Programa
Get-ChildItem "$env:ProgramFiles\R2k_*"
# Esperado: sin resultados
# Sin artefactos de compilación
Test-Path .\dist\R2k_POS_Instalador.exe # Esperado: False
Test-Path .\internal\assets\bin\ # Esperado: False