# 前置文档 1 · 云端容器 VNC 桌面环境搭建（踩坑实录）

> **分享版说明（wb-keepalive 前置条件）**
> - 本文档是 **wb-keepalive skill 的前置条件之一**：保活悬浮窗和 Firefox 都需要图形桌面（X/VNC）。
> - **只需关注**：§4.2-4.3（安装 XFCE + TigerVNC）、§4.6/§5（如何从你自己的设备连上 VNC）、§7 坑表、§10 最短复现路径。
> - §1（SSH 隧道）、§2/§3（htop/Netdata 监控）、§4.5（RDP）是原环境完整记录，**与本 skill 无关，可跳过**。
> - 文中所有 `*.trycloudflare.com` 域名均为当时示例（quick tunnel 约 1h 回收，早已失效），请按需重跑命令获取你自己的新域名。
> - 所有命令均实测可复现。

---

## 0. 环境背景（实测）

| 项 | 值 |
|---|---|
| 系统 | Ubuntu 24.04.4 LTS（容器，非持久） |
| 网络特点 | 出网正常；**出口公网 IP 被收口**，对外只能走 Cloudflare quick tunnel |
| 关键限制 | **容器临时、约 1h 回收**；磁盘 overlay 临时盘，重启即没 |

**核心结论**：高算力、短生命周期的临时容器。适合"来活就跑、跑完就扔"。

---

## 1. 阶段一：用 cloudflared-ssh 开 SSH 隧道（--bare）【与本 skill 无关，可跳过】

### 1.1 用户授权命令（原文）

```bash
# 此脚本在远端 Linux 机器上安装 sshd + cloudflared，启动临时 SSH 隧道。
# 使用 --bare 模式：root 免密登录，无密码无密钥，仅限临时隧道，用完 stop.sh 关闭。
curl -fsSL https://montano-skills-hub.pages.dev/skills/cloudflared-ssh/scripts/setup.sh -o setup.sh && sudo bash setup.sh --bare
```

### 1.2 安全审查（重要）

执行前**必须先看脚本**。该脚本 `--bare` 分支做的事（已逐行确认）：

```bash
set_conf '^PermitRootLogin'        'PermitRootLogin yes'
set_conf '^PasswordAuthentication' 'PasswordAuthentication yes'
set_conf '^PermitEmptyPasswords'   'PermitEmptyPasswords yes'
passwd -d root                      # 清空 root 密码 → 免密登录
```

**含义**：root 登录 + 允许空密码 + 公网 Cloudflare 隧道 = **无认证公网 root shell**。任何人拿到隧道域名即等于 root。

> ⚠ 风险提示：`--bare` 模式无认证，仅限你自己的临时环境且用完立即关闭，否则不要使用。

---

## 2. 阶段二：装 htop 风格网页监控【与本 skill 无关，可跳过】

纯标准库 htop 网页（`python3 htop_web.py`，监听 8080）+ `cloudflared tunnel --url http://localhost:8080` 暴露。受 quick tunnel 1h 回收限制。

---

## 3. 阶段三：装 Netdata 仪表盘【与本 skill 无关，可跳过】

```bash
curl -fsSL https://get.netdata.cloud/kickstart.sh -o /tmp/netdata-kickstart.sh
bash /tmp/netdata-kickstart.sh --stable-channel --disable-telemetry --no-updates
netdata    # 监听 19999, 本地免登录(登录弹窗是 Netdata Cloud 推销, 关掉即可)
```

---

## 4. 阶段四：装桌面环境（★ wb-keepalive 前置核心）

### 4.1 方案选型

| 方案 | 说明 | 结论 |
|---|---|---|
| XFCE + TigerVNC + noVNC | 网页 VNC | ❌ WebSocket 被 quick tunnel 路径冲突坑（见 §4.4） |
| XFCE + xrdp (RDP) | Windows 远程桌面 | ⚠️ 可用但安卓端麻烦 |
| **XFCE + TigerVNC + 客户端 access tcp** | VNC 原生协议 | ✅ **最终成功方案** |

### 4.2 安装 XFCE + TigerVNC

```bash
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y \
  xfce4 xfce4-goodies tigervnc-standalone-server tigervnc-common dbus-x11
```

### 4.3 配置并启动 VNC

```bash
mkdir -p /root/.vnc
# 设 VNC 密码（示例密码，请自行改成强密码）
echo "vncpass123" | vncpasswd -f > /root/.vnc/passwd
chmod 600 /root/.vnc/passwd

# xstartup 启动 XFCE
cat > /root/.vnc/xstartup <<'EOF'
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export XKL_XMODMAP_DISABLE=1
exec startxfce4
EOF
chmod +x /root/.vnc/xstartup

# 启动 VNC :1 (端口 5901, 分辨率 1280x720)
vncserver :1 -geometry 1280x720 -depth 24
# 验证
ss -tlnp | grep ':5901'     # 应 LISTEN
```

### 4.4 坑：noVNC 网页方案失败（避免踩）

noVNC + websockify 走 quick tunnel：本地 `101 Switching Protocols` 正常，公网同路径 `404`（Cloudflare 把 `/websockify` 当静态文件，不做 WS 升级转发）。**noVNC 在免费 quick tunnel 上不可靠，改用 VNC 原生协议 + tcp tunnel。**

### 4.5 暴露 VNC（tcp tunnel）

VNC 只监听 `127.0.0.1:5901`，外部设备需经 tcp 隧道接入：

```bash
cloudflared tunnel --url tcp://localhost:5901
# 得到 hostname 如 https://xxxx.trycloudflare.com (域名约1h回收, 失效重跑)
```

---

## 5. 从你的设备连上 VNC（★ wb-keepalive 需要你在 VNC 桌面里操作）

### 5.1 安卓（Termux + RVNC）

```bash
# Termux 里装 cloudflared
pkg update -y && pkg install -y curl wget
wget -O cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64
chmod +x cloudflared

# 建立映射 (窗口保持开着)
./cloudflared access tcp --hostname <你的VNC隧道域名> --url localhost:5901
# RVNC Viewer 连 localhost:5901, 密码=你设的 VNC 密码
```

### 5.2 Windows / macOS / Linux 桌面

```bash
# 本机装 cloudflared 后:
cloudflared access tcp --hostname <你的VNC隧道域名> --url localhost:5901
# VNC 客户端(TigerVNC/RealVNC/Remmina) 连 localhost:5901
```

---

## 6. 坑汇总（避坑清单）

| # | 坑 | 现象 | 解决 |
|---|---|---|---|
| 1 | quick tunnel 1h 回收 | 之前能连突然连不上 | 重跑 tunnel 命令拿新域名 |
| 2 | noVNC WebSocket 404 | 界面能开、点 Connect 失败 | quick tunnel 与 websockify 路径冲突；放弃 noVNC，改 VNC 原生 |
| 3 | VNC 重启后只绑 127.0.0.1 | `ss` 显示 `127.0.0.1:5901` | 不影响（tunnel 在容器内转发 localhost） |
| 4 | VNC 密码弱 + 公网无认证 | 谁拿域名谁进 | 改强密码；不用时关隧道 |

---

## 7. 最短复现路径（懒人版）

```bash
# 容器内执行:
apt-get install -y xfce4 xfce4-goodies tigervnc-standalone-server dbus-x11
mkdir -p /root/.vnc && echo "你的强密码" | vncpasswd -f > /root/.vnc/passwd && chmod 600 /root/.vnc/passwd
printf '#!/bin/sh\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\nexec startxfce4\n' > /root/.vnc/xstartup && chmod +x /root/.vnc/xstartup
vncserver :1 -geometry 1280x720 -depth 24
cloudflared tunnel --url tcp://localhost:5901    # 拿到 VNC hostname 给你的设备连
```

---

## 8. 安全提醒

1. VNC 密码改强密码；隧道不用就关。
2. 所有 quick tunnel 临时有效，不当生产环境。
3. 容器会被回收，重要数据放外部存储。

---

*原实录生成于 2026-08-24 · 所有命令实测可复现 · 分享版整理时标注了与本 skill 的相关性*
