Guía de Configuración de Impresión de Comandas

SamRestaurant2026 — Bridge de impresión local, multi-PC, redes separadas y certificados HTTPS

1. Cómo funciona la impresión

Cada PC del restaurante corre un servicio local llamado PrinterService (SamRestPrintBridgeWin), que expone dos puertos:

PuertoProtocoloUso
18181HTTPSiempre disponible. Usado para llamadas locales (misma PC) o entre PCs si el POS se sirve por HTTP.
18182HTTPSSolo activo si hay un certificado configurado. Necesario cuando el POS se sirve por HTTPS y se llama a otra PC (no localhost).

El sistema decide automáticamente a qué impresora enviar cada ítem de la comanda según la configuración de Dispositivos y el área/zona del producto — esto es independiente de desde qué PC se tomó la orden. Lo único que hay que configurar bien es la dirección (servicioImpresion) que le indica al sistema dónde vive físicamente cada impresora.

Punto clave El ruteo de "qué producto va a qué impresora" ya está resuelto por el sistema. El problema real a resolver es siempre de conectividad de red: que la PC que genera la comanda pueda alcanzar la PC que tiene la impresora conectada.

2. Instalación base del PrinterService Base — aplica a toda PC

Estos son los pasos estándar para instalar el PrinterService como servicio de Windows en cualquier PC, independientemente del escenario de red que se use después (secciones 4 a 8). Ejecutar todo en PowerShell/CMD como Administrador.

2.1 Prerrequisito: .NET 10 Hosting Bundle

Antes de instalar el servicio, debe estar instalado el .NET 10 Hosting Bundle en la PC (incluye el runtime de ASP.NET Core necesario para que SamRestPrintBridgeWin.exe pueda ejecutarse). Descargar desde el sitio oficial de .NET e instalar antes de continuar.

Debes descargar el Printer Service en la PC desde esta ruta Printer Service

2.2 Copiar los archivos del servicio

Copiar el ejecutable y sus dependencias a una carpeta fija en la PC, ej. C:\printerservice\.

2.3 Crear el servicio de Windows

sc create SamRestPrintBridgeWin binPath= "C:\printerservice\SamRestPrintBridgeWin.exe" start= auto displayname= "Print Bridge Service"

2.4 Configurar reinicio automático ante fallas

Para que el servicio se reinicie solo si llega a caerse inesperadamente:

sc failure SamRestPrintBridgeWin reset= 0 actions= restart/60000/restart/60000/restart/60000

2.5 Generar certificado autofirmado (punto de partida)

Este certificado autofirmado habilita el puerto 18182 (HTTPS) de forma básica. Es válido como punto de partida rápido, aunque el navegador mostrará advertencia de "certificado no confiable" al llamarlo desde otra PC — si eso es un problema para el cliente, revisar las alternativas de certificado confiado en las secciones 7 y 8.

$cert = New-SelfSignedCertificate -DnsName "localhost" -CertStoreLocation "Cert:\CurrentUser\My"
$password = ConvertTo-SecureString -String "123456" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath "C:\printerservice\certificate.pfx" -Password $password
Nota de seguridad Usar una contraseña más robusta que 123456 en instalaciones reales, y guardarla junto con la configuración del cliente en un lugar seguro (no en texto plano compartido).

2.6 Abrir los puertos en el firewall de Windows

New-NetFirewallRule -DisplayName "PrintService Rest" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 18181
New-NetFirewallRule -DisplayName "PrintService Rest" -Direction Outbound -Action Allow -Protocol TCP -LocalPort 18181

New-NetFirewallRule -DisplayName "PrintService Rest 2" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 18182
New-NetFirewallRule -DisplayName "PrintService Rest 2" -Direction Outbound -Action Allow -Protocol TCP -LocalPort 18182
Opcional — acotar el alcance de la regla Estas reglas abren el puerto para cualquier origen. Si se quiere limitar a IPs específicas (ej. solo las otras PCs del restaurante o solo la IP de Tailscale), se puede agregar -RemoteAddress <ip-o-rango> a cada regla para reducir superficie de exposición.

2.7 Iniciar el servicio

sc start SamRestPrintBridgeWin

2.8 Detener el servicio

sc stop SamRestPrintBridgeWin

2.9 Reinstalar el servicio (ej. tras actualizar el ejecutable)

sc stop SamRestPrintBridgeWin
sc delete SamRestPrintBridgeWin

Luego repetir desde el paso 2.3 (sc create) para volver a registrarlo.

3. Diagnóstico de problemas comunes

Error: ERR_CONNECTION_REFUSED en 18181 o 18182

Significa que el navegador no pudo conectar a ese puerto en esa IP. Causas típicas:

Error: "No se pudo abrir la impresora 'NOMBRE'"

Este error no es de red ni del bridge — es de Windows. Significa que el nombre de impresora configurado en el Dispositivo (ej. TICKETS) no coincide exactamente con el nombre real de la impresora instalada en esa PC. Verificar en Configuración → Impresoras y escáneres de Windows el nombre exacto y compararlo con el campo configurado en el sistema.

Antes de cualquier configuración de red Verifica primero que la impresora imprime bien desde la propia PC (localhost) antes de intentar resolver el escenario multi-PC. Si falla en localhost, el problema es de Windows/controlador, no de red.

4. Escenario: 1 sola PC

Es el caso más simple: el POS y el PrinterService corren en la misma máquina. Todas las llamadas van a 127.0.0.1:18181 (o 18182 si el POS es HTTPS). No requiere ninguna configuración de red adicional — 127.0.0.1/localhost tiene una excepción especial en los navegadores que permite llamadas HTTP desde una página HTTPS sin bloqueo de "mixed content".

5. Escenario: varias PCs en la misma red local

Si las PCs están en la misma red/subred y sí se ven entre sí, la configuración es directa:

  1. Asignar IP fija a cada PC con impresora conectada (evitar DHCP dinámico, para que la IP no cambie).
  2. En cada Dispositivo del sistema, configurar servicioImpresion con la IP LAN de la PC dueña de esa impresora, ej. http://192.168.1.15:18181.
  3. Verificar que el firewall de Windows de cada PC permita conexiones entrantes al puerto 18181 (y 18182 si aplica) desde la red local — ver sección 2.6.
  4. Probar desde el navegador de otra PC: http://192.168.1.15:18181/health debe responder {"ok": true, ...}.
Si el POS se sirve por HTTPS Las llamadas HTTP hacia la IP de otra PC (no localhost) serán bloqueadas por "mixed content" del navegador. En ese caso hay que usar 18182 con un certificado válido — ver las secciones 7 y 8.

6. Escenario: PCs en redes o VLANs separadas Avanzado

Este es el caso de restaurantes con varias zonas (ej. sushi, terraza, bar), cada una con su propia PC y su propia VLAN por razones de seguridad, donde las PCs no se ven entre sí a nivel de red.

[VLAN Zona A] [VLAN Zona B] [VLAN Zona C] PC-A ---X--- (bloqueado) ---X--- PC-B ---X--- PC-C PrinterService PrinterService PrinterService

Sin conectividad de red entre las PCs, cualquier comanda que deba imprimirse en la zona de otra PC queda atrapada reintentando en la cola local (cada 8 segundos) sin éxito, porque no hay ruta de red — no es un problema transitorio.

Importante No existe ningún mecanismo interno del PrinterService que "salte" la restricción de red por sí solo. El problema debe resolverse a nivel de infraestructura de red, con una de las dos soluciones siguientes.

7. Solución: Tailscale (VPN mesh) Recomendado

Tailscale crea una red privada virtual entre los dispositivos que instales, sin importar en qué VLAN física estén — solo necesitan salida a internet (no requiere abrir puertos entrantes, usa NAT traversal). Además incluye una función integrada para emitir certificados HTTPS reales (Let's Encrypt) por dispositivo, sin necesidad de dominio propio.

7.1 Instalación básica

  1. Crear una cuenta en Tailscale (el plan gratuito alcanza para pocos dispositivos por cliente).
  2. Instalar Tailscale en cada PC que necesite participar (con o sin PrinterService) y unirlas a la misma tailnet.
  3. En el panel de administración, activar MagicDNS y HTTPS Certificates (Settings → DNS / Settings → HTTPS Certificates).
  4. Configurar Tailscale para arrancar sin sesión de usuario ("Run unattended" en Windows) para que sobreviva a reinicios.

7.2 Generar el certificado

En la PC que tiene el PrinterService, desde una consola:

tailscale cert nombre-pc.tu-tailnet.ts.net

Esto genera un .crt/.key válido y confiado por cualquier navegador, sin advertencias. Se convierte a formato .pfx (con openssl pkcs12 o similar) para usarlo en el bridge:

openssl pkcs12 -export -out bridge.pfx -inkey nombre-pc.tu-tailnet.ts.net.key -in nombre-pc.tu-tailnet.ts.net.crt

7.3 Configurar el bridge

En el appsettings.json de SamRestPrintBridgeWin (mismo archivo de configuración usado en la instalación base, sección 2):

{
  "CertificadoConfig": {
    "Path": "C:\\printerservice\\certs\\bridge.pfx",
    "Password": "tu-contraseña"
  }
}

Reiniciar el servicio (sección 2.7/2.8) para que tome el certificado nuevo.

7.4 Configurar los Dispositivos en el sistema

En cada Dispositivo que dependa de una impresora en otra PC, configurar servicioImpresion con el nombre MagicDNS de la PC dueña:

https://nombre-pc.tu-tailnet.ts.net:18182

7.5 Restringir el acceso (ACLs)

En el panel de Tailscale, definir reglas de ACL que permitan tráfico solo al puerto 18182 (y 18181 si se usa) entre las PCs específicas que lo necesiten — mantiene el mismo nivel de aislamiento por seguridad que ya tenían entre VLANs, solo habilita ese flujo puntual y auditado.

Por qué funciona sin abrir el firewall entre VLANs Tailscale solo necesita que cada PC tenga salida a internet (la misma que ya usan para llegar al servidor central del POS). No requiere ninguna regla de ruteo entre las VLANs internas.

7.1 Variante: un solo PrinterService recibiendo desde varias PCs

Si el restaurante tiene una sola PC con impresoras conectadas y varias PCs de POS que solo envían trabajos de impresión (sin impresora propia), la configuración se simplifica:

¿Quién necesita qué?PC con PrinterService (servidor)PCs que solo imprimen hacia ella (clientes)
Instalar TailscaleSí — todas deben estar en la misma tailnet para poder alcanzar la IP virtual del servidor
Certificado (tailscale cert)Sí, uno soloNo necesitan certificado propio, solo confían en el del servidor automáticamente
Configurar CertificadoConfigNo aplica
Configurar servicioImpresion en DispositivosNo aplicaSí, apuntando a https://pc-servidor.tailnet.ts.net:18182
Punto importante El certificado resuelve la confianza, pero no la conectividad. Aunque solo una PC exponga el certificado, todas las PCs que necesiten llegar a ella deben estar unidas a la misma tailnet — una IP de Tailscale solo es alcanzable por otros miembros de esa misma tailnet.

8. Alternativa: Let's Encrypt con dominio propio + win-acme Sin dependencia de terceros

Si prefieren no depender de Tailscale solo para el certificado, y ya tienen un dominio propio (ej. midominio.com), pueden emitir un certificado real de Let's Encrypt para un subdominio que apunte a la PC — aunque esa PC nunca sea alcanzable públicamente desde internet.

8.1 Cómo funciona

  1. Crear un subdominio en el proveedor DNS, ej. pc-impresora.midominio.com (no necesita resolver a una IP pública real).
  2. Validar el dominio con el reto DNS-01 — solo requiere crear un registro TXT temporal en la zona DNS, no requiere abrir el puerto 80/443 a internet.
  3. En la PC local, agregar una entrada en C:\Windows\System32\drivers\etc\hosts que resuelva ese subdominio a la IP local/privada de la PC.
  4. El navegador valida el certificado contra la cadena de Let's Encrypt (ya confiada de fábrica) — no le importa que la IP real sea privada, solo verifica nombre + cadena + vigencia.

8.2 Instalar win-acme

Descargar la versión "pluggable" desde github.com/win-acme/win-acme y descomprimir en una carpeta fija, ej. C:\win-acme\. Es portable, no requiere instalación.

8.3 Conseguir credenciales de tu proveedor DNS

Necesitan un API token con permiso de editar registros DNS de la zona (Cloudflare, Route53, GoDaddy, etc.), según dónde esté alojado el dominio. Win-acme trae plugins para los proveedores más comunes.

8.4 Emitir el certificado (asistente interactivo)

Ejecutar wacs.exe como Administrador:

  1. Menú principal → N (Create certificate, full options).
  2. Tipo de target: manual input → escribir el hostname (ej. pc-impresora.midominio.com).
  3. Validación: elegir DNS-01 → seleccionar el plugin del proveedor DNS → pegar el API token.
  4. Store: elegir PFX file → indicar carpeta de salida y contraseña del PFX.
  5. Installation steps: agregar un paso Script (ver 8.6, es el paso crítico).
  6. Confirmar — win-acme valida el dominio, emite el certificado y genera el .pfx.

8.5 Apuntar el bridge al certificado

{
  "CertificadoConfig": {
    "Path": "C:\\printerservice\\certs\\pc-impresora.midominio.com.pfx",
    "Password": "la-contraseña-que-elegiste"
  }
}

Reiniciar el servicio SamRestPrintBridgeWin (sección 2.7/2.8) una vez para que lo cargue.

8.6 El paso crítico: recargar el certificado tras cada renovación

Por qué es necesario El bridge carga el certificado una sola vez, al iniciar. No detecta cambios en el archivo .pfx en disco. Si no se reinicia el servicio tras cada renovación (cada ~90 días), seguirá sirviendo el certificado viejo hasta que expire.

En el paso "Installation" del asistente, configurar un plugin Script:

Win-acme ejecuta este script automáticamente cada vez que emite o renueva el certificado.

8.7 Renovación automática

Al terminar el asistente, win-acme crea por sí mismo una tarea programada en el Programador de Tareas de Windows que corre wacs.exe --renew una o dos veces al día. Esa tarea:

Recomendable elegir, durante el asistente, que la tarea corra como cuenta SYSTEM, para asegurar permisos de reiniciar el servicio sin depender de una sesión de usuario activa.

8.8 Probar el flujo sin esperar 90 días

wacs.exe --renew --forcerenew

Fuerza una renovación inmediata, ejecuta de nuevo el script de reinicio, y permite confirmar que todo el pipeline funciona antes de confiar en el ciclo automático real.

9. Tabla comparativa de opciones de certificado

Opción Requiere dominio propio Confianza del navegador Resuelve conectividad entre VLANs Renovación Complejidad inicial
Autofirmado (instalación base, sección 2.5) No ❌ Advertencia en navegador ❌ No Manual Baja
mkcert No ⚠️ Solo si se instala la CA local en cada PC ❌ No Larga duración, manual Baja
Tailscale (tailscale cert) No ✅ Confiado (Let's Encrypt vía Tailscale) ✅ Sí, incluida Automática Media
Let's Encrypt propio + win-acme ✅ Confiado (Let's Encrypt real) ❌ No (solo certificado, no conectividad) Automática (con script de reinicio) Media-alta

10. Checklist final para el distribuidor

  1. Instalar el .NET 10 Hosting Bundle y realizar la instalación base del PrinterService (sección 2) en cada PC.
  2. ¿Todas las impresoras funcionan bien en localhost desde su propia PC? Si no, resolver primero el nombre de impresora/driver de Windows antes de tocar la red.
  3. ¿Todas las PCs están en la misma red? → usar configuración LAN directa (sección 5).
  4. ¿Hay VLANs/redes separadas por seguridad? → evaluar si se puede pedir una regla de firewall puntual (solo puerto 18181/18182 entre las IPs específicas) antes de sumar infraestructura nueva.
  5. Si no es posible abrir el firewall entre VLANs → instalar Tailscale en las PCs involucradas (sección 7).
  6. ¿El POS del cliente se sirve por HTTPS? → siempre se necesitará certificado válido en 18182 para llamadas entre PCs distintas (no aplica para localhost).
  7. Elegir certificado: Tailscale cert (más simple, recomendado) o Let's Encrypt propio + win-acme (si prefieren no depender de un tercero y ya tienen dominio).
  8. Configurar servicioImpresion en cada Dispositivo con la dirección correcta (IP LAN, o nombre MagicDNS/dominio según la opción elegida).
  9. Probar /health desde el navegador de cada PC hacia cada destino antes de dar por cerrada la instalación.
  10. Configurar el arranque automático de todos los servicios (PrinterService con start= auto y reinicio ante fallas, Tailscale) para que sobrevivan a reinicios sin intervención manual.