Docker(X.Org + Chromium)を使ったZimaBoard 2のタッチスクリーンキオスクダッシュボード

エヴァ・ウォンテクニカルライター であり ZimaSpaceの常駐ティンカーでもあります。 生涯のオタクであり、 ホームラボとオープンソースソフトウェアに情熱を持っています。彼女は複雑な技術的概念をわかりやすく、 実践的なガイドに翻訳することを専門としています。エヴァはセルフホスティングは楽しくあるべきで、怖がるものではないと信じています。彼女のチュートリアルを通じて、コミュニティが ハードウェアのセットアップを解明する手助けをしています。初めてのNAS構築からDockerコンテナの習得まで。

みなさん、こんにちは、

HDMI接続の22インチタッチモニターに接続したZimaBoard 2でフルスクリーンタッチスクリーンキオスクを動かす方法を共有したいと思います。

ZimaOSにはパッケージマネージャー(apt)がないため、すべてをDockerコンテナ内で行うのがコツです。

私のセットアップ

ZimaBoard 2 1664(Intel N100、16 GB RAM)

ZimaOS v1.5.4

HDMI + USB-C→USB-Aタッチスクリーン入力対応22インチタッチモニター

白と赤のThermaltake Tower 900 PCケースのクローズアップ写真。カスタム青色LED照明とIntelプロセッサやメモリを含む内部コンポーネントの詳細が見えます。

アプローチ

ZimaOSはBuildrootベースです — aptなし、Xorgなし、デスクトップ環境なし。代わりに、XorgのmodesettingドライバーとChromiumのキオスクモードを備えたDebianコンテナを/dev/driを通して実行します。別のnginx:alpineコンテナがダッシュボードファイルを提供します。

ステップ1 — ユーザーをdockerグループに追加する

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

なぜMesaのバックポート?Intel N100(Alder Lake-N、PCI ID 0x46d4)はMesa 23.0以降でのみサポートされています。Debian bookwormは22.3を搭載。バックポートは25.xを提供します。

/DATA/AppData/kiosk/xorg.conf:

text

セクション "デバイス"
識別子 "Intel"
ドライバー "modesetting"
オプション "加速方法" "なし"
EndSection

セクション "画面"
識別子 "デフォルト"
デバイス "Intel"
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のmodesettingを使用
MesaはN100をサポートしていません bookworm-backportsからlibgl1-mesa-driをインストール
タッチ入力が検出されません /proc/bus/input/devicesでイベント番号を確認し、xorg.confを更新
ダッシュボードにZimaOSのログイン画面が表示されます ポート80はZimaOSが使用中です — 別のポート(888が動作)を使ってください

私の常時稼働ホームアシスタントセットアップ(返信)

電力効率の良いホームアシスタントセットアップを構築しました。メインPCを常に稼働させて電気を消費することなく、24時間稼働可能です。秘密兵器は、常時稼働する頭脳としての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時間365日稼働し、軽量な処理をすべて担当 — ホームアシスタントの役割、カメラ映像、およびクラウド経由のGroq無料プランを使った基本的なAIクエリを処理します。

Zimaに直接接続された周辺機器:

Pisichen 22インチタッチスクリーンモニター(HDMI → miniDPアダプター+タッチ入力用USB-Cケーブル1本)

Edifier G1000 IIスピーカー(外部USB-Aから3.5mmサウンドカード経由)

DAMAO DGM20Sマイクロフォン(USB-A接続)

ストレージ:

Seagate IronWolf Pro 20TB — 「ブラックホール」NASドライブ

Seagate IronWolf Pro 1TB — メインNASドライブ

ネットワーキング:

Zimaはイーサネット経由でルーターに接続

2本目のイーサネットケーブルがZimaからPCへ直接接続され、高速なローカル転送を実現

ZimaBoard搭載のタッチスクリーンキオスク、プロ用スピーカー、ミニマルなデスクセットアップによる24時間365日の監視が可能な包括的なホームオートメーションワークスペース。

スマートな部分:Wake-on-LAN

ここが魔法の部分です — Geminiがうまく処理できない複雑な質問が来ると、ZimaがWake-on-LANパケットを送信してメインPCを休止状態から起こします。起動後は、Intel Arc Pro B70で動作するローカルの70BパラメータLLMに接続します。タスクが終わるとPCは再びスリープに戻ります。

結果はこうです:常に応答性の高いホームアシスタントがあり、大型マシンは本当に重い作業があるときだけ起動します。電気代は抑えられ、必要なときには高性能なローカルモデルにアクセスできます。

Claude CodeとPerplexityに大きな感謝を — 正直なところ、彼らの助けがなければこのプロジェクトを一人で完成させることはできませんでした。プロセス全体を通じて彼らはかけがえのない存在でした。

この情報が、同じようなプロジェクトに挑戦するクレイジーな人たちの役に立てば嬉しいです。ぜひ好きなところでシェアしてください!

Zimaキャンペーンハブ

もっと読む

ZimaCube 2でDocker、CI/CD、10以上のセルフホストサービスを運用する方法
Jun 17, 2026Buying Guides & Hardware

ZimaCube 2でDocker、CI/CD、10以上のセルフホストサービスを運用する方法

このコミュニティスポットライトでは、ZimaCube 2 PioneerのMichael Luckenbillによる完全セルフホスト型インフラストラクチャのテストを紹介します。10以上のDockerコンテナ、ローカルGitHub Actions CI/CD、デュアルZFS HDD/NVMeストレージプール、デュアル2.5GbEネットワーキング、Cloudflareトンネルを搭載し、標準の8GB DDR5 RAMで動作。コンパクトで静かなシャーシは、冷却性能を保ちながら連続稼働をこなし、ストレージ、コンピュート、オートメーションを一つにまとめたオールインワンのパーソナルクラウドボックスを実現しています。

2つのAIエージェントが1台のサーバーを争うとどうなる?
Jun 16, 2026Community & Stories

2つのAIエージェントが1台のサーバーを争うとどうなる?

Zero NoichiのAIサイバーセキュリティ実験では、2台のZimaBoard 2を使って攻撃者と防御者のエージェントをシミュレートし、ホームラボサーバーが安全なAI、Docker、NAS、セキュリティテストを支える方法を示しました。

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.