Веб-киоск на базе Ubuntu 18.04 LTS Server и Chromium

Преамбула 

Необходимо организовать веб-киоск для посетителей организации. Киоск должен показывать только сайт компании. Никаких других возможностей быть не должно. Для тех. поддержки должен быть доступ через VNC. 

Амбула

Это инструкция является в основном компиляцией этих статей: 

1. Установка Linux

Ставим Ubuntu 18.04 LTS Server. После установки обновляем ОС: 
sudo apt-get update
sudo apt-get upgrade -y
sudo reboot
После перезагрузки можно сменить имя киоска (если при установке задали неправильно): 
  1. в /etc/cloud/cloud.cfg указываем
    preserve_hostname: true
  2. Перезагружаем (надо ли?) ПК
    sudo reboot
  3. переименовываем хост
    sudo hostnamectl set-hostname NEW_HOST_NAME
  4. ... и опять
    sudo reboot
Проверяем (исправляем) временную зону у киоска: 
sudo dpkg-reconfigure tzdata

Проверяем (исправляем) русскую раскладку у киоска: 
sudo dpkg-reconfigure keyboard-configuration

2. Создаем пользователя для киоска 

Создаем пользователя kiosk с домашней папкой и членством в группе users:
sudo useradd -m -g users kiosk
Разрешаем группе users выключать и перезагружать киоск без ввода пароля -  в /etc/sudoers дописываем в конец строку:
%users ALL=(ALL) NOPASSWD: /sbin/reboot, /sbin/init
Настраиваем пользователю авто-логон на первом консольном экране: 
sudo systemctl edit getty@tty1
в открывшемся редакторе пишем: 
[Service]
ExecStart=
ExecStart=-/sbin/agetty -a kiosk --noclear %I $TERM
Сохраняем конфигурацию (ctrl+o), выходим из редактора (ctrl+x). 

3. Установка и настройка ПО киоска

Идея работы такая: 
после автологона пользователя kiosk происходит запуск shell, у которого в .profile указано что если текущий терминал tty1 то нужно запустить X, которые в свою очередь запустят openbox. У openbox в autostart указано, кроме всего прочего, запускать фоном (&vnc-сессию для текущего пользователя и скрипт loop.sh из домашней папки (в скрипте должен бесконечно вызываться chromium): 
  1. Ставим chromium:
    sudo apt-get install --no-install-recommends chromium-browser
  2. Так как специально был выбран дистрибутив без графического интерфейса, ставим X-windows и менеджер стола openbox:
    sudo apt-get install --no-install-recommends xserver-xorg x11-xserver-utils xinit openbox -y
  3. устанавливаем VNC (чтобы в дальнейшем можно было подключиться к сеансу киоска в случае каких-либо проблем), указываем пароль для доступа по VNC, разрешаем читать хэш пароля:
    sudo apt install x11vnc -y
    sudo x11vnc -storepasswd "Qwe123" /etc/x11vnc.pass
    sudo chmod +r /etc/x11vnc.pass
  4. Настраиваем профиль shell пользователя kiosk (/home/kiosk/.profile) на запуск X если пользователь зашел на tty1:
    if [ -z "$DISPLAY" ] && [ $(tty) = /dev/tty1 ]; then startx
    fi
  5. Подготавливаем скрипт авто-перезапуска chromium (запускать в режиме киоска, в цикле через 5 сек после закрытия) у пользователя kiosk в домашней папке (/home/kiosk/loop.sh):
    #!/bin/bash
    while true; do chromium-browser --kiosk --incognito --disable-infobars 'http://shp.formulam2.ru' ; sleep 5s ; done
    Добавляем права для запуска:
    chmod +x /home/kiosk/loop.sh
  6. Редактируем autostart у openbox (/etc/xdg/openbox/autostart):
    # Disable any form of screen saver / screen blanking /
    # power management
    xset s off
    xset s noblank
    xset -dpms
    # Allow quitting the X server with CTRL-ATL-Backspace
    setxkbmap -option terminate:ctrl_alt_bksp
    # Start VNC in background
    /usr/bin/x11vnc -rfbauth /etc/x11vnc.pass -noxdamage -shared -dontdisconnect -many -noxfixes -auth ~/.Xauthority -loop &
    # Start Chromium in kiosk mode
    sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' ~/.config/chromium/'Local State'
    sed -i 's/"exited_cleanly":false/"exited_cleanly":true/; s/"exit_type":"[^"]\+"/"exit_type":"Normal"/' ~/.config/chromium/Default/Preferences
    # first start without loop & not incognito -- to create
    # chromium profile
    chromium-browser 'http://shp.formulam2.ru'
    # in future -- comment stroke above and uncomment below
    #~/loop.sh

4. Первый запуск, проверка работы киоска

Как обычно,
sudo reboot
и проверяем, как работает киоск - загрузился ли автоматически, как работает перемещение по сайту. Обязательно отказываемся от автоматического перевода для русского языка или меняем язык на русский. Проверяем доступ по VNC.

У меня возникла проблема на одном одном из киосков - понадобилось вручную доустановить драйвера видеоадаптера (?): 
sudo apt install xserver-xorg-video-fbdev -y 
sudo apt install xserver-xorg-video-intel -y

5. Окончательная настройка  

После успешной проверки запуска киоска и настройки русского языка в chromium, необходимо: 
  1. в конфиге автостарта openbox (пп. 3.6, /etc/xdg/openbox/autostart):
    • закомментировать предпоследний параметр - явный запуск chromium:
      chromium-browser 'http://shp.formulam2.ru'
    •  разкомментировать  последний параметр - вызов скрипта цикличного запуска chromium:
      ~/loop.sh
  2. Настроить контекстное меню openbox (/etc/xdg/openbox/menu.xml) - чтобы можно было при закрытом chromium только выключить или перезагрузить киоск:
    <?xml version="1.0" encoding="UTF-8"?>
    <openbox_menu xmlns="http://openbox.org/"        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"        xsi:schemaLocation="http://openbox.org/ file:///usr/share/openbox/menu.xsd">
    <menu id="root-menu" label="Openbox 3">
      <!-- This requires the presence of the 'openbox-menu' package to work -->
      <item label="Перезагрузка ПК">
              <action name="Execute">
                      <execute>
                            /sbin/reboot
                      </execute>
              </action>
      </item>
      <separator />
      <item label="Выключение ПК">
              <action name="Execute">
                      <execute>
                            /sbin/init 0
                      </execute>
              </action>
      </item>
    </menu>
    </openbox_menu>
  3. Запрещаем для графического режима переключаться в соседние терминалы (отключаем комбинацию Ctrl+Alt+Fn):
    • создаем конфигурационный файл:
      /usr/share/X11/xorg.conf.d/50-novtswitch.conf
    • Добавляем в него настройки:
      Section "ServerFlags"
          Option "DontVTSwitch" "true"
      EndSection
  4. Перезагружаем киоск, проверяем работу

6. Необязательная настройка киоска 

В моем случае понадобилось дополнительно запланировать ежедневное выключение киоска в 18:05 через cron: 
sudo crontab -e 
добавляем строку: 
05 18 * * * /sbin/init 0

7. Что не устраивает

  1. Можно закрыть приложение киоска (chromium, Alt+F4)
  2. Можно пользоваться комбинациями клавиш в chromium (открывать новые окна с адресной строкой, запускать отладчик и т.д.)

Комментарии

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. А как устанавливать на ноутбуке, возможно в Virtualbox, чтобы команды не вводить с клавиатуры, а копировать из вашей инструкции?

    ОтветитьУдалить
    Ответы
    1. Извиняюсь перед всеми за поздние ответы - блог просто как записная книжка "для себя" , меньше всего жду что кто-то посторонний заинтересуется его содержимым, и поэтому не мониторю комментарии к нему .
      По вопросу "как" - я бы после установки в виртуалбоксе линукса заходил бы на него по ssh (с Windows - через putty / kitty) , а в терминале буфер работает.

      Удалить
  3. Как-то можно отключить комбинации клавиш Alt+Tab, например?

    ОтветитьУдалить
    Ответы
    1. Честно говоря не делал так. И попробовать сейчас негде - проект киосков свернули. Можно погуглить запрос типа "disable alt tab in openbox", мне в результатах поиска показались перспективными эти ресурсы:
      https://askubuntu.com/questions/1098362/openbox-disable-altf4
      https://urukrama.wordpress.com/2011/11/01/reverting-to-the-old-alt-tab-dialog-in-openbox-3-5/
      https://melp.nl/2011/01/10-must-have-key-and-mouse-binding-configs-in-openbox/

      Удалить
  4. Лучшая инструкция, которую я видел, благодарю! Очень интересно, как сделать систему read only? Потому что все равно киоск будут дергать из сети в самое неподходящее время, и при следующей загрузке она может вывалиться в initramfs, у меня было такое. Как исправить знаю, а как предотвратить - большой вопрос

    ОтветитьУдалить
  5. Толковая инструкция! Натолкнуло на идею использовать монитор в режиме портрета, однако в данной конфигурации xrandr не сработал. Есть идеи как повернуть изображение?

    ОтветитьУдалить

Отправить комментарий