Painel de Controlo de Quiosque com Ecrã Tátil no ZimaBoard 2 usando Docker (X.Org + Chromium)

Eva Wong é a Redatora Técnica e entusiasta residente na ZimaSpace. Uma geek de longa data com paixão por homelabs e software de código aberto, ela é especialista em traduzir conceitos técnicos complexos em guias acessíveis e práticos. Eva acredita que a auto-hospedagem deve ser divertida, não intimidante. Através dos seus tutoriais, ela capacita a comunidade a desmistificar configurações de hardware, desde construir o seu primeiro NAS até dominar os contentores Docker.

Olá a todos,

Queria partilhar como consegui executar um quiosque de ecrã tátil em ecrã completo no meu ZimaBoard 2 ligado a um monitor tátil de 22" via HDMI.

Como o ZimaOS não tem gestor de pacotes (apt não existe), o truque é fazer tudo dentro de contentores Docker.

A Minha Configuração

ZimaBoard 2 1664 (Intel N100, 16 GB RAM)

ZimaOS v1.5.4

Monitor tátil de 22" via HDMI + entrada tátil USB-C→USB-A

Uma fotografia de perto de uma caixa de PC Thermaltake Tower 900 branca e vermelha, com iluminação LED azul personalizada e uma vista detalhada dos componentes internos, incluindo um processador Intel e memória.

A Abordagem

ZimaOS é baseado em Buildroot — sem apt, sem Xorg, sem ambiente de trabalho. Em vez disso, executamos um contentor Debian com o controlador Xorg modesetting + Chromium em modo quiosque, com /dev/dri passado. Um contentor nginx:alpine separado serve os ficheiros do painel.

Passo 1 — Adicione o seu utilizador ao grupo docker

Abra o terminal web em http://your-zima-ip:7681 e execute:

bash

sudo usermod -aG docker O_SEU_NOME_DE_UTILIZADOR

Depois volte a ligar o SSH para que a alteração tenha efeito.

Passo 2 — Criar os ficheiros

bash

mkdir -p /DATA/AppData/kiosk/dashboard

/DATA/AppData/kiosk/Dockerfile:

texto

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"]

Porque backports Mesa? O Intel N100 (Alder Lake-N, PCI ID 0x46d4) só é suportado a partir do Mesa 23.0+. O Debian bookworm inclui 22.3. Backports fornece 25.x.

/DATA/AppData/kiosk/xorg.conf:

texto

Secção "Dispositivo"
Identificador "Intel"
Controlador "modesetting"
Opção "MétodoAceleração" "nenhum"
EndSection

Secção "Ecrã"
Identificador "Predefinido"
Dispositivo "Intel"
EndSection

Secção "DispositivoDeEntrada"
Identificador "Ecrã tátil"
Controlador "libinput"
Opção "Dispositivo" "/dev/input/event8"
EndSection

Secção "DisposiçãoServidor"
Identificador "Predefinido"
Ecrã "Predefinido"
DispositivoDeEntrada "Ecrã tátil" "CorePointer"
EndSection

Encontre o número do evento do seu dispositivo tátil com:

bash

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

/DATA/AppData/kiosk/entrypoint.sh:

texto

#!/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:

texto

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

Coloque os seus ficheiros HTML/CSS/JS do painel em /DATA/AppData/kiosk/dashboard/.

Vista de cima do servidor de placa única ZimaBoard, destacando a sua ranhura de expansão PCIe, portas Ethernet duplas e conectores SATA para integração em projetos DIY.

Passo 3 — Construir e Executar

Construir (nota: docker build precisa de --config /tmp no ZimaOS):

bash

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

Servidor web do painel:

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

Ecrã do quiosque:

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 os contentores têm --restart unless-stopped para que sobrevivam a reinícios automaticamente.

Correção de Clique no Ecrã Tátil (importante!)

O libinput do Xorg mapeia o toque como eventos de ponteiro (mouse). O Chromium aplica então um pequeno limiar de movimento para clique — mesmo um deslocamento de 1px do dedo impede que ele dispare. Se o seu painel usa manipuladores onclick, adicione este JS para os substituir por pointerup + um limiar de 20px:

js

(função touchFix() {
constante downs = {};
document.addEventListener('pointerdown', e => {
downs[e.pointerId] = { x: e.clientX, y: e.clientY };
}, { passivo: true });
função isTap(e) {
constante d = downs[e.pointerId];
retornar !d || (Math.abs(e.clientX - d.x) < 20 && Math.abs(e.clientY - d.y) < 20);
}
função run(fn) { tente { novo Function(fn)(); } catch(ex) {} }
função 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);
});
novo MutationObserver(muts => muts.forEach(m =>
m.addedNodes.forEach(n => { if (n.nodeType === 1) patchButtons(n); })
)).observe(document.body, { childList: true, subtree: true });
})();

Adicione também ao seu CSS para esconder o cursor do rato num ecrã tátil:

css

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

Um monitor tátil Pisichen de 22 polegadas ligado a um ZimaBoard via HDMI e USB, exibindo um painel personalizado de casa inteligente com widgets interativos.

Resolução de problemas

Problema Corrigir
docker build falha com sinalizador desconhecido Use docker --config /tmp build …
Ecrã preto / Teste básico de saída falhou Use o modo Xorg, não Wayland/cage
Mesa não suporta N100 Instale libgl1-mesa-dri a partir dos bookworm-backports
Entrada tátil não detectada Verifique o número do evento com /proc/bus/input/devices, atualize o xorg.conf
O painel mostra o login do ZimaOS A porta 80 está ocupada pelo ZimaOS — use uma porta diferente (888 funciona)

A Minha Configuração Sempre Ligada do Home Assistant (Resposta)

Construí uma configuração eficiente em energia de assistente doméstico disponível 24/7 sem que o meu equipamento principal consuma eletricidade constantemente. A arma secreta é um Zima que atua como o cérebro sempre ligado, enquanto o meu PC completo fica em hibernação até ser realmente necessário.

O PC Principal

Aqui está o que há dentro da máquina principal:

CPU: AMD Ryzen 9 9950X3D

Placa-mãe: ASUS ROG Crosshair X870E Glacial

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

Armazenamento: 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 (à espera de lançamento)

Fonte de alimentação: Corsair RM1200x

Caixa: Thermaltake Tower 900

Configuração do Zima (O Hub Sempre Ligado)

O Zima funciona 24/7 e trata de tudo o que é leve — tarefas de assistente doméstico, feeds de câmaras e consultas básicas de IA usando o nível gratuito Groq via cloud.

Periféricos ligados diretamente ao Zima:

Monitor tátil Pisichen 22" via HDMI → adaptador miniDP + um cabo USB-C para entrada tátil

Colunas Edifier G1000 II através de uma placa de som externa USB-A para 3,5 mm

Microfone DAMAO DGM20S via USB-A

Armazenamento:

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

Seagate IronWolf Pro 1TB — disco principal NAS

Rede:

Zima ligado ao router via Ethernet

Segundo cabo Ethernet liga diretamente o Zima ao PC para transferências locais rápidas

Um espaço de trabalho de automação doméstica completo com um quiosque com ecrã tátil alimentado pelo ZimaBoard, colunas profissionais e uma secretária minimalista para monitorização 24/7.

A Parte Inteligente: Wake-on-LAN

Aqui está a magia — quando alguém faz uma pergunta demasiado complexa para o Gemini responder bem, o Zima envia um pacote Wake-on-LAN para tirar o PC principal da hibernação. Assim que está ativo, liga-se a um modelo LLM local de 70 mil milhões de parâmetros a correr na Intel Arc Pro B70. Depois de a tarefa estar concluída, o PC volta a dormir.

O resultado: um assistente doméstico sempre responsivo, mas o computador principal só acorda quando há trabalho pesado a fazer. As contas de eletricidade mantêm-se controladas, e ainda tenho acesso a um modelo local realmente capaz quando preciso.

Um enorme agradecimento a Claude Code e Perplexity — honestamente, sem a ajuda deles nunca teria conseguido concretizar este projeto sozinho. Foram indispensáveis durante todo o processo.

Espero que esta informação ajude quem for louco o suficiente para embarcar num projeto semelhante — sinta-se à vontade para partilhá-la onde quiser!

Centro de Campanha Zima

Mais para Ler

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.