Panel kiosku z ekranem dotykowym na ZimaBoard 2 z użyciem Dockera (X.Org + Chromium)

Eva Wong jest Technicznym pisarzem i stałym majsterkowiczem w ZimaSpace. Całe życie geek z pasją do homelabów i oprogramowania open-source, specjalizuje się w tłumaczeniu skomplikowanych koncepcji technicznych na przystępne, praktyczne przewodniki. Eva wierzy, że samodzielne hostowanie powinno być zabawą, a nie czymś onieśmielającym. Poprzez swoje samouczki umożliwia społeczności rozwiewanie tajemnic konfiguracji sprzętu, od budowy pierwszego NAS po opanowanie kontenerów Docker.

Cześć wszystkim,

Chciałem podzielić się, jak uruchomiłem kiosk na pełnym ekranie z ekranem dotykowym na moim ZimaBoard 2 podłączonym do 22-calowego monitora dotykowego przez HDMI.

Ponieważ ZimaOS nie ma menedżera pakietów (apt nie istnieje), trik polega na robieniu wszystkiego wewnątrz kontenerów Docker.

Moja konfiguracja

ZimaBoard 2 1664 (Intel N100, 16 GB RAM)

ZimaOS v1.5.4

22-calowy monitor dotykowy przez HDMI + USB-C→USB-A wejście ekranu dotykowego

Zbliżenie na białą i czerwoną obudowę Thermaltake Tower 900, z niestandardowym niebieskim podświetleniem LED i szczegółowym widokiem wewnętrznych komponentów, w tym procesora Intel i pamięci.

Podejście

ZimaOS jest oparty na Buildroot — bez apt, bez Xorg, bez środowiska graficznego. Zamiast tego uruchamiamy kontener Debiana z Xorg i sterownikiem modesetting oraz Chromium w trybie kiosku, z przekazaniem /dev/dri. Osobny kontener nginx:alpine serwuje pliki dashboardu.

Krok 1 — Dodaj swojego użytkownika do grupy docker

Otwórz terminal webowy pod adresem http://your-zima-ip:7681 i uruchom:

bash

sudo usermod -aG docker TWOJA_NAZWA_UŻYTKOWNIKA

Następnie ponownie połącz się przez SSH, aby zmiany zaczęły działać.

Krok 2 — Utwórz pliki

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

Dlaczego backporty Mesa? Intel N100 (Alder Lake-N, PCI ID 0x46d4) jest obsługiwany dopiero od Mesa 23.0+. Debian bookworm zawiera wersję 22.3. Backporty dostarczają 25.x.

/DATA/AppData/kiosk/xorg.conf:

text

Sekcja "Urządzenie"
Identyfikator "Intel"
Sterownik "modesetting"
Opcja "MetodaPrzyspieszenia" "brak"
EndSection

Sekcja "Ekran"
Identyfikator "Domyślny"
Urządzenie "Intel"
EndSection

Sekcja "UrządzenieWejściowe"
Identyfikator "Ekran dotykowy"
Sterownik "libinput"
Opcja "Urządzenie" "/dev/input/event8"
EndSection

Sekcja "UkładSerwera"
Identyfikator "Domyślny"
Ekran "Domyślny"
Urządzenie wejściowe "Ekran dotykowy" "CorePointer"
EndSection

Znajdź numer zdarzenia swojego urządzenia dotykowego za pomocą:

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

Umieść pliki HTML/CSS/JS pulpitu w /DATA/AppData/kiosk/dashboard/.

Widok z góry na serwer jednopłytkowy ZimaBoard, podkreślający jego slot rozszerzeń PCIe, podwójne porty Ethernet oraz złącza SATA do integracji projektów DIY.

Krok 3 — Buduj i uruchom

Buduj (uwaga: docker build wymaga --config /tmp na ZimaOS):

bash

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

Serwer WWW pulpitu:

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

Wyświetlacz kiosku:

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

Oba kontenery mają --restart unless-stopped, więc automatycznie przetrwają ponowne uruchomienia.

Poprawka kliknięcia na ekranie dotykowym (ważne!)

Libinput Xorg mapuje dotyk jako zdarzenia wskaźnika (myszy). Chromium stosuje wtedy minimalny próg ruchu dla kliknięcia — nawet 1px przesunięcie palca uniemożliwia jego wywołanie. Jeśli Twój pulpit używa obsługi onclick, dodaj ten JS, aby zastąpić je pointerup + próg 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);
}
function run(fn) { try { nowa Function(fn)(); } catch(ex) {} }
function patchButtons(root) {
root.querySelectorAll('button[onclick]').forEach(btn => {
const 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 => {
const oc = el.getAttribute('onclick');
el.removeAttribute('onclick');
el.addEventListener('pointerup', e => { if (isTap(e) && !e.target.closest('button')) run(oc); });
});
patchButtons(document.body);
});
nowy MutationObserver(muts => muts.forEach(m =>
m.addedNodes.forEach(n => { if (n.nodeType === 1) patchButtons(n); })
)).observe(document.body, { childList: true, subtree: true });
})();

Dodaj także do swojego CSS, aby ukryć kursor myszy na ekranie dotykowym:

css

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

22-calowy monitor dotykowy Pisichen podłączony do ZimaBoard przez HDMI i USB, wyświetlający niestandardowy pulpit inteligentnego domu z interaktywnymi widżetami.

Rozwiązywanie problemów

Problem Naprawa
docker build kończy się nieznaną flagą Użyj docker --config /tmp build …
Czarny ekran / podstawowy test wyjścia nie powiódł się Użyj Xorg modesetting, nie Wayland/cage
Mesa nie obsługuje N100 Zainstaluj libgl1-mesa-dri z bookworm-backports
Nie wykryto dotyku Sprawdź numer zdarzenia za pomocą /proc/bus/input/devices, zaktualizuj xorg.conf
Panel pokazuje logowanie do ZimaOS Port 80 jest zajęty przez ZimaOS — użyj innego portu (działa 888)

Mój zawsze aktywny system Home Assistant (Odpowiedź)

Zbudowałem energooszczędny system asystenta domowego, który działa 24/7, bez konieczności ciągłego zużywania prądu przez mój główny komputer. Sekretną bronią jest Zima, która działa jako zawsze aktywny mózg, podczas gdy mój pełny PC śpi w hibernacji, dopóki nie jest naprawdę potrzebny.

Główny PC

Oto, co znajduje się w głównym komputerze:

Procesor: AMD Ryzen 9 9950X3D

Płyta główna: ASUS ROG Crosshair X870E Glacial

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

Pamięć masowa: Crucial T710 4TB NVMe M.2 PCIe 5.0 Gen5

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

GPU (AI): Intel Arc Pro B70 32GB (w oczekiwaniu na premierę)

Zasilacz: Corsair RM1200x

Obudowa: Thermaltake Tower 900

Konfiguracja Zimy (Zawsze Włączony Hub)

Zima działa 24/7 i obsługuje wszystko, co lekkie — zadania asystenta domowego, strumienie z kamer oraz podstawowe zapytania AI za pomocą bezpłatnego poziomu Groq w chmurze.

Podłączone peryferia bezpośrednio do Zimy:

Monitor dotykowy Pisichen 22" przez adapter HDMI → miniDP + jeden kabel USB-C do obsługi dotyku

Głośniki Edifier G1000 II podłączone przez zewnętrzną kartę dźwiękową USB-A na 3,5 mm

Mikrofon DAMAO DGM20S przez USB-A

Pamięć masowa:

Seagate IronWolf Pro 20TB — dysk NAS „czarna dziura”

Seagate IronWolf Pro 1TB — główny dysk NAS

Sieć:

Zima podłączona do routera przez Ethernet

Drugi kabel Ethernet biegnie bezpośrednio od Zimy do komputera dla szybkich lokalnych transferów

Kompleksowe stanowisko automatyki domowej z kioskiem z ekranem dotykowym zasilanym przez ZimaBoard, profesjonalnymi głośnikami i minimalistycznym biurkiem do monitoringu 24/7.

Inteligentna część: Wake-on-LAN

Oto magia — gdy ktoś zada pytanie zbyt skomplikowane dla Gemini, Zima wysyła pakiet Wake-on-LAN, aby wybudzić główny komputer ze stanu hibernacji. Gdy już jest aktywny, łączy się z lokalnym modelem LLM o 70 miliardach parametrów działającym na Intel Arc Pro B70. Po wykonaniu zadania komputer wraca do uśpienia.

Efekt: asystent domowy, który zawsze reaguje, ale duża maszyna budzi się tylko wtedy, gdy trzeba wykonać naprawdę ciężką pracę. Rachunki za prąd pozostają rozsądne, a ja wciąż mam dostęp do naprawdę wydajnego lokalnego modelu, gdy go potrzebuję.

Wielkie podziękowania dla Claude Code i Perplexity — szczerze, bez ich pomocy nigdy nie udałoby mi się samodzielnie zrealizować całego tego projektu. Byli nieocenieni przez cały czas.

Mam nadzieję, że te informacje pomogą każdemu, kto jest na tyle szalony, by podjąć się podobnego projektu — śmiało dzielcie się nimi gdzie tylko chcecie!

Centrum Kampanii Zima

Więcej do przeczytania

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.