Orchestrator 5020b591aa fix: install.sh — sleep-safe, auto-display, fresh-machine install
- install.sh now has 8 steps:
  1) Detect arch, 2) Install deps, 3) Disable sleep/lock/screensaver,
  4) Detect display, 5) Setup dummy + force DUMMY0 primary,
  6) Start Xorg/Xvfb, 7) Download+install RustDesk (with apt fallback),
  8) Install systemd unit rustdesk-headless.service

- New systemd unit: rustdesk-headless.service
  * Forces DUMMY0 as primary via ExecStartPre (no monitor selection dialog)
  * Restart=always — survives any crash
  * Wants=display-manager.service — starts after graphical session

- Sleep-safe changes:
  * Mask sleep.target suspend.target hibernate.target hybrid-sleep.target
  * logind.conf: HandleLidSwitch=ignore, IdleAction=ignore
  * GNOME screensaver: gsettings lock-enabled false, idle-delay 0
  * X11: xset s off -dpms

- Fresh machine fixes:
  * dpkg --force-depends --force-confnew (installs even with missing deps)
  * apt-get install -f after dpkg (fixes broken deps)
  * Fallback to 'apt-get install rustdesk' from repo if .deb download fails
  * Added libva-drm2 libva-x11-2 (fresh systems often miss these)

- Output at end:
  * ID, Password, Display (:0 DUMMY0 primary), Sleep/Lock status
  * Monitor status via xrandr --listmonitors

Fixes #7
2026-05-16 11:19:43 +01:00

RDtop — RustDesk Headless Display

Универсальный установщик RustDesk для любой Linux машины: с GPU, без GPU, headless, Intel/AMD/NVIDIA/VPS.

Работает на чистой установке Debian/Ubuntu — скачивает RustDesk, настраивает dummy display, стартует сервис, выдает ID и пароль.

One command → ID + Password → Ready to connect

Quick Start (1 команда)

curl -fsSL https://git.softuniq.eu/NW/RDtop/raw/branch/main/install.sh | sudo bash

Результат в консоли:

============================================
         RustDesk Ready!
============================================

  ID:         158 356 564
  Password:   ********
  Display:    :0 (1920x1080 dummy)
  Version:    1.4.6
  Arch:       x86_64

  Connect:    rustdesk 158 356 564
============================================

Поддерживаемые платформы

Платформа Arch GPU Тестировано
Intel Alder Lake-N (i915) x86_64 iGPU
Intel NUC / Mini PC x86_64 iGPU / none
AMD Ryzen APU x86_64 Radeon Vega
NVIDIA Jetson aarch64 Tegra ⚠️
Raspberry Pi 4/5 aarch64 VideoCore
VPS (Hetzner, DO, AWS) x86_64 / aarch64 None
Старый PC без GPU x86_64 None

Что делает install.sh

Шаг Действие
1 Устанавливает зависимости (curl, Xorg, dummy driver)
2 Детектирует display: существующий или headless
3 Создает /etc/X11/xorg.conf.d/20-dummy-headless.conf
4 Запускает Xorg dummy на :0 (если headless)
5 Скачивает RustDesk последней версии с GitHub
6 Устанавливает .deb (авто-исправление зависимостей)
7 Стартует rustdesk --server с public rendezvous
8 Выводит ID и пароль в консоль

Установка

Автоматическая (рекомендуется)

curl -fsSL https://git.softuniq.eu/NW/RDtop/raw/branch/main/install.sh | sudo bash

Ручная (клонирование + запуск)

git clone https://git.softuniq.eu/NW/RDtop.git /tmp/rdtop && cd /tmp/rdtop
sudo bash install.sh

Только dummy display (если RustDesk уже установлен)

curl -fsSL https://git.softuniq.eu/NW/RDtop/raw/branch/main/config/x11-host/20-dummy-headless.conf | sudo tee /etc/X11/xorg.conf.d/20-dummy-headless.conf
sudo systemctl restart display-manager  # или reboot

Структура репозитория

RDtop/
├── install.sh              # ← One-command installer (this file)
├── bin/
│   └── hdmi-fallback.sh    # HDMI monitor & auto-clone (host only)
├── config/
│   ├── x11-host/
│   │   └── 20-dummy-headless.conf   # Dummy Xorg config
│   └── systemd/
│       └── hdmi-fallback.service    # User systemd unit (host)
├── scripts/
│   └── host/
│       ├── setup-host-rustdesk.sh   # Fix RustDesk ID persistence
│       └── README-host.md
└── README.md               # This file

Проверка после установки

# Проверить дисплей
$ xrandr --listmonitors
0: +*DUMMY0 1920/508x1080/286+0+0  DUMMY0   [PRIMARY]

# Проверить RustDesk
$ /usr/share/rustdesk/rustdesk --get-id
158 356 564

# Проверить сервис
$ systemctl --user status hdmi-fallback  # host only

Архивное решение (VPS relay)

Решение для VPS (hbbs/hbbr server + Xvfb + XFCE) заархивировано в ветке:

git checkout vps-rustdesk-server

Troubleshooting

Черный экран при подключении

# Проверить что DUMMY0 primary
xrandr --verbose | grep primary
# Должно быть: DUMMY0 connected primary

# Если нет — форсировать:
xrandr --output DUMMY0 --mode "1920x1080" --primary

ID меняется после перезагрузки (хост)

sudo bash scripts/host/setup-host-rustdesk.sh
# Защитит RustDesk.toml от перезаписи (chattr +i)

RustDesk не стартует

# Проверить логи
cat /tmp/rustdesk-server.log
cat /tmp/xorg-dummy.log

# Проверить процессы
pgrep -a rustdesk
pgrep -a Xorg

Технические детали

Почему dummy driver?

intel + VirtualHeads=1 работает только если HDMI был при загрузке. Без кабеля — VIRTUAL1 не создается.

Dummy driver не зависит от физических выходов.

Kernel EDID fallback (только для Intel iGPU хоста)

Если dummy не загрузится, ядро создаст виртуальный framebuffer:

video=HDMI-A-1:1920x1080@60 drm.edid_firmware=HDMI-A-1:edid/samsung.bin

Авторы

  • Deploy via AI Agent (Kilo Code Orchestrator)
  • Target: Intel Alder Lake-N, Debian 12
  • Universal: Any Linux with apt/dnf/pacman
Description
RustDesk headless setup for Intel iGPU with HDMI fallback
Readme 105 KiB
Languages
Shell 100%