Files
kiosk-prod-screens/README.md
T
2026-05-28 09:43:17 +02:00

506 lines
19 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 Dwuekranowy — Chromium + Prezentacja PowerPoint — Debian 13
Kiosk na dwa monitory. Lewy ekran wyświetla `http://diluals31/terminal/ift/5/DE/index` w Chromium; prawy ekran wyświetla w pętli prezentację PowerPoint z zamontowanego udziału SMB. Używa **X11** (xinit + openbox) i **LibreOffice Impress** w trybie pokazu (`--show`) — bez konwersji, z zachowanymi animacjami i przejściami.
---
## Architektura
```
┌──────────────────────────────────────────────────────────────────┐
│ kiosk.service │
│ (xinit + openbox — tty7) │
│ │
│ Wirtualny desktop 3840×1080 (xrandr --right-of) │
│ ┌──────────────────────────┐ ┌──────────────────────────────┐ │
│ │ Chromium (fullscreen) │ │ LibreOffice Impress --show │ │
│ │ DP-1 (0,01920×1080) │ │ HDMI-1 (1920,03840×1080) │ │
│ │ http://diluals31/... │ │ terminal_live.pptx │ │
│ └──────────────────────────┘ └──────────────────────────────┘ │
│ ▲ above (wmctrl) ▲ │
│ kiosk-manager.sh presentation-manager.sh │
└──────────────────────────────────────────────────────────────────┘
/mnt/presentation (CIFS/SMB)
montowany przez skrypt (fstab user)
//192.168.40.201/DatyFirmowe/ALS
```
**Przepływ — lewy ekran (kiosk-manager.sh):**
1. Konfiguruje X11: xrandr dual-screen, wyłącza DPMS, uruchamia openbox
2. Zapisuje `registrymodifications.xcu` — wyłącza presenter console LO
3. Uruchamia watchdog sesji (co 0.4 s chowa okna LO z lewego ekranu)
4. Uruchamia `presentation-manager.sh` w tle
5. Otwiera `waiting.html` fullscreen + always-on-top
6. Czeka na: sieć (`ping diluals31`) **oraz** sygnał od `presentation-manager.sh` (plik `/tmp/kiosk-smb-ready`)
7. Po otrzymaniu obu sygnałów: `sleep 10` — daje LO czas na otwarcie i pozycjonowanie okna na prawym ekranie
8. Przełącza Chromium na docelowy URL
> `sleep 10` jest kluczowe: zapewnia, że LibreOffice zdąży otworzyć i ustawić okno pokazu zanim Chromium wejdzie w tryb fullscreen+above na lewym ekranie. Bez tego opóźnienia konsola prezentacji była widoczna po reboot.
**Przepływ — prawy ekran (presentation-manager.sh):**
1. Montuje udział SMB (`mount /mnt/presentation`) z retry co 5 s
2. Synchronizuje czcionki z `$SMB_MOUNT/fonts/` do `~/.local/share/fonts/smb/`
3. Tworzy plik `/tmp/kiosk-smb-ready` — sygnał dla `kiosk-manager.sh`
4. Czeka na plik `terminal_live.pptx`
5. Uruchamia persistentny watchdog konsoli (co 0.3 s)
6. Uruchamia `soffice --show terminal_live.pptx`
7. Przesuwa okno pokazu na prawy ekran i stosuje fullscreen
8. Co 5 s: sprawdza mtime pliku i restartuje po zmianie
---
## Wymagania
- Debian 13 netinst — instalacja minimalna bez środowiska graficznego
- Dwa monitory: `DP-1` (lewy, primary) i `HDMI-1` (prawy)
- Dostęp do udziału SMB/CIFS z plikiem prezentacji
---
## Instalacja krok po kroku
### 1. Utwórz użytkownika kiosk
```bash
useradd -m -s /usr/sbin/nologin kiosk
usermod -aG tty,input,video,render,dialout kiosk
```
### 2. Zainstaluj pakiety
```bash
apt update && apt install -y \
xorg xinit openbox \
chromium \
libreoffice-impress \
cifs-utils \
xdotool wmctrl \
x11-xserver-utils \
iputils-ping \
ethtool \
wakeonlan
```
> Nie są już potrzebne:
### 2a. Zainstaluj czcionki
LibreOffice podstawia czcionkę zastępczą gdy oryginalna nie jest zainstalowana w systemie — może to zmienić układ tekstu na slajdach.
#### Automatyczna instalacja przez udział SMB (zalecane)
`presentation-manager.sh` automatycznie synchronizuje czcionki z folderu `fonts/` na udziale SMB do `/home/kiosk/.local/share/fonts/smb/`. Wystarczy wrzucić pliki `.ttf`/`.otf` na udział — zostaną zainstalowane przy najbliższym restarcie kiosku.
**Na maszynie Windows** — skopiuj pliki czcionek do `\\192.168.40.201\DatyFirmowe\ALS\fonts\`:
```powershell
# Calibri (C:\Windows\Fonts\ lub %LOCALAPPDATA%\Microsoft\Windows\Fonts\)
Copy-Item C:\Windows\Fonts\calibri*.ttf \\192.168.40.201\DatyFirmowe\ALS\fonts\
# Aptos — zazwyczaj w cache czcionek chmurowych Microsoft 365:
$src = "$env:LOCALAPPDATA\Microsoft\FontCache\4\CloudFonts\Aptos"
Copy-Item "$src\*" \\192.168.40.201\DatyFirmowe\ALS\fonts\
```
> Nazwy plików Aptos w cache mogą być numeryczne — to normalne, fontconfig czyta metadane wewnętrzne, nie nazwę pliku.
**Restart kiosku** — czcionki zostaną zainstalowane automatycznie:
```bash
systemctl restart kiosk.service
# Sprawdź w logach:
journalctl -u kiosk.service -b | grep "czcionka\|Cache czcionek"
```
#### Carlito — open-source'owy zamiennik Calibri (opcjonalnie)
Jeśli nie masz dostępu do oryginalnych plików Calibri, `Carlito` ma identyczne metryki (ten sam układ tekstu i łamania linii):
```bash
apt install fonts-crosextra-carlito fonts-crosextra-caladea
```
`fonts-crosextra-caladea` to odpowiednik Cambrii. Nie wymaga wrzucania plików na SMB — instalowany systemowo.
#### Inne czcionki Microsoft (Arial, Times New Roman, Verdana)
```bash
apt install ttf-mscorefonts-installer
```
> Nie są już potrzebne: `sway`, `swayidle`, `wlopm`, `wlr-randr`, `seatd`, `mpv`, `poppler-utils`.
### 3. Skonfiguruj montowanie udziału SMB
#### 3a. Utwórz plik poświadczeń
```bash
mkdir -p /etc/samba
cat > /etc/samba/kiosk-credentials << 'EOF'
username=NAZWA_UZYTKOWNIKA
password=HASLO
domain=WORKGROUP
EOF
chmod 600 /etc/samba/kiosk-credentials
chown root:root /etc/samba/kiosk-credentials
```
#### 3b. Utwórz punkt montowania
```bash
mkdir -p /mnt/presentation
```
#### 3c. Dodaj wpis w /etc/fstab (montowanie przez użytkownika kiosk)
```bash
echo '//192.168.40.201/DatyFirmowe/ALS /mnt/presentation cifs credentials=/etc/samba/kiosk-credentials,uid=kiosk,gid=kiosk,vers=3.0,user,noauto,_netdev 0 0' >> /etc/fstab
```
Opcja `user` pozwala użytkownikowi `kiosk` wykonać `mount /mnt/presentation` bez uprawnień roota. Opcja `noauto` wyłącza automatyczne montowanie przy starcie — skrypt sam zarządza montem z retry.
> **Uwaga:** Systemd unit `mnt-presentation.mount` jest **wyłączony** — skrypt `presentation-manager.sh` przejął odpowiedzialność za montowanie.
```bash
systemctl disable mnt-presentation.mount
systemctl stop mnt-presentation.mount
```
### 4. Wykryj nazwy wyjść wideo
```bash
for p in /sys/class/drm/card*-*; do
echo "$(basename $p | sed 's/card[0-9]*-//'): $(cat $p/status)"
done
```
Przykładowe wyjście:
```
DP-1: connected
HDMI-1: connected
```
Ustaw właściwe nazwy w `kiosk-manager.sh`:
```bash
OUTPUT_LEFT="DP-1" # lewy ekran — primary
OUTPUT_RIGHT="HDMI-1" # prawy ekran
```
### 5. Skopiuj pliki konfiguracyjne
```bash
cp kiosk-manager.sh /home/kiosk/kiosk-manager.sh
cp presentation-manager.sh /home/kiosk/presentation-manager.sh
cp waiting.html /home/kiosk/waiting.html
chmod +x /home/kiosk/kiosk-manager.sh /home/kiosk/presentation-manager.sh
chown -R kiosk:kiosk /home/kiosk/
cp kiosk.service /etc/systemd/system/kiosk.service
```
### 6. Rozwiązanie problemu z domenami .local
Jeśli `diluals31` jest rozwiązywany przez DNS firmowy (nie mDNS):
- Otwórz `/etc/nsswitch.conf`
- Zmień linię `hosts:` na: `hosts: files dns mdns4_minimal [NOTFOUND=return]`
### 7. Włącz i uruchom serwis
```bash
systemctl daemon-reload
systemctl enable kiosk.service
systemctl start kiosk.service
```
### 8. Skonfiguruj GRUB — natychmiastowy start
```bash
# /etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT=0
```
```bash
/usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg
```
---
## Harmonogram — Automatyczne wyłączanie i Wake on LAN
Kiosk wyłącza się automatycznie w **sobotę o 7:00** i jest budzony przez Magic Packet (Wake on LAN) co 5 minut przez całe okno aktywności (**niedziela 21:00 sobota 7:00**). Pakiet WoL jest ignorowany gdy kiosk jest już włączony — cykliczne wysyłanie nie powoduje restartów.
> **Utrata prądu:** WoL nie zadziała gdy karta sieciowa nie ma zasilania. Aby kiosk sam wstał po powrocie prądu, wejdź w ustawienia BIOS/UEFI i ustaw opcję **Restore on AC Power Loss** (lub **After Power Failure**) na **Power On**. W połączeniu z cyklicznym WoL zapewnia to pełne pokrycie: brak prądu → BIOS bootuje automatycznie; awaria software → WoL obudzi po max. 5 min.
>
> Jeśli prąd wróci w oknie wyłączenia (sobota 7:00 niedziela 20:59), kiosk uruchomi się przez BIOS, ale `kiosk-schedule` wyłączy go ponownie w ciągu max. 5 minut.
### Na kiosku
#### 9a. Cron — automatyczne wyłączanie
```bash
cp kiosk-schedule /etc/cron.d/kiosk-schedule
chmod 644 /etc/cron.d/kiosk-schedule
```
#### 9b. Wake on LAN — włączanie i utrwalanie
```bash
cp wol-enable.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now wol-enable.service
```
Sprawdź, czy WoL jest aktywne:
```bash
ip link show | grep -A1 "state UP" | grep ether # MAC adres kiosku
ethtool enp2s0 | grep -i wake # zamień enp2s0 na właściwy interfejs
```
> **Wymagane ręcznie: BIOS kiosku** — wejdź w ustawienia firmware i włącz opcję **Wake on LAN** lub **Power on by PCI-E/PCI**. Bez tego ustawienia Magic Packet jest ignorowany przez sprzęt.
#### 9c. Pobierz MAC adres kiosku
```bash
ip link show | grep -A1 "state UP" | grep ether | awk '{print $2}'
```
Zanotuj ten adres — potrzebny do konfiguracji serwera (krok poniżej).
### Na serwerze (192.168.40.126)
Zainstaluj narzędzie do wysyłania Magic Packet:
```bash
apt install wakeonlan
```
Utwórz plik crona wysyłającego WoL co 5 minut przez całe okno aktywności kiosku (wstaw MAC kiosku):
```bash
cat > /etc/cron.d/kiosk-wol << 'EOF'
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Budź kiosk WS-VK016 co 5 min w oknie aktywności: nd 21:00 sb 7:00
# Jeśli kiosk jest już włączony, pakiet WoL jest ignorowany (bezpieczne).
*/5 21-23 * * 0 root wakeonlan XX:XX:XX:XX:XX:XX
*/5 * * * 1-5 root wakeonlan XX:XX:XX:XX:XX:XX
*/5 0-6 * * 6 root wakeonlan XX:XX:XX:XX:XX:XX
EOF
chmod 644 /etc/cron.d/kiosk-wol
```
Zastąp `XX:XX:XX:XX:XX:XX` adresem MAC pobranym w kroku 9c.
> WoL działa w obrębie jednej podsieci (broadcast). Kiosk i serwer są w sieci `192.168.40.x` — brak potrzeby konfiguracji routera.
---
### `kiosk.service` → `/etc/systemd/system/kiosk.service`
Jednostka systemd uruchamiająca sesję X11 jako użytkownik `kiosk`.
| Opcja | Wartość | Opis |
|---|---|---|
| `ExecStart` | `xinit kiosk-manager.sh -- :0 vt7` | Uruchamia X11 na tty7 |
| `ExecStartPre` | `chvt 7` | Przełącza konsolę na tty7 |
| `PAMName` | `login` | Wymagane do bezrootowego X11 (xinit jako user) |
| `TTYPath` | `/dev/tty7` | Przypisuje serwis do tty7 |
| `SLIDE_DURATION` | `10` | Czas slajdu (s) — aktualnie nieużywany, LO używa timingów z PPTX |
| `Restart=always` | — | Automatyczny restart po awarii |
> Serwis startuje **bez** `network-online.target` — celowo, aby `waiting.html` było widoczne od razu po uruchomieniu systemu. Montowanie SMB obsługuje skrypt z retry.
---
### `kiosk-manager.sh` → `/home/kiosk/kiosk-manager.sh`
Uruchamiany przez xinit. Konfiguruje X11 i obsługuje lewy ekran.
**Co robi:**
1. `xrandr` — tryb rozszerzony: `DP-1` primary (0,0), `HDMI-1` po prawej (1920,0)
2. `xsetroot` + `xset` — czarne tło, wyłączony wygaszacz i DPMS
3. `openbox --sm-disable` — lekki WM wymagany przez `wmctrl fullscreen`
4. Zapisuje `registrymodifications.xcu` — wyłącza presenter console LO (`StartWithPresenterScreen=false`)
5. Uruchamia watchdog sesji w tle — co 0.4 s chowa okna soffice z lewego ekranu (x < 1920)
6. Uruchamia `presentation-manager.sh` w tle
7. Chromium otwiera `waiting.html` z `fullscreen` + `above`
8. Czeka na sieć (`ping diluals31`) **i** na plik `/tmp/kiosk-smb-ready`
9. `sleep 10` — LO ma czas na pełny start i pozycjonowanie okna przed Chromium
10. Kill waiting Chromium → exec Chromium z docelowym URL
**Flagi Chromium (`CHROMIUM_OPTS`):**
| Flaga | Opis |
|---|---|
| `--app=URL` | Tryb aplikacji — brak paska adresu, brak kart |
| `--window-position=0,0 --window-size=1920,1080` | Pozycja na lewym ekranie (X11: bez `--kiosk`, który rozciąga na cały wirtualny desktop) |
| `--no-first-run` | Pomija ekran powitalny |
| `--noerrdialogs` | Ukrywa okna dialogowe błędów |
| `--disable-gpu-suspend` | Zapobiega zawieszaniu GPU przy wygaszaniu |
| `--force-device-scale-factor=1` | Skalowanie 1:1 |
| `--disable-features=Translate,MediaRouter` | Wyłącza tłumaczenie i Chromecast |
| `--disable-sync` | Wyłącza synchronizację Google |
| `--disable-extensions` | Wyłącza rozszerzenia |
| `--password-store=basic` | Nie używa systemowego portfela haseł |
| `--disable-pinch` | Wyłącza pinch-to-zoom |
> **Uwaga:** `--kiosk` na X11 rozciąga okno na cały wirtualny desktop 3840×1080 (oba ekrany). Używamy `--app` + `--window-position/size` + `wmctrl fullscreen`.
**Zmiana hosta / URL kiosku:**
```bash
# kiosk-manager.sh
KIOSK_HOST="diluals31"
KIOSK_URL="http://diluals31/terminal/ift/5/DE/index"
```
---
### `presentation-manager.sh` → `/home/kiosk/presentation-manager.sh`
Obsługuje prawy ekran — montowanie SMB i wyświetlanie prezentacji.
**Montowanie SMB:**
```bash
until mountpoint -q "$SMB_MOUNT"; do
mount "$SMB_MOUNT" # korzysta z wpisu fstab z opcją 'user'
sleep 5 # retry co 5 s
done
```
Przy zakończeniu skryptu (trap EXIT/INT/TERM): `umount /mnt/presentation`.
**Ustawianie okien LibreOffice (`start_lo`):**
Iteruje wszystkie widoczne okna `soffice` wg pozycji X:
- `x ≥ 1920` → okno pokazu slajdów → `wmctrl fullscreen`
- `x < 1920` → konsola prezentacji → przesunięcie na `x=3840` (poza desktop) + `wmctrl below`
- Fallback po 5 s: jeśli nadal brak okna na prawym ekranie → przeniesienie pierwszego znalezionego
Po ustawieniu LO: Chromium podniesiony jako `above` (always-on-top na lewym ekranie).
**Watchdog (co 5 s w głównej pętli):**
- Sprawdza wszystkie widoczne okna `soffice` — jeśli któreś wróciło na `x < 1920`, wysyła je z powrotem na `x=3840`
- Sprawdza `mtime` pliku PPTX — po zmianie restartuje pokaz
- Sprawdza czy `soffice` żyje — jeśli zakończył (koniec pokazu), restartuje
**Konfiguracja:**
```bash
SMB_MOUNT="/mnt/presentation"
SMB_SOURCE="//192.168.40.201/DatyFirmowe/ALS"
PRESENTATION_FILE="$SMB_MOUNT/terminal_live.pptx"
```
---
### `kiosk.service` (wyłączone) `mnt-presentation.mount`
Systemd unit do montowania SMB jest **wyłączony**. Skrypt `presentation-manager.sh` przejął montowanie przez `mount /mnt/presentation` (wpis fstab z opcją `user,noauto`).
---
### `sway-config`
Nieużywany — zachowany jako archiwum poprzedniej architektury (Wayland/sway).
---
### `kiosk-schedule` → `/etc/cron.d/kiosk-schedule`
Plik crona systemu wyłączający kiosk w sobotę o 7:00 (`shutdown -h now` jako root).
---
### `wol-enable.service` → `/etc/systemd/system/wol-enable.service`
Jednostka systemd uruchamiana przy każdym starcie systemu. Wywołuje `ethtool -s IFACE wol g` na wszystkich interfejsach sieciowych — utrzymuje Wake on LAN włączone po rebootach (niektóre sterowniki resetują ustawienie WoL przy wyłączaniu).
---
### `waiting.html` → `/home/kiosk/waiting.html`
Lokalna strona HTML wyświetlana przez Chromium podczas oczekiwania na sieć. Ciemne tło, animowany spinner. Widoczna od startu systemu do momentu, gdy `diluals31` odpowie na ping.
---
## Zarządzanie i diagnostyka
### Logi
```bash
# Logi kiosku na żywo
journalctl -u kiosk.service -f
# Ostatnie 100 linii
journalctl -u kiosk.service -b -n 100
# Tylko logi prezentacji
journalctl -u kiosk.service -b | grep presentation-manager
# Logi montowania SMB
journalctl -u kiosk.service -b | grep "mount:"
```
### Restart / zatrzymanie
```bash
systemctl restart kiosk.service
systemctl stop kiosk.service
```
### Ręczne montowanie / odmontowanie SMB (jako root)
```bash
mount /mnt/presentation
umount /mnt/presentation
mountpoint /mnt/presentation && echo "zamontowany"
```
### Wykrycie nazw wyjść wideo (bez uruchomionego kiosku)
```bash
for p in /sys/class/drm/card*-*; do
echo "$(basename $p | sed 's/card[0-9]*-//'): $(cat $p/status)"
done
```
### Wymuszenie restartu pokazu (zmiana pliku)
```bash
touch /mnt/presentation/terminal_live.pptx
# skrypt wykryje zmianę mtime w ciągu 5 s i zrestartuje LO
```
### Czyszczenie cache Chromium
```bash
systemctl stop kiosk.service
rm -rf /home/kiosk/.cache/chromium
systemctl start kiosk.service
```
---
## Rozwiązywanie problemów
| Objaw | Przyczyna | Rozwiązanie |
|---|---|---|
| `waiting.html` nie pojawia się | Sieć dostępna natychmiast, ping loop kończy się w <2 s | Normalne zachowanie — `sleep 2` zapewnia min. 2 s widoczności |
| Prezentacja się nie wyświetla | SMB nie zamontowany | `journalctl -u kiosk.service -b \| grep mount` — sprawdź błędy |
| `mount: Permission denied` | Opcja `user` brak w fstab lub kiosk nie jest właścicielem | Sprawdź wpis fstab: `grep presentation /etc/fstab` |
| `mount: not found in /etc/fstab` | Brak wpisu fstab | Dodaj wpis zgodnie z sekcją 3c |
| Konsola LibreOffice widoczna na lewym ekranie po reboot | LibreOffice startuje przed Chromium (kiosk URL) i konsola zdąży się pokazać | Zwiększ `sleep 10` w `kiosk-manager.sh` (linia po pętli `kiosk-smb-ready`) |
| Chromium rozciągnięty na oba ekrany | Użyto `--kiosk` zamiast `--app` | Sprawdź `kiosk-manager.sh` — nie używamy `--kiosk` |
| Lewy ekran czarny, tylko prawy działa | Chromium nie znalazł okna w 30 s | `journalctl \| grep "kiosk-manager"` — sprawdź błędy Chromium |
| `openbox: command not found` | Brak pakietu | `apt install openbox` |
| `wmctrl: command not found` | Brak pakietu | `apt install wmctrl` |
| `xdotool: command not found` | Brak pakietu | `apt install xdotool` |
| Animacje nie działają | LO konwertuje do PNG/PDF (stare podejście) | Aktualna wersja używa `soffice --show` bezpośrednio — animacje powinny działać |
| Tekst źle wyświetlany (zła czcionka, zły układ) | Brak czcionki | Skopiuj pliki `.ttf`/`.otf` do `\\serwer\DatyFirmowe\ALS\fonts\` i zrestartuj kiosk — skrypt zainstaluje je automatycznie |
| Udział SMB z protokołem SMB 1.0 | `vers=3.0` nieobsługiwany | Zmień na `vers=2.1` lub `vers=1.0` w `/etc/fstab` |
| Czarny ekran po restarcie | Chromium trzyma zablokowany profil | `rm -rf /home/kiosk/.cache/chromium` |
| X11 nie startuje (`cannot open display`) | Brak pakietu xorg | `apt install xorg` |