Docker (X.Org + Chromium)를 사용한 ZimaBoard 2 터치스크린 키오스크 대시보드

에바 왕기술 작가상주 장인 ZimaSpace에서. 평생을 바친 기크로서 홈랩과 오픈소스 소프트웨어에 열정을 가지고 있으며, 복잡한 기술 개념을 쉽게 따라 할 수 있는 가이드로 번역하는 데 전문성을 갖추고 있습니다.에바는 셀프 호스팅이 어렵지 않고 재미있어야 한다고 믿습니다. 그녀의 튜토리얼을 통해 커뮤니티가 하드웨어 설정의 신비를 풀도록첫 NAS 구축부터 Docker 컨테이너 마스터링까지 돕습니다.

안녕하세요,

HDMI로 연결된 22인치 터치 모니터에서 ZimaBoard 2를 사용해 전체 화면 터치스크린 키오스크를 실행하는 방법을 공유하고 싶었습니다.

ZimaOS에는 패키지 관리자가 없기 때문에(apt가 없습니다), 모든 작업을 도커 컨테이너 내에서 수행하는 것이 핵심입니다.

내 설정

ZimaBoard 2 1664 (인텔 N100, 16 GB RAM)

ZimaOS v1.5.4

HDMI + USB-C→USB-A 터치스크린 입력을 지원하는 22인치 터치 모니터

화이트와 레드 색상의 Thermaltake Tower 900 PC 케이스 클로즈업 사진으로, 맞춤형 블루 LED 조명과 인텔 프로세서 및 메모리를 포함한 내부 부품이 자세히 보입니다.

접근 방식

ZimaOS는 Buildroot 기반입니다 — apt, Xorg, 데스크탑 환경이 없습니다. 대신, Xorg modesetting 드라이버와 크롬을 키오스크 모드로 실행하는 데비안 컨테이너를 사용하며 /dev/dri를 전달합니다. 별도의 nginx:alpine 컨테이너가 대시보드 파일을 제공합니다.

1단계 — 사용자를 도커 그룹에 추가하기

웹 터미널을 http://your-zima-ip:7681 에서 열고 다음을 실행하세요:

bash

sudo usermod -aG docker YOUR_USERNAME

변경 사항을 적용하려면 SSH를 다시 연결하세요.

2단계 — 파일 생성하기

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

왜 메사를 백포트하나요? 인텔 N100 (Alder Lake-N, PCI ID 0x46d4)은 메사 23.0+부터 지원됩니다. 데비안 북웜은 22.3을 제공합니다. 백포트는 25.x를 제공합니다.

/DATA/AppData/kiosk/xorg.conf:

text

섹션 "장치"
식별자 "인텔"
드라이버 "modesetting"
옵션 "가속방법" "없음"
EndSection

섹션 "화면"
식별자 "기본"
장치 "인텔"
EndSection

섹션 "입력장치"
식별자 "터치스크린"
드라이버 "libinput"
옵션 "장치" "/dev/input/event8"
EndSection

섹션 "서버레이아웃"
식별자 "기본"
화면 "기본"
입력장치 "터치스크린" "코어포인터"
EndSection

다음 명령어로 터치 장치 이벤트 번호를 찾으세요:

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

대시보드 HTML/CSS/JS 파일을 /DATA/AppData/kiosk/dashboard/에 넣으세요.

ZimaBoard 싱글 보드 서버의 상단 뷰로, PCIe 확장 슬롯, 듀얼 이더넷 포트, DIY 프로젝트 통합용 SATA 커넥터를 강조합니다.

3단계 — 빌드 및 실행

빌드 (참고: ZimaOS에서는 docker build에 --config /tmp가 필요합니다):

bash

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

대시보드 웹 서버:

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

키오스크 디스플레이:

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

두 컨테이너 모두 --restart unless-stopped 옵션이 있어 재부팅 후에도 자동으로 실행됩니다.

터치스크린 클릭 수정 (중요!)

Xorg의 libinput은 터치를 포인터(마우스) 이벤트로 매핑합니다. Chromium은 클릭을 위해 아주 작은 이동 임계값을 적용하는데 — 1px 손가락 이동만으로도 클릭이 발생하지 않습니다. 대시보드에서 onclick 핸들러를 사용한다면, 이 JS를 추가해 pointerup과 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 { new 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);
});
new MutationObserver(muts => muts.forEach(m =>
m.addedNodes.forEach(n => { if (n.nodeType === 1) patchButtons(n); })
)).observe(document.body, { childList: true, subtree: true });
})();

터치스크린에서 마우스 커서를 숨기려면 CSS에 다음도 추가하세요:

css

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

HDMI와 USB로 ZimaBoard에 연결된 22인치 Pisichen 터치 모니터가 인터랙티브 위젯이 있는 맞춤형 스마트 홈 대시보드를 표시하고 있습니다.

문제 해결

문제 수정
docker build가 알 수 없는 플래그로 실패함 docker --config /tmp build … 사용
검은 화면 / 기본 출력 테스트 실패 Wayland/cage 대신 Xorg 모드셋팅 사용
Mesa는 N100을 지원하지 않음 bookworm-backports에서 libgl1-mesa-dri 설치
터치 입력이 감지되지 않음 /proc/bus/input/devices로 이벤트 번호 확인, xorg.conf 업데이트
대시보드에 ZimaOS 로그인 화면 표시 포트 80은 ZimaOS가 사용 중입니다 — 다른 포트(888이 작동함)를 사용하세요

항상 켜져 있는 나의 홈 어시스턴트 설정 (답글)

전력 효율이 뛰어난 홈 어시스턴트 설정을 구축했으며, 메인 장비가 24시간 내내 전기를 소모하지 않으면서도 24/7 사용할 수 있습니다. 비밀 무기는 항상 켜져 있는 두뇌 역할을 하는 Zima이며, 제 풀 PC는 실제로 필요할 때까지 최대 절전 모드로 잠자고 있습니다.

메인 PC

주요 기기에 들어있는 구성은 다음과 같습니다:

CPU: AMD Ryzen 9 9950X3D

메인보드: ASUS ROG Crosshair X870E Glacial

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

스토리지: Crucial T710 4TB NVMe M.2 PCIe 5.0 Gen5

GPU (게임용): ASUS ROG Astral GeForce RTX 5080 16GB

GPU (AI): Intel Arc Pro B70 32GB (출시 대기 중)

전원 공급 장치: Corsair RM1200x

케이스: Thermaltake Tower 900

Zima 세팅 (항상 켜져 있는 허브)

Zima는 24시간 작동하며 가벼운 작업을 모두 처리합니다 — 홈 어시스턴트 업무, 카메라 피드, 그리고 클라우드를 통한 Groq 무료 티어를 이용한 기본 AI 쿼리 등입니다.

Zima에 직접 연결된 주변기기:

Pisichen 22" 터치스크린 모니터 HDMI → miniDP 어댑터 + 터치 입력용 USB-C 케이블 1개

Edifier G1000 II 스피커, 외부 USB-A to 3.5mm 사운드카드 통해 연결

DAMAO DGM20S 마이크로폰 USB-A 연결

스토리지:

Seagate IronWolf Pro 20TB — '블랙홀' NAS 드라이브

Seagate IronWolf Pro 1TB — 메인 NAS 드라이브

네트워킹:

Zima가 이더넷을 통해 라우터에 연결되어 있습니다

두 번째 이더넷 케이블이 Zima에서 PC로 직접 연결되어 빠른 로컬 전송을 지원합니다

ZimaBoard 기반 터치스크린 키오스크, 전문 스피커, 그리고 24시간 모니터링을 위한 미니멀한 책상 세트가 포함된 종합 홈 자동화 작업 공간입니다.

스마트한 부분: Wake-on-LAN

여기서 마법이 시작됩니다 — 누군가 Gemini가 잘 처리하기 어려운 복잡한 질문을 하면, Zima가 Wake-on-LAN 패킷을 보내 메인 PC를 절전 모드에서 깨웁니다. PC가 켜지면 Intel Arc Pro B70에서 실행되는 70B 파라미터 LLM에 연결됩니다. 작업이 끝나면 PC는 다시 잠자기 모드로 돌아갑니다.

결과는: 항상 반응하는 홈 어시스턴트지만, 실제로 무거운 작업이 있을 때만 메인 컴퓨터가 깨어납니다. 전기 요금은 합리적으로 유지되고, 필요할 때는 강력한 로컬 모델에 접근할 수 있습니다.

Claude Code와 Perplexity에게 큰 감사를 전합니다 — 솔직히 그들의 도움이 없었다면 이 전체 프로젝트를 혼자서 완성할 수 없었을 거예요. 그들은 전 과정에서 정말 소중한 존재였습니다.

이 정보가 비슷한 프로젝트에 도전하는 미친 사람들에게 도움이 되길 바랍니다 — 어디서든 자유롭게 공유하세요!

지마 캠페인 허브

더 읽어보기

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.