Files
kiosk-instrukcje/README.md
T
2026-05-25 13:16:44 +02:00

219 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
cp logo.png /home/kiosk/logo.png
# Konfiguracja sway
mkdir -p /home/kiosk/.config/sway
cp sway-config /home/kiosk/.config/sway/config
# Ustawienie właściciela
chown -R kiosk:kiosk /home/kiosk/
# 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
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
/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` |