Kiosk2.0: различия между версиями
Vovan (обсуждение | вклад) (→Пример веб-приложения с автоматическим стартом) |
Vovan (обсуждение | вклад) (→Пример веб-приложения с автоматическим стартом) |
||
| Строка 162: | Строка 162: | ||
<pre> | <pre> | ||
| + | |||
| + | mkdir /home/kiosk/server | ||
| + | echo << 'EOF' > /home/kiosk/server/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 | cat << 'EOF' > /etc/systemd/system/kiosk.service | ||
[Unit] | [Unit] | ||
Версия 22:32, 26 июня 2023
Содержание
- 1 Киоск на базе пустого образа Alt jeos (ISO installer)
- 1.1 Обновление ОС и ядра
- 1.2 Оптимизация скорости загрузки
- 1.3 Установка необходимых пакетов через apt-get
- 1.4 Создание и настройка пользователя kiosk
- 1.5 Автологин пользователя kiosk на консоли tty1
- 1.6 Создание стартового скрипта .xinitrc в домашнем каталоге пользователя kiosk
- 1.7 Минимальная установка платформы NodeJS (если необходима)
Киоск на базе пустого образа 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 /home/kiosk/server
echo << 'EOF' > /home/kiosk/server/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