feat: working XFCE + RustDesk online on VPS tmux

- 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
This commit is contained in:
Deploy Bot
2026-05-15 22:02:45 +01:00
parent be123e8057
commit 554aa6008d
4 changed files with 134 additions and 12 deletions

View File

@@ -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.
---

View File

@@ -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

View File

@@ -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

View File

@@ -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