Panel de control para kiosco con pantalla táctil en ZimaBoard 2 usando Docker (X.Org + Chromium)

Eva Wong es la Redactora Técnica y aficionada residente en ZimaSpace. Una geek de toda la vida con pasión por laboratorios caseros y software de código abierto, se especializa en traducir conceptos técnicos complejos en guías accesibles y prácticas. Eva cree que el autoalojamiento debe ser divertido, no intimidante. A través de sus tutoriales, empodera a la comunidad para desmitificar configuraciones de hardware, desde construir su primer NAS hasta dominar contenedores Docker.

Hola a todos,

Quería compartir cómo logré ejecutar un kiosco de pantalla táctil a pantalla completa en mi ZimaBoard 2 conectado a un monitor táctil de 22" vía HDMI.

Como ZimaOS no tiene gestor de paquetes (apt no existe), el truco es hacer todo dentro de contenedores Docker.

Mi configuración

ZimaBoard 2 1664 (Intel N100, 16 GB RAM)

ZimaOS v1.5.4

Monitor táctil de 22" vía HDMI + entrada táctil USB-C→USB-A

Una toma cercana de una torre Thermaltake Tower 900 blanca y roja, con iluminación LED azul personalizada y una vista detallada de los componentes internos, incluyendo un procesador Intel y memoria.

El enfoque

ZimaOS está basado en Buildroot — sin apt, sin Xorg, sin entorno de escritorio. En su lugar, ejecutamos un contenedor Debian con el controlador modesetting de Xorg + Chromium en modo kiosco, con /dev/dri pasado. Un contenedor nginx:alpine separado sirve los archivos del panel.

Paso 1 — Añade tu usuario al grupo docker

Abre el terminal web en http://your-zima-ip:7681 y ejecuta:

bash

sudo usermod -aG docker TU_NOMBRE_DE_USUARIO

Luego reconecta SSH para que el cambio tenga efecto.

Paso 2 — Crear los archivos

bash

mkdir -p /DATA/AppData/kiosk/dashboard

/DATA/AppData/kiosk/Dockerfile:

text

FROM debian:bookworm-slim
RUN echo 'deb http://deb.debian.org/debian bookworm-backports main' >> /etc/apt/sources.list
RUN apt-get update && \
apt-get install -y \
xserver-xorg-core \
xserver-xorg-input-libinput \
openbox chromium \
x11-xserver-utils xinit \
fonts-noto-core && \
apt-get install -y -t bookworm-backports libgl1-mesa-dri && \
rm -rf /var/lib/apt/lists/*
COPY xorg.conf /etc/X11/xorg.conf
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

¿Por qué backports Mesa? El Intel N100 (Alder Lake-N, ID PCI 0x46d4) solo es compatible desde Mesa 23.0+. Debian bookworm incluye la 22.3. Backports proporciona la 25.x.

/DATA/AppData/kiosk/xorg.conf:

text

Sección "Dispositivo"
Identificador "Intel"
Controlador "modesetting"
Opción "Método de aceleración" "ninguno"
EndSection

Sección "Pantalla"
Identificador "Predeterminado"
Dispositivo "Intel"
EndSection

Sección "Dispositivo de entrada"
Identificador "Pantalla táctil"
Controlador "libinput"
Opción "Dispositivo" "/dev/input/event8"
EndSection

Sección "Disposición del servidor"
Identificador "Predeterminado"
Pantalla "Predeterminado"
Dispositivo de entrada "Pantalla táctil" "CorePointer"
EndSection

Encuentra el número de evento de tu dispositivo táctil con:

bash

cat /proc/bus/input/devices | grep -A3 -i touch

/DATA/AppData/kiosk/entrypoint.sh:

text

#!/bin/sh
Xorg :0 vt1 -s 0 -dpms -nolisten tcp &
sleep 4
export DISPLAY=:0
xset s off && xset -dpms && xset s noblank
openbox --sm-disable &
sleep 1
exec chromium \
--kiosk --no-sandbox --disable-gpu \
--disable-dev-shm-usage \
--touch-events=enabled \
--no-first-run --disable-infobars \
"${KIOSK_URL:-http://localhost:8888}"

/DATA/AppData/kiosk/nginx.conf:

text

server {
listen 8888;
root /usr/share/nginx/html;
index index.html;
}

Coloca tus archivos HTML/CSS/JS del panel en /DATA/AppData/kiosk/dashboard/.

Vista desde arriba del servidor de placa única ZimaBoard, destacando su ranura de expansión PCIe, puertos Ethernet dobles y conectores SATA para integración en proyectos DIY.

Paso 3 — Construir y Ejecutar

Construir (nota: docker build necesita --config /tmp en ZimaOS):

bash

docker --config /tmp build -t kiosk:latest /DATA/AppData/kiosk

Servidor web del panel:

bash

docker --config /tmp run -d \
--name dashboard-server \
--restart unless-stopped \
--network host \
-v /DATA/AppData/kiosk/dashboard:/usr/share/nginx/html:ro \
-v /DATA/AppData/kiosk/nginx.conf:/etc/nginx/conf.d/default.conf:ro \
nginx:alpine

Pantalla Kiosk:

bash

docker --config /tmp run -d \
--name jarvis-kiosk \
--restart unless-stopped \
--privileged \
--network host \
-e KIOSK_URL=http://localhost:8888 \
-v /DATA/AppData/kiosk/xorg.conf:/etc/X11/xorg.conf:ro \
-v /DATA/AppData/kiosk/entrypoint.sh:/entrypoint.sh:ro \
-v /run/udev:/run/udev:ro \
kiosk:latest

Ambos contenedores tienen --restart unless-stopped para que sobrevivan a reinicios automáticamente.

Corrección de clic en pantalla táctil (¡importante!)

El libinput de Xorg mapea el tacto como eventos de puntero (ratón). Chromium luego aplica un umbral de movimiento pequeño para el clic — incluso un desplazamiento de dedo de 1px impide que se dispare. Si tu panel usa manejadores onclick, añade este JS para reemplazarlos con pointerup + un umbral de 20px:

js

(function touchFix() {
const downs = {};
document.addEventListener('pointerdown', e => {
downs[e.pointerId] = { x: e.clientX, y: e.clientY };
}, { passive: true });
function isTap(e) {
const d = downs[e.pointerId];
return !d || (Math.abs(e.clientX - d.x) < 20 && Math.abs(e.clientY - d.y) < 20);
}
función run(fn) { intenta { nuevo Function(fn)(); } captura(ex) {} }
función patchButtons(root) {
root.querySelectorAll('button[onclick]').forEach(btn => {
constante oc = btn.getAttribute('onclick');
btn.removeAttribute('onclick');
btn.addEventListener('pointerup', e => { e.stopPropagation(); if (isTap(e)) run(oc); });
});
}
window.addEventListener('load', () => {
document.querySelectorAll('.widget[onclick]').forEach(el => {
constante oc = el.getAttribute('onclick');
el.removeAttribute('onclick');
el.addEventListener('pointerup', e => { if (isTap(e) && !e.target.closest('button')) run(oc); });
});
patchButtons(document.body);
});
nuevo MutationObserver(muts => muts.forEach(m =>
m.addedNodes.forEach(n => { if (n.nodeType === 1) patchButtons(n); })
)).observe(document.body, { childList: true, subtree: true });
})();

También añade a tu CSS para ocultar el cursor del ratón en una pantalla táctil:

css

{ cursor: none !important; touch-action: manipulation; }

Un monitor táctil Pisichen de 22 pulgadas conectado a un ZimaBoard vía HDMI y USB, mostrando un panel personalizado de hogar inteligente con widgets interactivos.

Solución de problemas

Problema Solución
docker build falla con bandera desconocida Usa docker --config /tmp build …
Pantalla negra / Prueba básica de salida fallida Usa el modo Xorg, no Wayland/cage
Mesa no soporta N100 Instala libgl1-mesa-dri desde bookworm-backports
No se detecta entrada táctil Verifica el número de evento con /proc/bus/input/devices, actualiza xorg.conf
El panel muestra el inicio de sesión de ZimaOS El puerto 80 está ocupado por ZimaOS — usa un puerto diferente (el 888 funciona)

Mi configuración siempre activa de Home Assistant (Respuesta)

Construí una configuración eficiente en energía de asistente para el hogar disponible 24/7 sin que mi equipo principal consuma electricidad todo el tiempo. El arma secreta es un Zima que actúa como el cerebro siempre activo, mientras mi PC completa está en hibernación hasta que realmente se necesita.

El PC principal

Esto es lo que hay dentro de la máquina principal:

CPU: AMD Ryzen 9 9950X3D

Placa base: ASUS ROG Crosshair X870E Glacial

RAM: Acer Predator Hermes RGB DDR5 96GB (2×48GB) 6000MHz CL28

Almacenamiento: Crucial T710 4TB NVMe M.2 PCIe 5.0 Gen5

GPU (Gaming): ASUS ROG Astral GeForce RTX 5080 16GB

GPU (IA): Intel Arc Pro B70 32GB (esperando lanzamiento)

Fuente de poder: Corsair RM1200x

Gabinete: Thermaltake Tower 900

La configuración Zima (El centro siempre activo)

El Zima funciona 24/7 y maneja todo lo liviano — tareas de asistente doméstico, transmisiones de cámara, y consultas básicas de IA usando Groq free tier vía la nube.

Periféricos conectados directamente al Zima:

Monitor táctil Pisichen de 22" vía HDMI → adaptador miniDP + un cable USB-C para entrada táctil

Altavoces Edifier G1000 II a través de una tarjeta de sonido externa USB-A a 3.5mm

Micrófono DAMAO DGM20S vía USB-A

Almacenamiento:

Seagate IronWolf Pro 20TB — disco NAS ''agujero negro''

Seagate IronWolf Pro 1TB — disco principal NAS

Redes:

Zima conectado al router vía Ethernet

Un segundo cable Ethernet va directamente del Zima al PC para transferencias locales rápidas

Un espacio de trabajo de automatización del hogar completo con un quiosco con pantalla táctil potenciado por ZimaBoard, altavoces profesionales y un escritorio minimalista para monitoreo 24/7.

La parte inteligente: Wake-on-LAN

Aquí está la magia — cuando alguien hace una pregunta demasiado compleja para que Gemini la maneje bien, el Zima envía un paquete Wake-on-LAN para sacar al PC principal de la hibernación. Una vez activo, se conecta a un modelo LLM local de 70 mil millones de parámetros que corre en la Intel Arc Pro B70. Después de completar la tarea, el PC vuelve a dormir.

El resultado: un asistente doméstico que siempre responde, pero el equipo principal solo se activa cuando hay trabajo pesado que hacer. Las facturas de electricidad se mantienen razonables, y aún así tengo acceso a un modelo local realmente capaz cuando lo necesito.

Un enorme agradecimiento a Claude Code y Perplexity — honestamente, sin su ayuda nunca habría podido armar todo este proyecto por mi cuenta. Fueron invaluables durante todo el proceso.

Espero que esta información ayude a cualquiera lo suficientemente loco como para emprender un proyecto similar — ¡siéntete libre de compartirla donde quieras!

Centro de Campañas Zima

Más para leer

¿Qué es un servidor de IA local?
Apr 15, 2026Tutorials & Setup

¿Qué es un servidor de IA local?

Deja de pagar cuotas mensuales y de arriesgar fugas de datos con bots en la nube. Construye un servidor de IA local privado para...

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.