vnpy-01 服务器图形化环境与 AI Agent 部署文档

服务器: <公网IP> (vnpy-01) | 用户: ubuntu | 日期: 2026-06-16


一、服务器基础信息

项目 详情
操作系统 Ubuntu 24.04.4 LTS (Noble Numbat)
内核 6.8.0-101-generic
CPU Intel Xeon Platinum 8255C @ 2.50GHz × 2
内存 1.9 GiB(可用 1.3 GiB)
磁盘 50 GB(已用 20 GB,可用 28 GB)
内网 IP 10.0.0.12
公网 IP <公网IP>
SSH 端口 22
防火墙 UFW inactive(依赖腾讯云安全组)

二、部署架构总览

┌─────────────────────────────────────────────────────┐
│                 vnpy-01 (<公网IP>)                 │
│                   Ubuntu 24.04 LTS                  │
├─────────────────────────────────────────────────────┤
│                                                     │
│  ┌──────────────┐   ┌──────────────┐                │
│  │  TigerVNC    │   │  XFCE4       │                │
│  │  :1 / 5901   │──▶│  Desktop     │                │
│  │  systemd     │   │  Environment │                │
│  └──────────────┘   └──────┬───────┘                │
│                            │                         │
│              ┌─────────────┼─────────────┐          │
│              ▼             ▼             ▼          │
│     ┌────────────┐ ┌────────────┐ ┌──────────┐     │
│     │Chrome 149  │ │ fcitx 拼音  │ │ XFCE终端 │     │
│     │(浏览器)    │ │ (中文输入)  │ │          │     │
│     └────────────┘ └────────────┘ └──────────┘     │
│                                                     │
│  ┌──────────────┐   ┌──────────────────┐           │
│  │ Hermes Agent │   │ OpenClaw (龙虾)   │           │
│  │ v0.16.0      │   │ 2026.2.23-cn     │           │
│  │ ~/.hermes/   │   │ ~/openclaw-cn/   │           │
│  └──────────────┘   └──────────────────┘           │
└─────────────────────────────────────────────────────┘

三、XFCE4 桌面环境

3.1 安装

sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y xfce4 xfce4-goodies dbus-x11

3.2 版本信息

组件 版本
xfce4-session 4.18.3-1build2

3.3 验证

dpkg -l | grep xfce4-session
# xfce4-session  4.18.3-1build2

四、Google Chrome 浏览器

4.1 安装

cd /tmp
wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -O chrome.deb
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y ./chrome.deb

4.2 版本信息

组件 版本
Google Chrome 149.0.7827.114
安装路径 /usr/bin/google-chrome

4.3 验证

google-chrome --version
# Google Chrome 149.0.7827.114

五、TigerVNC 远程桌面

5.1 安装

sudo DEBIAN_FRONTEND=noninteractive apt-get install -y tigervnc-standalone-server tigervnc-common

5.2 版本信息

组件 版本
tigervnc-standalone-server 1.13.1+dfsg-2build2

5.3 VNC 密码

printf '<VNC密码>\n<VNC密码>\nn\n' | vncpasswd
项目
VNC 密码 <VNC密码>
Display :1
端口 5901 (RFB)
分辨率 1920×1080
色深 24-bit

5.4 配置文件

~/.vnc/config
## Supported server options to pass to vncserver upon invocation.
desktop=Ubuntu-XFCE
geometry=1920x1080
depth=24
localhost=no

关键: localhost=no 允许远程连接(非仅 127.0.0.1)。

~/.vnc/xstartup
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export XKL_XMODKEY_DISABLE=1
export XDG_CURRENT_DESKTOP=XFCE
export XDG_SESSION_TYPE=x11
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN:en
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
vncconfig -iconic &
fcitx -d &
exec dbus-launch --exit-with-session startxfce4

要点: exec 启动 startxfce4(非后台 &),fcitx -d & 在 exec 之前启动。

5.5 systemd 自启动服务

/etc/systemd/system/vncserver@.service
[Unit]
Description=TigerVNC server for X display %i
After=syslog.target network.target

[Service]
Type=forking
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver :%i -geometry 1920x1080 -depth 24
ExecStop=/usr/bin/vncserver -kill :%i
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
启用服务
sudo systemctl daemon-reload
sudo systemctl enable vncserver@1.service
sudo systemctl start vncserver@1.service

5.6 VNC 连接方式

方式一:VNC 客户端直连
参数
地址 <公网IP>:5901
密码 Vnc@2026

推荐客户端:RealVNC Viewer / TigerVNC Viewer / TightVNC

前提: 腾讯云安全组入站规则放行 TCP 5901。

方式二:SSH 隧道(安全,无需开 5901 端口)
# Windows PowerShell
ssh -L 5901:127.0.0.1:5901 ubuntu@<公网IP>

VNC 客户端连接 localhost:5901,流量走 SSH 加密。

方式三:XRDP(Windows 远程桌面)

需额外安装 XRDP(当前未安装):

sudo apt-get install -y xrdp
sudo systemctl enable xrdp
sudo systemctl start xrdp

然后 Win+Rmstsc → 连接 <公网IP>:3389

5.7 常用管理命令

# 查看运行中的 VNC 会话
vncserver -list

# 手动启动 VNC
vncserver :1

# 关闭 VNC
vncserver -kill :1

# systemd 管理
sudo systemctl start vncserver@1
sudo systemctl stop vncserver@1
sudo systemctl restart vncserver@1
sudo systemctl status vncserver@1

# 查看 VNC 日志
cat ~/.vnc/*.log

六、中文输入法(fcitx)

6.1 安装

sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
  fcitx fcitx-bin fcitx-table-all fcitx-config-gtk \
  fcitx-frontend-gtk2 fcitx-frontend-gtk3 fcitx-frontend-qt5 \
  fcitx-pinyin fcitx-sunpinyin fcitx-module-dbus fcitx-module-x11 \
  im-config

6.2 配置默认输入法

sudo im-config -n fcitx
sudo locale-gen zh_CN.UTF-8

6.3 环境变量

添加到 ~/.bashrc~/.vnc/xstartup

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN:en

6.4 VNC 中自启动

~/.vnc/xstartup 中在 exec startxfce4 之前添加:

fcitx -d &

6.5 使用方法

操作 快捷键
切换中/英文 Ctrl + Space
配置输入法 右键系统托盘键盘图标 → 配置

七、Hermes Agent(马)

定位: 有脑子的 AI 员工,能总结方法、记住偏好,高风险操作主动确认,适合复杂分析任务。

7.1 安装

# 使用国内镜像源一键安装
curl -fsSL https://res1.hermesagent.org.cn/install.sh | bash

7.2 版本信息

项目
版本 v0.16.0 (2026.6.5)
upstream c6b0eb4d
安装路径 ~/.hermes/hermes-agent/
CLI 路径 ~/.local/bin/hermes → symlink
Python 3.12.3 (venv)
OpenAI SDK 2.24.0

7.3 环境变量

~/.bashrc 中已添加:

export PATH="$HOME/.local/bin:$PATH"

7.4 首次配置

source ~/.bashrc
hermes setup          # 交互式配置向导
hermes model          # 选择模型(推荐 Kimi,国内免翻墙)

7.5 常用命令

hermes --version      # 查看版本
hermes                # 启动交互式聊天
hermes start          # 后台运行
hermes stop           # 停止服务
hermes doctor         # 环境诊断

八、OpenClaw(龙虾)

定位: 听话的高级工具,给什么指令干什么,特别适合重复、标准化的活儿,如自动总结公告、生成报表。

8.1 安装

# 从 Gitee 克隆中文版源码
cd ~
git clone https://gitee.com/open-claw/openclaw-cn.git
cd openclaw-cn

# 配置国内 npm 镜像
pnpm config set registry https://registry.npmmirror.com/

# 安装依赖
pnpm install

# 构建
pnpm build

8.2 版本信息

项目
版本 2026.2.23-cn
安装路径 ~/openclaw-cn/
构建产物 ~/openclaw-cn/dist/entry.js
Node.js v18.x(已预装)
pnpm 全局安装

8.3 全局命令

创建 /usr/local/bin/openclaw wrapper:

echo '#!/bin/bash
node /home/ubuntu/openclaw-cn/dist/entry.js "$@"' | sudo tee /usr/local/bin/openclaw
sudo chmod +x /usr/local/bin/openclaw

8.4 环境变量

~/.bashrc 中已添加:

export PATH=$HOME/openclaw-cn/node_modules/.bin:$PATH

8.5 首次配置

openclaw --version       # 查看版本
openclaw doctor          # 环境诊断
openclaw onboard --install-daemon  # 首次向导(选 DeepSeek 模型)

8.6 常用命令

openclaw --version      # 查看版本
openclaw gateway        # 启动网关
openclaw dashboard      # 打开管理面板
openclaw doctor         # 环境诊断

九、桌面快捷方式创建

VNC 登录 XFCE 桌面后,在桌面上创建快捷方式,方便快速启动常用工具。

9.1 Hermes Agent 桌面快捷方式

在服务器上创建 ~/Desktop/hermes.desktop

python3 -c "
import os
d = os.path.expanduser('~/Desktop')
with open(os.path.join(d, 'hermes.desktop'), 'w') as f:
    f.write('[Desktop Entry]\n')
    f.write('Version=1.0\n')
    f.write('Type=Application\n')
    f.write('Name=Hermes Agent\n')
    f.write('Comment=Hermes AI Agent (马)\n')
    f.write(\"Exec=xfce4-terminal -e \\\"bash -c 'source ~/.bashrc && hermes; exec bash'\\\"\\n\")
    f.write('Icon=utilities-terminal\n')
    f.write('Terminal=true\n')
    f.write('Categories=Development;\n')
os.chmod(os.path.join(d, 'hermes.desktop'), 0o755)
print('OK')
"

双击桌面图标即可打开终端并启动 Hermes 交互式聊天。

9.2 OpenClaw 桌面快捷方式

在服务器上创建 ~/Desktop/openclaw.desktop

python3 -c "
import os
d = os.path.expanduser('~/Desktop')
with open(os.path.join(d, 'openclaw.desktop'), 'w') as f:
    f.write('[Desktop Entry]\n')
    f.write('Version=1.0\n')
    f.write('Type=Application\n')
    f.write('Name=OpenClaw\n')
    f.write('Comment=OpenClaw AI Agent (龙虾)\n')
    f.write(\"Exec=xfce4-terminal -e \\\"bash -c 'openclaw gateway; exec bash'\\\"\n\")
    f.write('Icon=utilities-terminal\n')
    f.write('Terminal=true\n')
    f.write('Categories=Development;\n')
os.chmod(os.path.join(d, 'openclaw.desktop'), 0o755)
print('OK')
"

双击桌面图标即可打开终端并启动 OpenClaw 网关服务。

9.3 Chrome 浏览器桌面快捷方式

XFCE 菜单中已有 Chrome,也可在桌面创建快捷方式:

cp /usr/share/applications/google-chrome.desktop ~/Desktop/
chmod +x ~/Desktop/google-chrome.desktop

9.4 快捷方式不信任问题

XFCE 首次双击 .desktop 文件会提示"未信任的应用程序启动器",点击信任即可。

如仍无法启动,执行:

chmod +x ~/Desktop/*.desktop

十、腾讯云安全组配置

协议 端口 来源 用途
TCP 22 0.0.0.0/0 SSH 登录
TCP 5901 0.0.0.0/0 VNC 远程桌面(可选,用 SSH 隧道可不开放)
TCP 3389 0.0.0.0/0 XRDP 远程桌面(如安装)

安全建议: 推荐使用 SSH 隧道访问 VNC,不开放 5901 端口。


十一、端口与服务速查

端口 服务 状态 自启动
22 SSH ✅ 运行中
5901 TigerVNC (:1) ✅ 运行中 ✅ (systemd)
fcitx 输入法 ✅ VNC 内运行 ✅ (xstartup)
Hermes Agent CLI ⚙️ 按需启动 ❌ 手动
OpenClaw CLI ⚙️ 按需启动 ❌ 手动

十二、快速操作指南

12.1 首次登录图形界面

# 1. 本地 PowerShell 建立 SSH 隧道
ssh -L 5901:127.0.0.1:5901 ubuntu@<公网IP>

# 2. 打开 VNC 客户端连接 localhost:5901
# 3. 输入密码: Vnc@2026
# 4. 进入 XFCE 桌面

12.2 打开 Chrome 浏览器

VNC 桌面内:左上角 ApplicationsInternetGoogle Chrome

12.3 切换中文输入

VNC 桌面内按 Ctrl + Space 切换中/英文输入。

12.4 使用 Hermes

source ~/.bashrc    # 确保 PATH 生效
hermes              # 启动交互式聊天

12.5 使用 OpenClaw

openclaw --version  # 验证安装
openclaw gateway    # 启动网关服务

十三、故障排查

VNC 连接失败

# 检查 VNC 进程
vncserver -list
ps aux | grep Xvnc

# 重启 VNC
sudo systemctl restart vncserver@1

# 检查端口监听
ss -tlnp | grep 5901
# 应显示 0.0.0.0:5901 或 :::5901

# 查看日志
cat ~/.vnc/*.log | tail -30

黑屏/桌面不加载

# 检查 xstartup 权限
chmod +x ~/.vnc/xstartup

# 确认 startxfce4 使用 exec(非后台 &)
grep startxfce4 ~/.vnc/xstartup
# 应为: exec dbus-launch --exit-with-session startxfce4

fcitx 输入法不生效

# 检查环境变量
echo $GTK_IM_MODULE  # 应输出 fcitx
echo $XMODIFIERS     # 应输出 @im=fcitx

# 手动启动 fcitx
fcitx -d &

# 重启 VNC(会自动加载 fcitx)
sudo systemctl restart vncserver@1

Hermes 命令找不到

source ~/.bashrc
# 或
export PATH="$HOME/.local/bin:$PATH"
hermes --version

十四、部署命令速查(一键复制)

从零到完整部署的所有命令,按顺序执行:

# ===== 1. XFCE4 桌面 =====
sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y xfce4 xfce4-goodies dbus-x11

# ===== 2. Google Chrome =====
cd /tmp
wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -O chrome.deb
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y ./chrome.deb

# ===== 3. TigerVNC =====
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y tigervnc-standalone-server tigervnc-common
printf '<VNC密码>\n<VNC密码>\nn\n' | vncpasswd

mkdir -p ~/.vnc
cat > ~/.vnc/config << 'EOF'
desktop=Ubuntu-XFCE
geometry=1920x1080
depth=24
localhost=no
EOF

cat > ~/.vnc/xstartup << 'EOF'
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
export XKL_XMODKEY_DISABLE=1
export XDG_CURRENT_DESKTOP=XFCE
export XDG_SESSION_TYPE=x11
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN:en
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
vncconfig -iconic &
fcitx -d &
exec dbus-launch --exit-with-session startxfce4
EOF
chmod +x ~/.vnc/xstartup

# ===== 4. VNC systemd 服务 =====
sudo tee /etc/systemd/system/vncserver@.service > /dev/null << 'EOF'
[Unit]
Description=TigerVNC server for X display %i
After=syslog.target network.target

[Service]
Type=forking
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver :%i -geometry 1920x1080 -depth 24
ExecStop=/usr/bin/vncserver -kill :%i
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable vncserver@1.service
sudo systemctl start vncserver@1.service

# ===== 5. 中文输入法 =====
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
  fcitx fcitx-bin fcitx-table-all fcitx-config-gtk \
  fcitx-frontend-gtk2 fcitx-frontend-gtk3 fcitx-frontend-qt5 \
  fcitx-pinyin fcitx-sunpinyin fcitx-module-dbus fcitx-module-x11 \
  im-config
sudo im-config -n fcitx
sudo locale-gen zh_CN.UTF-8

cat >> ~/.bashrc << 'EOF'

# Fcitx Input Method
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export DefaultIMModule=fcitx
export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN:en
EOF

# ===== 6. Hermes Agent =====
curl -fsSL https://res1.hermesagent.org.cn/install.sh | bash
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc

# ===== 7. OpenClaw =====
sudo apt-get install -y nodejs npm
sudo npm install -g pnpm
cd ~
git clone https://gitee.com/open-claw/openclaw-cn.git
cd openclaw-cn
pnpm config set registry https://registry.npmmirror.com/
pnpm install
pnpm build

echo '#!/bin/bash
node /home/ubuntu/openclaw-cn/dist/entry.js "$@"' | sudo tee /usr/local/bin/openclaw
sudo chmod +x /usr/local/bin/openclaw
echo 'export PATH=$HOME/openclaw-cn/node_modules/.bin:$PATH' >> ~/.bashrc

# ===== 完成 =====
source ~/.bashrc
echo "部署完成!VNC: <公网IP>:5901  密码: <VNC密码>"

十五、钉钉机器人 + 大模型接入

将混元大模型(OpenAI 兼容接口)接入钉钉群机器人,实现 AI 问答 → 群消息推送。

15.1 钉钉机器人配置

在钉钉群中添加自定义机器人:

  1. 群设置 → 智能群助手 → 添加机器人 → 自定义
  2. 勾选「加签」,复制 WebhookSecret
  3. 消息签名算法(HMAC-SHA256 + Base64):
签名字符串 = timestamp + "\n" + secret
signature = Base64(HMAC-SHA256(signing_string, secret))
配置项 说明
Webhook https://oapi.dingtalk.com/robot/send?access_token=xxx
Secret 加签密钥(防止 webhook 被滥用)
消息类型 text / markdown(推荐 markdown)

15.2 混元大模型接入(OpenAI 兼容)

腾讯混元提供 OpenAI 兼容接口,可直接用 openai SDK 调用:

import OpenAI from 'openai';

const client = new OpenAI({
  apiKey: '<API_KEY>',                           // 腾讯云 API Key
  baseURL: 'https://tokenhub.tencentmaas.com/v1', // OpenAI 兼容端点
});

const response = await client.chat.completions.create({
  model: 'hy3-preview',                          // 混元模型
  messages: [
    { role: 'user', content: '你好,请介绍一下你自己' },
  ],
});
console.log(response.choices[0].message.content);
配置项
baseURL https://tokenhub.tencentmaas.com/v1
model hy3-preview(混元)
SDK openai v4.x(Node.js)

15.3 完整示例(服务器部署)

在服务器 ~/dingtalk-ai/ 目录下部署:

# 安装依赖
mkdir -p ~/dingtalk-ai && cd ~/dingtalk-ai
npm init -y
npm install openai axios crypto js-base64

# 写入配置(脱敏版,实际使用时替换占位符)
cat > ~/dingtalk-ai/config.json << 'EOF'
{
  "dingtalk": {
    "webhook": "https://oapi.dingtalk.com/robot/send?access_token=<ACCESS_TOKEN>",
    "secret": "<SECRET>"
  },
  "openai": {
    "apiKey": "<API_KEY>",
    "baseURL": "https://tokenhub.tencentmaas.com/v1",
    "model": "hy3-preview"
  }
}
EOF

15.4 示例代码(~/dingtalk-ai/bot.js

const crypto = require('crypto');
const axios = require('axios');
const { Base64 } = require('js-base64');
const { OpenAI } = require('openai');
const fs = require('fs');

// 加载配置(脱敏,实际填入真实值)
const CFG = JSON.parse(fs.readFileSync(`${__dirname}/config.json`, 'utf8'));

/** 计算钉钉签名 */
function dingSign() {
  const ts = Date.now().toString();
  const sig = Base64.encode(
    crypto.createHmac('sha256', CFG.dingtalk.secret)
      .update(`${ts}\n${CFG.dingtalk.secret}`).digest()
  );
  return { timestamp: ts, sign: sig };
}

/** 发送 Markdown 消息到钉钉 */
async function sendDing(mdTitle, mdText) {
  const { timestamp, sign } = dingSign();
  const url = `${CFG.dingtalk.webhook}&timestamp=${timestamp}&sign=${encodeURIComponent(sign)}`;
  const { data } = await axios.post(url, {
    msgtype: 'markdown',
    markdown: { title: mdTitle, text: mdText },
  }, { headers: { 'Content-Type': 'application/json' } });
  if (data.errcode !== 0) throw new Error(data.errmsg);
  return data;
}

/** 调用混元 */
async function aiChat(question) {
  const client = new OpenAI({ apiKey: CFG.openai.apiKey, baseURL: CFG.openai.baseURL });
  const res = await client.chat.completions.create({
    model: CFG.openai.model,
    messages: [{ role: 'user', content: question }],
  });
  return res.choices[0].message.content;
}

/** 主流程:问 AI → 发钉钉 */
async function ask(question) {
  const answer = await aiChat(question);
  await sendDing('AI 助手回复', `### 问题\n${question}\n\n---\n### 回复\n${answer}`);
  console.log('已发送到钉钉群');
}

// CLI 入口
if (require.main === module) {
  const q = process.argv.slice(2).join(' ');
  if (!q) { console.error('用法: node bot.js <问题>'); process.exit(1); }
  ask(q).catch((e) => { console.error('错误:', e.message); process.exit(1); });
}

module.exports = { ask, aiChat, sendDing };

15.5 使用方法

# 测试:提问并发送到钉钉群
cd ~/dingtalk-ai
node bot.js "今天深圳天气怎么样"

# 定时推送(每天早上 9 点)
# 在 crontab 中添加:
# 0 9 * * * cd ~/dingtalk-ai && node bot.js "今日 AI 资讯摘要"

15.6 脱敏说明

部署文档中所有敏感信息已脱敏:

原文 脱敏后
access_token=090fba1... <ACCESS_TOKEN>
secret = "SEC7acf..." <SECRET>
apiKey: 'sk-wV5...' <API_KEY>

实际部署时,将 <占位符> 替换为真实值,并不要将配置文件提交到公开仓库


更多推荐