Touchscreen-kioskpanel på ZimaBoard 2 med Docker (X.Org + Chromium)

Eva Wong är Teknisk skribent och den boende fixaren på ZimaSpace. En livslång nörd med en passion för hemma-labb och öppen källkod, hon specialiserar sig på att översätta komplexa tekniska koncept till tillgängliga, praktiska guider. Eva tror att självhosting ska vara roligt, inte skrämmande. Genom sina handledningar ger hon gemenskapen verktyg att avmystifiera hårdvaruinstallationer, från att bygga sin första NAS till att bemästra Docker-containrar.

Hej allihopa,

Jag ville dela med mig av hur jag fick en pekskärmskiosk i helskärm att fungera på min ZimaBoard 2 ansluten till en 22" pekskärm via HDMI.

Eftersom ZimaOS saknar paketchef (apt finns inte), är tricket att göra allt inuti Docker-containrar.

Min setup

ZimaBoard 2 1664 (Intel N100, 16 GB RAM)

ZimaOS v1.5.4

22" pekskärm via HDMI + USB-C→USB-A pekskärmsingång

En närbild av ett vitt och rött Thermaltake Tower 900 PC-chassi, med anpassad blå LED-belysning och en detaljerad vy av interna komponenter, inklusive en Intel-processor och minne.

Tillvägagångssättet

ZimaOS är Buildroot-baserat — ingen apt, ingen Xorg, inget skrivbordsmiljö. Istället kör vi en Debian-container med Xorg modesetting-drivrutin + Chromium i kiosk-läge, med /dev/dri vidarebefordrat. En separat nginx:alpine-container serverar dashboard-filerna.

Single board computer zimaboard2

Steg 1 — Lägg till din användare i docker-gruppen

Öppna webbterminalen på http://your-zima-ip:7681 och kör:

bash

sudo usermod -aG docker DITT_ANVÄNDARNAMN

Anslut sedan om SSH för att ändringen ska träda i kraft.

Steg 2 — Skapa filerna

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

Varför backports Mesa? Intel N100 (Alder Lake-N, PCI ID 0x46d4) stöds endast från Mesa 23.0+. Debian bookworm levererar 22.3. Backports erbjuder 25.x.

/DATA/AppData/kiosk/xorg.conf:

text

Sektion "Enhet"
Identifierare "Intel"
Drivrutin "modesetting"
Alternativ "AccelMethod" "ingen"
EndSection

Sektion "Skärm"
Identifierare "Standard"
Enhet "Intel"
EndSection

Sektion "InputDevice"
Identifierare "Touchscreen"
Drivrutin "libinput"
Alternativ "Enhet" "/dev/input/event8"
EndSection

Sektion "ServerLayout"
Identifierare "Standard"
Skärm "Standard"
Inmatningsenhet "Touchscreen" "CorePointer"
EndSection

Hitta ditt touch-enhetens eventnummer med:

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;
}

Lägg dina dashboard HTML/CSS/JS-filer i /DATA/AppData/kiosk/dashboard/.

Översikt ovanifrån av ZimaBoard enkortsdator, som visar dess PCIe expansionsplats, dubbla Ethernet-portar och SATA-kontakter för DIY-projektintegration.

Steg 3 — Bygg och Kör

Bygg (notera: docker build behöver --config /tmp på ZimaOS):

bash

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

Dashboard webbserver:

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

Kioskdisplay:

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

Båda containrarna har --restart unless-stopped så de överlever omstarter automatiskt.

Touchskärmsklick-fix (viktigt!)

Xorg:s libinput mappar touch som pekare (mus) händelser. Chromium tillämpar sedan en liten rörelsetröskel för klick — även en 1px fingerförskjutning förhindrar att det utlöses. Om din dashboard använder onclick-hanterare, lägg till denna JS för att ersätta dem med pointerup + en 20px tröskel:

js

(funktion touchFix() {
const downs = {};
document.addEventListener('pointerdown', e => {
downs[e.pointerId] = { x: e.clientX, y: e.clientY };
}, { passive: true });
funktion isTap(e) {
const d = downs[e.pointerId];
returnera !d || (Math.abs(e.clientX - d.x) < 20 && Math.abs(e.clientY - d.y) < 20);
}
funktion run(fn) { försök { ny Function(fn)(); } fånga(ex) {} }
funktion patchButtons(root) {
root.querySelectorAll('button[onclick]').forEach(btn => {
const oc = btn.getAttribute('onclick');
btn.removeAttribute('onclick');
btn.addEventListener('pointerup', e => { e.stopPropagation(); om (isTap(e)) run(oc); });
});
}
window.addEventListener('load', () => {
document.querySelectorAll('.widget[onclick]').forEach(el => {
const oc = el.getAttribute('onclick');
el.removeAttribute('onclick');
el.addEventListener('pointerup', e => { om (isTap(e) && !e.target.closest('button')) run(oc); });
});
patchButtons(document.body);
});
ny MutationObserver(muts => muts.forEach(m =>
m.addedNodes.forEach(n => { om (n.nodeType === 1) patchButtons(n); })
)).observe(document.body, { childList: true, subtree: true });
})();

Lägg också till i din CSS för att dölja muspekaren på en pekskärm:

css

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

En 22-tums Pisichen-pekskärm ansluten till en ZimaBoard via HDMI och USB, som visar en anpassad smart hem-instrumentpanel med interaktiva widgets.

Felsökning

Problem Åtgärd
docker build misslyckas med okänd flagga Använd docker --config /tmp build …
Svart skärm / Grundläggande utgångstest misslyckades Använd Xorg modesetting, inte Wayland/cage
Mesa stöder inte N100 Installera libgl1-mesa-dri från bookworm-backports
Pekskärmsinmatning upptäcks inte Kontrollera händelsenummer med /proc/bus/input/devices, uppdatera xorg.conf
Instrumentpanelen visar ZimaOS-inloggning Port 80 används av ZimaOS — använd en annan port (888 fungerar)

Min alltid aktiva Home Assistant-lösning (Svara)

Jag byggde en energieffektiv home assistant-lösning som är tillgänglig dygnet runt utan att min huvuddator drar ström hela tiden. Hemligheten är en Zima som fungerar som den alltid aktiva hjärnan, medan min fulla PC sover i viloläge tills den verkligen behövs.

Huvud-PC:n

Här är vad som finns i den primära maskinen:

CPU: AMD Ryzen 9 9950X3D

Moderkort: ASUS ROG Crosshair X870E Glacial

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

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

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

GPU (AI): Intel Arc Pro B70 32GB (väntar på lansering)

PSU: Corsair RM1200x

Chassi: Thermaltake Tower 900

Zima-uppsättningen (Den alltid påslagna hubben)

Zima körs 24/7 och hanterar allt lättviktigt — hemassistentuppgifter, kameraflöden och grundläggande AI-frågor med Groq gratisnivå via molnet.

Anslutna kringutrustningar direkt till Zima:

Pisichen 22" pekskärmsmonitor via HDMI → miniDP-adapter + en USB-C-kabel för pekinmatning

Edifier G1000 II högtalare via extern USB-A till 3,5 mm ljudkort

DAMAO DGM20S mikrofon via USB-A

Lagring:

Seagate IronWolf Pro 20TB — ”svarta hålet” NAS-enhet

Seagate IronWolf Pro 1TB — huvud-NAS-enhet

Nätverk:

Zima ansluten till routern via Ethernet

Andra Ethernet-kabeln går direkt från Zima till PC:n för snabba lokala överföringar

En omfattande hemautomationsarbetsplats med en ZimaBoard-driven pekskärmskiosk, professionella högtalare och en minimalistisk skrivbordsuppsättning för övervakning dygnet runt.

Den smarta delen: Wake-on-LAN

Här är magin — när någon ställer en fråga som är för komplex för att Gemini ska hantera bra, skickar Zima ett Wake-on-LAN-paket för att väcka huvud-PC:n ur viloläge. När den är igång ansluter den till en lokal 70B parameter LLM som körs på Intel Arc Pro B70. När uppgiften är klar går PC:n tillbaka till viloläge.

Resultatet: en hemassistent som alltid är lyhörd, men den stora riggen vaknar bara när det verkligen är tungt arbete som ska göras. Elräkningarna hålls rimliga, och jag får fortfarande tillgång till en riktigt kapabel lokal modell när jag behöver den.

Stort tack till Claude Code och Perplexity — ärligt talat, utan deras hjälp hade jag aldrig kunnat sätta ihop hela det här projektet på egen hand. De var ovärderliga genom hela processen.

Jag hoppas att denna information hjälper alla som är galna nog att ge sig på ett liknande projekt — dela gärna vidare var du vill!

Zima Kampanjnav

Mer att läsa

Köra Docker, CI/CD och 10+ självhostade tjänster på ZimaCube 2
Jun 17, 2026Buying Guides & Hardware

Köra Docker, CI/CD och 10+ självhostade tjänster på ZimaCube 2

Det här community-spotlightet visar ZimaCube 2-pionjären Michael Luckenbills fullständiga självhostade infrastrukturtest. Med över 10 Docker-containrar, lokal GitHub Actions CI/CD, dubbla ZFS HDD/NVMe-lagringspooler, dubbla 2,5GbE-nätverk...

Vad händer när två AI-agenter slåss om en server?
Jun 16, 2026Community & Stories

Vad händer när två AI-agenter slåss om en server?

Zero Noichis AI-säkerhetsexperiment använde två ZimaBoard 2-enheter för att simulera angripar- och försvaragenturer, vilket visade hur homelab-servrar kan stödja säker AI, Docker, NAS och...

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.