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

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/.

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

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

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

Dlaczego zastąpiłem serwery rackowe ZimaCube 2 — historia ewolucji homelabu
ZimaCube 2 zastępuje hałaśliwe serwery rackowe i ograniczone zestawy mini PC cichym, wszechstronnym homelabem do Dockera, pamięci ZFS, NVMe, kopii zapasowych, self-hostingu oraz całodobowej...

Uruchamianie Dockera, CI/CD i ponad 10 usług self-hosted na ZimaCube 2
W tym spotlight społecznościowym prezentujemy pełny test infrastruktury w pełni samodzielnie hostowanej przez pioniera ZimaCube 2, Michaela Luckenbilla. Urządzenie działa z ponad 10 kontenerami...

Co się dzieje, gdy dwaj agenci AI walczą o jeden serwer?
Eksperyment Zero Noichi z AI w dziedzinie cyberbezpieczeństwa wykorzystał dwa urządzenia ZimaBoard 2 do symulacji agentów atakujących i broniących, pokazując, jak serwery homelab mogą...

