Files
javis_bot/docs/vnc-xfce-setup.md
javis-bot c4abf63f38
Some checks failed
Release / semantic-release (push) Successful in 59s
tests / Unit tests (Linux, Python 3.11) (push) Successful in 13m45s
Release / build-linux (push) Failing after 7m47s
Release / build-windows (push) Has been cancelled
Release / build-macos (arm64, macos-latest) (push) Has been cancelled
Release / build-macos (x64, macos-15-intel) (push) Has been cancelled
Release / release-main (push) Has been cancelled
Release / release-develop (push) Has been cancelled
Add Discord-native hybrid front-end for Jarvis (bot + bridge)
Transform isair/jarvis into a Discord-controlled voice assistant running on
the Ubuntu VNC desktop, keeping the mature ~39k-line Python brain intact.

- bot/ (Node + bun, discord.js): /자비스 slash commands (ephemeral),
  voice channel join + voice receive/playback, pluggable VNC screen broadcast
  (selfbot live / noVNC / screenshot)
- bridge/ (Python, Flask): wraps jarvis STT + run_reply_engine + Piper TTS
  behind a thin localhost HTTP API
- .env.example, scripts/ (start_bridge/start_bot/dev), README rewrite,
  docs/language-comparison.md and docs/vnc-xfce-setup.md

Language decision: hybrid (Python brain + Node/bun Discord layer) because
Discord blocks bot video; native screen broadcast only works via a Node
selfbot library.
2026-06-09 14:51:05 +09:00

3.9 KiB

VM 106 (claude) — VNC + XFCE 원격 데스크톱 셋업 기록

Ubuntu 26.04 LTS / Proxmox VM 106 / RTX 5050 GPU 패스스루(연산 전용) 환경에서 헤드리스(모니터 없음) 원격 데스크톱을 구성한 전체 과정과 함정 정리. 용도: 크롬으로 웹 제어 + 디스코드 화면공유 (Javis 연동)


1. 최종 구성 요약

항목
VM 106 (claude), IP 192.168.10.9
OS Ubuntu 26.04 LTS (resolute)
GPU RTX 5050 패스스루, 연산 전용 (no x-vga), CUDA 13.2, driver 595.71.05
VNC 서버 TigerVNC 1.15.0, 포트 5901
데스크톱 XFCE
자동 시작 ~/start-vnc.sh + systemd user service + linger
접속 VNC 뷰어로 192.168.10.9:5901 (RDP 아님 / mstsc 안 됨)

2. 접속 정보

  • 프로토콜: VNC (RDP 아님 — 윈도우 mstsc로는 접속 불가)
  • 주소: 192.168.10.9:5901
  • VNC 뷰어: TigerVNC Viewer / RealVNC Viewer / MobaXterm 내장 VNC
  • 비밀번호: vncpasswd로 설정한 8자 (VNC는 비번 8자 제한)

3. 핵심 함정 (이게 제일 중요)

3-1. RDP(gnome-remote-desktop)는 포기 → VNC로 전환

  • 시스템 모드 grdctl --system에서 자격증명 키링 저장 실패 (TPM 없음 → GKeyFile 폴백 깨짐)
  • Credentials are not set, denying client 로 접속 거부 → TigerVNC로 전환

3-2. GPU 패스스루 환경 → render/video 그룹 필수

  • claude 사용자가 render, video 그룹에 없으면 Xvnc가 /dev/dri 접근 실패로 X 서버 즉시 크래시
  • 증상: libEGL warning: failed to open /dev/dri/card0: Permission denied, X connection to :1 broken
  • 해결: sudo usermod -aG render,video claude (그룹 추가 후 재로그인/재부팅 필요)

3-3. startxfce4 대신 xfce4-session 직접 호출

  • startxfce4는 X 서버가 이미 떠 있으면 그냥 종료됨 → xstartup에서 xfce4-session 직접 호출

3-4. 메뉴/패널이 비면 → RENDER 확장 켜기 + XDG 환경변수

  • -extension RENDER를 넣으면 XFCE 메뉴/패널이 공백으로 나옴 → 이 환경에선 RENDER 켜는 게 정답
  • systemd 서비스 환경엔 XDG_DATA_DIRS, XDG_CONFIG_DIRS를 명시

3-5. 설정 손상 시 초기화

  • mv ~/.config/xfce4 ~/.config/xfce4.broken && mv ~/.cache/xfce4 ~/.cache/xfce4.broken 후 재시작

3-6. systemctl --user는 XDG_RUNTIME_DIR 필요

  • export XDG_RUNTIME_DIR=/run/user/$(id -u)

4. 설치 패키지

sudo apt install -y tigervnc-standalone-server tigervnc-common
sudo apt install -y xfce4 xfce4-goodies dbus-x11
sudo apt install -y fonts-noto-cjk fonts-noto-cjk-extra fonts-nanum
cd /tmp && wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install -y ./google-chrome-stable_current_amd64.deb

5. 자동 시작 (~/start-vnc.sh)

#!/bin/bash
export DISPLAY=:1
export XDG_RUNTIME_DIR=/run/user/$(id -u)
export HOME=/home/claude
export XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
export XDG_CONFIG_DIRS=/etc/xdg
pkill -9 -u $(id -u) Xvnc 2>/dev/null
sleep 2
# 주의: -extension RENDER 넣지 말 것 (메뉴/패널이 안 그려짐)
/usr/bin/Xvnc :1 -geometry 1920x1080 -depth 24 -rfbport 5901 \
  -rfbauth $HOME/.config/tigervnc/passwd -SecurityTypes VncAuth -localhost no &
sleep 5
exec dbus-launch --exit-with-session xfce4-session

systemd user service + linger로 부팅 시 자동 시작.


6. Javis 연동 시 핵심 포인트

  • 봇/브릿지는 디스플레이 :1 에서 동작하는 X 화면을 사용합니다 (VNC_DISPLAY=:1).
  • 크롬 제어: DISPLAY=:1 google-chrome --password-store=basic --no-first-run
  • 화면 송출(셀프봇/스크린샷)은 ffmpeg x11grab으로 :1을 캡처합니다.
  • noVNC를 쓰려면: websockify --web=/usr/share/novnc 6080 localhost:5901.envNOVNC_URL=http://192.168.10.9:6080/vnc.html.