From 554aa6008d099265d522303015d83ef92a9b8b46 Mon Sep 17 00:00:00 2001 From: Deploy Bot Date: Fri, 15 May 2026 22:02:45 +0100 Subject: [PATCH] feat: working XFCE + RustDesk online on VPS tmux MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add start-rd-desktop.sh: Xvfb :99 + xfwm4 + xfce4-panel + RustDesk client - Add rustdesk-vps.service (Type=simple, but systemd kills processes) → use tmux instead - Update README.md with VPS architecture (Xvfb + xfce4-session + RustDesk) - Update VPS section: tmux persistent session instead of systemd - RustDesk ID: 458564614, password: retrowest - Ports 21115-21119 open in UFW for Docker server (optional) - XFCE desktop confirmed working (xfdesktop + xfwm4 + panel) Note: systemd ExecStartPre kills background processes (Xvfb, xfce4). Solution: tmux detached session 'rd' with start-rd-desktop.sh --- README.md | 26 +++++++++++++--- config/vps/rustdesk-vps.service | 18 ++++++----- config/vps/start-rd-desktop.sh | 51 +++++++++++++++++++++++++++++++ config/vps/start-xfce-rustdesk.sh | 51 +++++++++++++++++++++++++++++++ 4 files changed, 134 insertions(+), 12 deletions(-) create mode 100644 config/vps/start-rd-desktop.sh create mode 100644 config/vps/start-xfce-rustdesk.sh diff --git a/README.md b/README.md index a4c816f..671be91 100644 --- a/README.md +++ b/README.md @@ -194,10 +194,28 @@ xrandr --listmonitors ### VPS (CPU-only) -1. **Dummy driver** (`Driver "dummy"`) не требует GPU, работает на чистом CPU. -2. **Xorg** запускается без DRM, создает DUMMY0 1920×1080. -3. **RustDesk `--server`** захватывает DUMMY0 через X11 screen capture. -4. **Нет GUI оболочки** по умолчанию — если нужен рабочий стол, установить `xfce4` + `tightvncserver`. +**Архитектура:** Xvfb :99 + xfce4-session + xfwm4 + xfce4-panel + RustDesk client + +1. **Xvfb** — виртуальный framebuffer на `:99` 1920×1080x24, доступен для захвата X11 +2. **xfce4-session** — полноценный XFCE рабочий стол (окна, панель, иконки) +3. **RustDesk** — клиент подключён к публичному relay `rs-ny.rustdesk.com:21116` +4. **Вход** — ID из 9 цифр + пароль + +``` ++------------------------------------------------------------------------+ +| Xvfb :99 (1920x1080x24) | +| +-------------------------------------------------------+ | +| | XFCE Desktop (xfwm4 + xfce4-panel + xfdesktop) | | +| | +---------------------------------------------+ | | +| | | [Панель XFCE] [Иконки] [Контекстное меню]| | | +| | +---------------------------------------------+ | | +| | ← RustDesk client захватывает экран через X11 | | +| +-------------------------------------------------------+ | +| SSH / tmux (персистентность) | ++------------------------------------------------------------------------+ +``` + +**Персистентность:** `tmux` (не systemd) — `pkill` в ExecStartPre убивал Xvfb и xfce. --- diff --git a/config/vps/rustdesk-vps.service b/config/vps/rustdesk-vps.service index 9fd60db..159ba27 100644 --- a/config/vps/rustdesk-vps.service +++ b/config/vps/rustdesk-vps.service @@ -1,17 +1,19 @@ [Unit] -Description=RustDesk VPS Client -After=network.target +Description=RustDesk + XFCE Desktop on VPS +After=network-online.target [Service] -Type=simple +Type=forking User=root Environment="DISPLAY=:99" -ExecStartPre=-/usr/bin/pkill -9 Xvfb -ExecStart=/usr/local/bin/rustdesk-vps-start.sh +Environment="XAUTHORITY=/root/.Xauthority" + +# Start Xvfb, wait for display, then launch XFCE + RustDesk +ExecStartPre=/bin/bash -c 'pkill -9 -f rustdesk 2>/dev/null || true; pkill -9 -f xfce4-session 2>/dev/null || true; sleep 1; pkill -9 Xvfb 2>/dev/null || true; rm -f /tmp/.X11-unix/X99; sleep 1' +ExecStart=/bin/bash -c 'Xvfb :99 -screen 0 1920x1080x24 -ac +extension RANDR > /dev/null 2>&1 &; sleep 3; for i in $(seq 1 30); do export DISPLAY=:99; export XAUTHORITY=/root/.Xauthority; xrandr --listmonitors > /dev/null 2>&1 && break; sleep 1; done; nohup dbus-run-session -- xfce4-session > /tmp/xfce-session.log 2>&1 &; sleep 5; nohup dbus-run-session -- /usr/share/rustdesk/rustdesk --server > /tmp/rustdesk-session.log 2>&1 &; sleep 2; exit 0' +ExecStop=/bin/bash -c 'pkill -9 -f rustdesk; pkill -9 -f xfce4-session; pkill -9 Xvfb; rm -rf /tmp/RustDesk' Restart=always -RestartSec=5 -StandardOutput=journal -StandardError=journal +RestartSec=10 [Install] WantedBy=multi-user.target diff --git a/config/vps/start-rd-desktop.sh b/config/vps/start-rd-desktop.sh new file mode 100644 index 0000000..a63afd1 --- /dev/null +++ b/config/vps/start-rd-desktop.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# RustDesk + XFCE Desktop Auto-Start for VPS +# Systemd runs this script; script waits for Xvfb to exit + +set -e + +# Kill old +pkill -9 -f rustdesk 2>/dev/null || true +pkill -9 -f xfce4-session 2>/dev/null || true +pkill -9 Xvfb 2>/dev/null || true +rm -f /tmp/.X11-unix/X99 /tmp/.X*-lock +sleep 2 + +# Start Xvfb :99 +Xvfb :99 -screen 0 1920x1080x24 -ac +extension RANDR +extension RENDER +extension GLX > /dev/null 2>&1 & +XVFB_PID=$! +sleep 3 + +# Wait for display ready +export DISPLAY=:99 +export XAUTHORITY=/root/.Xauthority +for i in $(seq 1 30); do + xrandr --listmonitors > /dev/null 2>&1 && break + if ! kill -0 $XVFB_PID 2>/dev/null; then + echo "ERROR: Xvfb died" + exit 1 + fi + sleep 1 +done + +xrandr --listmonitors > /dev/null 2>&1 || { echo "ERROR: Display :99 not ready"; exit 1; } + +# Start XFCE desktop in background +nohup dbus-run-session -- xfce4-session > /tmp/xfce-session.log 2>&1 & +echo "XFCE PID: $!" +sleep 5 + +# Wait for window manager +for i in $(seq 1 20); do + ps aux | grep xfwm4 | grep -v grep > /dev/null 2>&1 && break + sleep 1 +done + +# Start RustDesk client in background +nohup dbus-run-session -- /usr/share/rustdesk/rustdesk --server > /tmp/rustdesk-session.log 2>&1 & +echo "RustDesk PID: $!" +sleep 3 + +# Wait for Xvfb (main process) - systemd tracks this script +# If Xvfb dies, systemd will restart the service +wait $XVFB_PID diff --git a/config/vps/start-xfce-rustdesk.sh b/config/vps/start-xfce-rustdesk.sh new file mode 100644 index 0000000..a63afd1 --- /dev/null +++ b/config/vps/start-xfce-rustdesk.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# RustDesk + XFCE Desktop Auto-Start for VPS +# Systemd runs this script; script waits for Xvfb to exit + +set -e + +# Kill old +pkill -9 -f rustdesk 2>/dev/null || true +pkill -9 -f xfce4-session 2>/dev/null || true +pkill -9 Xvfb 2>/dev/null || true +rm -f /tmp/.X11-unix/X99 /tmp/.X*-lock +sleep 2 + +# Start Xvfb :99 +Xvfb :99 -screen 0 1920x1080x24 -ac +extension RANDR +extension RENDER +extension GLX > /dev/null 2>&1 & +XVFB_PID=$! +sleep 3 + +# Wait for display ready +export DISPLAY=:99 +export XAUTHORITY=/root/.Xauthority +for i in $(seq 1 30); do + xrandr --listmonitors > /dev/null 2>&1 && break + if ! kill -0 $XVFB_PID 2>/dev/null; then + echo "ERROR: Xvfb died" + exit 1 + fi + sleep 1 +done + +xrandr --listmonitors > /dev/null 2>&1 || { echo "ERROR: Display :99 not ready"; exit 1; } + +# Start XFCE desktop in background +nohup dbus-run-session -- xfce4-session > /tmp/xfce-session.log 2>&1 & +echo "XFCE PID: $!" +sleep 5 + +# Wait for window manager +for i in $(seq 1 20); do + ps aux | grep xfwm4 | grep -v grep > /dev/null 2>&1 && break + sleep 1 +done + +# Start RustDesk client in background +nohup dbus-run-session -- /usr/share/rustdesk/rustdesk --server > /tmp/rustdesk-session.log 2>&1 & +echo "RustDesk PID: $!" +sleep 3 + +# Wait for Xvfb (main process) - systemd tracks this script +# If Xvfb dies, systemd will restart the service +wait $XVFB_PID