# 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. 설치 패키지

```bash
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`)

```bash
#!/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` 후
  `.env`의 `NOVNC_URL=http://192.168.10.9:6080/vnc.html`.
