# Kiosk Chromium — Debian 13 Kiosk wyświetlający stronę `http://instrukcje.local` w Chromium na pełnym ekranie. Używa `sway` jako kompozytora Wayland oraz `swayidle` + `wlopm` do zarządzania energią monitora. --- ## Wymagania - Debian 13 netinst — instalacja minimalna bez środowiska graficznego --- ## Instalacja krok po kroku ### 1. Utwórz użytkownika kiosk ```bash useradd -m -r -s /usr/sbin/nologin kiosk usermod -aG tty,input,video,dialout kiosk ``` ### 2. Zainstaluj pakiety ```bash apt update && apt install -y \ sway swayidle wlopm wlr-randr \ chromium ``` > `cage` **nie** obsługuje protokołu `wlr-output-power-management-v1`, przez co `wlopm` z nim nie działa — ekran można wygasić, ale nie można go wybudzić. Dlatego używamy `sway`. ### 3. Skopiuj pliki konfiguracyjne ```bash # Skrypt zarządzający kioskiem cp kiosk-manager.sh /home/kiosk/kiosk-manager.sh chmod +x /home/kiosk/kiosk-manager.sh # Strona oczekiwania na sieć cp waiting.html /home/kiosk/waiting.html chown kiosk:kiosk /home/kiosk/waiting.html # Konfiguracja sway mkdir -p /home/kiosk/.config/sway cp sway-config /home/kiosk/.config/sway/config chown -R kiosk:kiosk /home/kiosk/.config # Jednostka systemd cp kiosk.service /etc/systemd/system/kiosk.service ``` ### 4. Rozwiązanie problemu z domenami .local Musimy powiedzieć systemowi: "Najpierw sprawdź w DNS, a dopiero potem szukaj przez mDNS". * Otwórz plik: `/etc/nsswitch.conf` * Znajdź linię `hosts:`. Zapewne wygląda tak: `hosts: files mdns4_minimal [NOTFOUND=return] dns` * Zmień ją na: `hosts: files dns mdns4_minimal [NOTFOUND=return]` ### 5. Włącz i uruchom serwis ```bash systemctl daemon-reload systemctl enable kiosk.service systemctl start kiosk.service ``` --- ### 6. Skonfiguruj GRUB'a aby uruchamiał system natychmiast ```bash sudo nano /etc/default/grub ``` * Znajdź i zmień poniższe linie (lub dodaj je, jeśli ich nie ma): `GRUB_DEFAULT=0` – wskazuje, że domyślnie ma być uruchamiana pierwsza pozycja na liście. `GRUB_TIMEOUT=0` – ustawia czas oczekiwania na 0 sekund. * Zastosuj zmiany ```bash sudo /usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg ``` --- ## Opis plików ### `kiosk.service` Jednostka systemd uruchamiająca `sway` jako użytkownik `kiosk`. Ważne parametry: | Opcja | Wartość | Opis | |---|---|---| | `PAMName=login` | `login` | Dostęp do urządzeń przez logind (GPU, input) | | `RuntimeDirectory=kiosk` | `kiosk` | Automatycznie tworzy `/run/kiosk` z prawami 0700 | | `XDG_RUNTIME_DIR` | `/run/kiosk` | Wymagane przez sway / Wayland | | `WLR_LIBSEAT_BACKEND` | `logind` | Dostęp do GPU bez uprawnień roota | | `IDLE_TIME` | `120` | Czas bezczynności (sekundy) przed wygaszeniem ekranu | | `ExecStart` | `/usr/bin/sway` | Kompozytor Wayland | | `Restart=always` | — | Automatyczny restart po awarii / wyjściu Chromium | **Zmiana czasu wygaszania:** ```bash # Edytuj /etc/systemd/system/kiosk.service Environment=IDLE_TIME=300 # 5 minut systemctl daemon-reload systemctl restart kiosk.service ``` --- ### `sway-config` → `/home/kiosk/.config/sway/config` Minimalna konfiguracja sway: ``` output * bg #000000 solid_color # czarne tło output * transform 270 # obrót monitora o 270° input * xkb_numlock enabled # NumLock zawsze włączony exec swayidle before-sleep "wlopm --off '*'" # wygaszenie przy sleep exec /home/kiosk/kiosk-manager.sh # start kiosku ``` --- ### `kiosk-manager.sh` → `/home/kiosk/kiosk-manager.sh` Uruchamiany przez sway przy starcie sesji. Kolejność działania: 1. Uruchamia `swayidle` **bez flagi `-w`** — ignoruje idle inhibitory (Chromium ustawia inhibitor Wayland; `swayidle -w` respektuje go i nigdy nie wygasiłby ekranu) 2. `wlopm --off '*'` po IDLE_TIME sekundach — wysyła DPMS standby przez protokół `wlr-output-power-management-v1`; link DP/HDMI pozostaje aktywny, więc wybudzenie jest niezawodne 3. Chromium startuje **natychmiast** z lokalnym plikiem `waiting.html` (ekran oczekiwania) 4. Ping-loop czeka, aż `KIOSK_HOST` (192.168.40.126) odpowie 5. Po uzyskaniu sieci: Chromium jest zamykany i restartowany z docelowym `http://instrukcje.local` **Flagi Chromium (`CHROMIUM_OPTS`):** | Flaga | Opis | |---|---| | `--ozone-platform=wayland` | Używa backendu Wayland zamiast X11 | | `--no-first-run` | Pomija ekran powitalny przy pierwszym uruchomieniu | | `--noerrdialogs` | Ukrywa okna dialogowe błędów Chromium | | `--disable-infobars` | Ukrywa paski informacyjne (np. „Chromium jest zarządzany...") | | `--disable-gpu-suspend` | Zapobiega zawieszaniu GPU podczas wygaszania ekranu | | `--force-device-scale-factor=1` | Wymusza skalowanie 1:1 (bez DPI scaling) | | `--user-data-dir` | Osobny katalog profilu — izoluje dane kiosku | | `--disable-features=AutofillServerCommunication` | Wyłącza pobieranie podpowiedzi autouzupełniania z serwerów Google | | `--disable-features=Translate` | Wyłącza pasek z propozycją tłumaczenia strony | | `--disable-features=MediaRouter` | Wyłącza obsługę Chromecast / Cast | | `--disable-save-password-bubble` | Ukrywa bańkę „Zapisz hasło" | | `--disable-sync` | Wyłącza synchronizację z kontem Google | | `--disable-extensions` | Wyłącza wszystkie rozszerzenia | | `--disable-background-networking` | Blokuje ruch sieciowy w tle (aktualizacje, telemetria) | | `--disable-notifications` | Wyłącza powiadomienia systemowe | | `--disable-component-update` | Wyłącza automatyczne aktualizacje komponentów Chromium | | `--password-store=basic` | Nie używa systemowego portfela haseł (gnome-keyring, kwallet) | | `--disable-pinch` | Wyłącza gesty pinch-to-zoom (ekran dotykowy) | **Zmiana adresu IP serwera:** ```bash # W kiosk-manager.sh zmień zmienną: KIOSK_HOST="192.168.40.126" ``` ### `waiting.html` → `/home/kiosk/waiting.html` Lokalna strona HTML wyświetlana przez Chromium w trakcie oczekiwania na sieć. Ciemne tło, animowany spinner i pulsujący napis „Oczekiwanie na sieć...". --- ## Zarządzanie i diagnostyka ### Logi ```bash # Ostatnie 100 linii logów serwisu journalctl -u kiosk.service -b --no-pager -n 100 -o cat # Śledzenie na żywo journalctl -u kiosk.service -f ``` ### Restart / zatrzymanie ```bash systemctl restart kiosk.service systemctl stop kiosk.service ``` ### Sprawdzenie wyjść wideo ```bash WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/kiosk wlr-randr ``` ### Ręczne wygaszenie / wybudzenie ```bash WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/kiosk wlopm --off '*' WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/kiosk wlopm --on '*' ``` --- ## Rozwiązywanie problemów | Objaw | Przyczyna | Rozwiązanie | |---|---|---| | Serwis natychmiast się kończy | Brak `/run/kiosk` | Sprawdź `RuntimeDirectory=kiosk` w pliku unit | | `XDG_RUNTIME_DIR is not set` | Brak zmiennej środowiskowej | Upewnij się że `Environment=XDG_RUNTIME_DIR=/run/kiosk` jest w unit | | Ekran się nie wygasza | Chromium blokuje idle | `swayidle` musi być uruchomiony **bez** flagi `-w` | | Ekran gaśnie ale nie wraca | `wlr-randr --off` rozłącza link DRM | Używaj `wlopm` z `sway` (nie `wlr-randr --off`) | | `wlopm: Wayland server does not support...` | Kompozytor bez protokołu power-management | Zamień `cage` na `sway` | | Czarny ekran po restarcie | Chromium trzyma zablokowany profil | `rm -rf /home/kiosk/.cache/chromium && systemctl restart kiosk.service` |