Kiosk2.0

Материал из wiki.nntc.nnov.ru
Версия от 22:33, 26 июня 2023; Vovan (обсуждение | вклад) (Пример веб-приложения с автоматическим стартом)
Перейти к навигации Перейти к поиску

Киоск на базе пустого образа Alt jeos (ISO installer)

Качаем отсюда:

wget https://mirror.yandex.ru/altlinux-starterkits/x86_64/release/alt-p10-jeos-sysv-20230610-x86_64.iso

Устанавливаем на железо или в виртуальную машину, настраиваем сеть и доступ по ssh.

Дальнейшие действия выполняем по ssh...

Обновление ОС и ядра

В этом разделе всё делается в рутовой консоли. Т.к. sudo по умолчанию в ОС Альт не присутствует (ниже мы его добавим).

Обновим индекс репозитория, дистрибутив, ядро

apt-get update && apt-get dist-upgrade -y && apt-get install update-kernel -y && update-kernel -f

Перезагрузимся для загрузки с новым ядром (если оно обновилось)

reboot

Оптимизация скорости загрузки

Просто бросьте это в рутовую консоль:

cat << 'EOF' > /etc/default/grub 
GRUB_AUTOUPDATE_CFG=true
GRUB_AUTOUPDATE_CFGNAME=/boot/grub/grub.cfg
GRUB_VMLINUZ_SYMLINKS=default
GRUB_VMLINUZ_FAILSAFE=default
GRUB_TIMEOUT=0
GRUB_CMDLINE_LINUX_DEFAULT='panic=30 splash'
GRUB_CMDLINE_LINUX='failsafe vga=normal'
GRUB_TERMINAL_OUTPUT='gfxterm'
GRUB_GFXMODE='auto'
GRUB_DEFAULT='saved'
GRUB_SAVEDEFAULT=true
GRUB_BACKGROUND="/etc/bootsplash/themes/current/images/silent-800x600.jpg"
GRUB_WALLPAPER="/etc/bootsplash/themes/current/images/silent-800x600.jpg"
GRUB_COLOR_NORMAL="black/black"
GRUB_COLOR_HIGHLIGHT="white/black"
GRUB_DISTRIBUTOR="ALT Linux"
GRUB_BOOTLOADER_ID="altlinux"
EOF

update-grub

Установка необходимых пакетов через apt-get

apt-get -y -q install wget nano xorg-server xinit xorg-drv-qxl xorg-drv-vesa xorg-drv-vmware xorg-drv-intel xorg-drv-nouveau xorg-drv-radeon xorg-drv-ati xorg-drv-amdgpu xorg-drv-r128 xorg-drv-synaptics xorg-drv-vboxvideo xorg-drv-vmmouse xorg-drv-wacom xorg-drv-input xorg-drv-video xdotool usb-modeswitch-data usb-modeswitch openssh sudo su xterm xhost git npm gcc10-c++ gcc-c++ make epm usbutils autosshd unclutter chromium wkhtmltopdf pulseaudio-daemon alsa-plugins-pulse pulseaudio-utils aplay amixer alsa-utils

Создание и настройка пользователя kiosk

useradd kiosk

установка пароля

passwd kiosk

добавляем пользователя kiosk в группу wheel (для sudo su)

usermod kiosk -aG wheel

и в группу dialout (для доступа к устройствам /dev/tty*)

usermod kiosk -aG dialout

делаем sudo su без пароля для пользователя kiosk (просто бросьте это в рутовую консоль):

cat << 'EOF' > /etc/sudoers
User_Alias      WHEEL_USERS = %wheel
User_Alias      XGRP_USERS = %xgrp
Defaults:XGRP_USERS env_keep += "DISPLAY XAUTHORITY"

kiosk ALL=(ALL) NOPASSWD: ALL

@includedir /etc/sudoers.d
EOF

Автологин пользователя kiosk на консоли tty1

Просто бросьте это в рутовую консоль:

cat << 'EOF' > /etc/systemd/system/getty.target.wants/getty\@tty1.service
[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service getty-pre.target
After=rc-local.service

Before=getty.target
IgnoreOnIsolate=yes

Conflicts=rescue.service
Before=rescue.service

ConditionPathExists=/dev/tty0

[Service]
#ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear %I $TERM
ExecStart=-/sbin/agetty --autologin kiosk --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
IgnoreSIGPIPE=no
SendSIGHUP=yes

UnsetEnvironment=LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION

[Install]
WantedBy=getty.target
DefaultInstance=tty1
EOF

systemctl daemon-reload

Создание стартового скрипта .xinitrc в домашнем каталоге пользователя kiosk

Скрипт запускает сессию Xorg, устанавливает разрешение экрана, запускает браузер chromium в режиме киоска и подгружает в него стартовую страницу ya.ru.

Здесь может быть запущено веб приложение, стартующее на локальном хосте (для этого можно поставить платформу nodejs))

Просто бросьте это в рутовый терминал:

cat << 'EOF' > /home/kiosk/.xinitrc
xrandr -s 1280x1024
unclutter -idle 0 &
amixer -D default sset Master 100%
amixer -D default sset PCM 100%
/bin/rm -rf ~/.config/chromium
chromium-browser --kiosk --incognito "http://ya.ru" &
xdotool search --sync --onlyvisible --class "firefox" windowsize 1280 1024
EOF

chown kiosk: /home/kiosk/.xinitrc
echo 'startx' >> /home/kiosk/.bashrc

Минимальная установка платформы NodeJS (если необходима)

Платформа

cd /tmp && wget https://nodejs.org/dist/v18.16.1/node-v18.16.1-linux-x64.tar.xz && unxz node-v18.16.1-linux-x64.tar.xz && cd /opt && tar -xpf /tmp/node-v18.16.1-linux-x64.tar && echo 'PATH="/opt/node-v18.16.1-linux-x64/bin:$PATH"' >> /etc/bashrc && source /etc/bashrc

Пример веб-приложения с автоматическим стартом

Просто бросьте это в консоль:


mkdir -p /home/kiosk/server/bin
cat << 'EOF' > /home/kiosk/server/bin/www
const http = require('http');

const port = process.env.PORT || 3000;

const server = http.createServer((req, res) => {
  let url = req.url;
  let content = '';

  if (url === '/') {
    content = `
      <h1>Welcome to the Home Page!</h1>
      <p><a href="/about">About Us</a></p>
      <p><a href="/contact">Contact Us</a></p>
    `;
  } else if (url === '/about') {
    content = `
      <h1>About Us</h1>
      <p>We are a company that provides amazing services.</p>
      <p><a href="/">Home</a></p>
      <p><a href="/contact">Contact Us</a></p>
    `;
  } else if (url === '/contact') {
    content = `
      <h1>Contact Us</h1>
      <p>You can reach us at example@example.com</p>
      <p><a href="/">Home</a></p>
      <p><a href="/about">About Us</a></p>
    `;
  } else {
    res.writeHead(404, { 'Content-Type': 'text/plain' });
    res.end('Page not found');
    return;
  }

  res.writeHead(200, { 'Content-Type': 'text/html' });
  res.end(content);
});

server.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});
EOF

chown kiosk: /home/kiosk/server -R

cat << 'EOF' > /etc/systemd/system/kiosk.service 
[Unit]
Description=KIOSK
Requires=network-online.target
After=network-online.target

[Service]
Environment=PORT=3000
Restart=always
RestartSec=5
WorkingDirectory=/home/kiosk/server
ExecStart=/opt/node-v18.16.1-linux-x64/bin/node ./bin/www
User=kiosk
Group=kiosk
[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload

systemctl enable --now systemctl daemon-reload