---
title: TOOLS管理
source:
author: shenwei
published:
created:
description:
tags: []
---
```table-of-contents
```
# TOOLS管理

## 1.统一SSH管理

- **所有服务器**: 包括macmini、ubuntu1、ubuntu2、NAS

- **管理方式**: 通过SSH统一管理，不存储sudo密码

- **权限原则**: 遵循最小权限原则

## 2.管理流程

1. 所有服务器操作都通过SSH进行

2. 不存储任何服务器的sudo密码

3. 需要sudo权限的操作通过SSH执行

4. 保持所有服务器的管理方式一致

## 3.文件编辑注意事项

- **所有重要文件**: 使用 `exec + echo` 追加内容，避免 edit 工具在文件末尾无换行时失败

- **edit工具使用准则**: edit依赖精确文本匹配，任何空白字符差异都会导致失败。建议：先 read 文件确认内容，用 write 重写整个文件更可靠（特别是 memory、SOUL、IDENTITY 等重要文件）

## 4.FRP (frpc 客户端) 管理

### 安装目录

| 服务器     | FRP目录                             |
| ------- | --------------------------------- |
| macmini | /opt/frp/frp_0.65.0_darwin_arm64  |
| ubuntu1 | /opt/frp/frp_0.65.0_linux_amd64   |
| ubuntu2 | /opt/frp/frp_0.65.0_linux_amd64   |

### 配置文件

- **文件名**: `frpc.toml`（在FRP目录下）

- **作用**: 定义所有通过frp反向代理的应用及端口映射 (localPort ↔ remotePort)

### Mac Mini 管理方式（launchd）

**启动方式**: launchd plist（`KeepAlive: true`，崩溃自动重启）

**plist 位置**: `~/Library/LaunchAgents/com.homebrew.frpc.plist`

**管理命令**:

```bash

# 重启

launchctl unload ~/Library/LaunchAgents/com.homebrew.frpc.plist && launchctl load ~/Library/LaunchAgents/com.homebrew.frpc.plist

# 停止（KeepAlive 会自动重启，需先 unload）

launchctl unload ~/Library/LaunchAgents/com.homebrew.frpc.plist

# 查看状态

launchctl list | grep frpc

# 查看日志

tail -f /opt/frp/frp_0.65.0_darwin_arm64/frpc.log

```

**正常状态标志**: 日志中显示 `[name] start proxy success`

### Ubuntu1/2 管理方式（systemd --user）

```bash

ssh ubuntu1 'systemctl --user restart frpc'

ssh ubuntu2 'systemctl --user restart frpc'

ssh ubuntu1 'systemctl --user status frpc'

ssh ubuntu2 'systemctl --user status frpc'

```

不需要密码，开机自启（linger 已启用）

### 查看配置

```bash

# 读取frpc.toml了解端口映射

cat /opt/frp/frp_0.65.0_xxx/frpc.toml

```

## 5.FRP端口映射查询格式 (2026-03-14)

用户会这样提问:

- "ubuntu1上frp的列表"

- "macmini的frp配置"

- "查看ubuntu2的frpc.toml"

格式: 扫描frpc.toml文件，列出proxies相关配置

输出格式: 表格 (名称 | 类型 | localPort | remotePort)

查询示例: ssh到对应服务器 -> cat /opt/frp/frp_0.65.0_xxx/frpc.toml

## 6.FRP状态检查 (2026-04-04)

用户可能说: "检查frp状态"

**检查方法**:

1. 如果是macmini服务器：

   - `launchctl list | grep frpc` 查看进程状态

   - `tail /opt/frp/frp_0.65.0_darwin_arm64/frpc.log` 查看代理启动情况

2. 如果是ubuntu服务器：

   - `systemctl --user status frpc`

**正常状态标志**:

- 所有 proxy 启动成功时会显示: `[xxx] [name] start proxy success`

- 例如: `2026-04-04 16:43:01.276 [I] [client/control.go:172] [1a254958e6553119] [macmini-ssh] start proxy success`

**重启命令** (如果需要):

1. 如果是macmini服务器：

```bash

launchctl unload ~/Library/LaunchAgents/com.homebrew.frpc.plist && launchctl load ~/Library/LaunchAgents/com.homebrew.frpc.plist

```

2. 如果是ubuntu服务器：

```bash

systemctl --user restart frpc

```

## 7.VPS2 (x-UI 科学上网)

- **IP**: 104.194.92.188

- **SSH**: `ssh vps2`

- **管理命令**: `x-ui`

- **用途**: x-UI 面板管理，用于科学上网

- 结果展示用列表方式，方便阅读

## 8.网络测试策略 (2026-03-15)

用户可能说: "网络测试"、"检查服务器科学上网"

**测试项目**:

1. 国内直连baidu (https://www.baidu.com)

2. 国外直连 Google (https://www.google.com)

3. 国外通过代理访问 Google (socks5://127.0.0.1:10808)

**测试命令模板**:

**国内访问直连**

```

curl -v https://www.baidu.com

```

**国外访问直连**

```

curl -v https://www.google.com

```

**国外访问通过代理连**

这是最快、最直接的方法。我们可以强制 `curl` 使用 SOCKS5 代理去访问 Google 的状态页。

**执行命令：**

```

curl -x socks5h://127.0.0.1:10808 -v https://www.google.com

```

- **参数解释：**

    - `-x socks5h://`：指定使用 SOCKS5 代理。注意加个 `h`，这表示让代理服务器去解析域名（防止本地 DNS 污染导致测试失败）。

    - `-v`：(Verbose) 显示详细连接过程。

- **判断标准：**    

    - 如果看到 `HTTP/2 200` 或者大量的 HTML 文本，说明**代理成功**。

    - 如果显示 `Connection refused` 或 `Timeout`，说明**端口未开放或 V2Ray 未运行**。

**服务器列表与代理端口**:

| 服务器     | IP              | 代理端口  | 备注           |
| ------- | --------------- | ----- | ------------ |
| MacMini | 192.168.3.189   | 10808 | V2RayN       |
| Ubuntu1 | 192.168.3.47    | 10808 | 需SSH后测试      |
| Ubuntu2 | 192.168.3.45    | 10808 | 需SSH后测试      |
| NAS     | 192.168.3.17    | 20170 | 仅监听127.0.0.1 |
| VPS1    | 192.227.222.142 | -     | 直连正常         |
| VPS2    | 104.194.92.188  | -     | 直连正常         |

**输出格式**: 列表方式，方便阅读

**网络测试输出格式**

用户要求格式示例:

• 服务器名

  • 国内访问直连: ✅/❌

  • 国外访问直连: ✅/❌

  • 国外访问通过代理XXX连: ✅/❌

## 9.OpenClaw 命令路径 (2026-03-27)

| 服务器      | OpenClaw 路径                              |

| -------- | ---------------------------------------- |

| Mac mini | `/opt/homebrew/bin/openclaw`             |

| Ubuntu1  | `/home/shenwei/.npm-global/bin/openclaw` |

| Ubuntu2  | `/home/shenwei/.npm-global/bin/openclaw` |

## 10.NAS Docker 代理配置 (2026-03-27)

- **配置文件**: `/etc/systemd/system/pkg-ContainerManager-dockerd.service.d/http-proxy.conf`

- **用途**: Synology NAS 上 Docker 守护进程的代理设置

- **修改后需执行**: `sudo systemctl daemon-reload && sudo systemctl restart docker`

## 11.sag (TTS 语音生成) (2026-03-27)

### 安装

```bash

brew install steipete/tap/sag

```

### API Key 配置

- 位置: `~/.openclaw/.env`

- 环境变量: `ELEVENLABS_API_KEY`

### 生成语音并发送到 Telegram

```bash

# 1. 生成 MP3 文件

source ~/.openclaw/.env

sag --api-key "$ELEVENLABS_API_KEY" -o /tmp/voice.mp3 "要转换的文字"

# 2. 发送到 Telegram (voice note)

message --account <telegram bot> --chatId <user_id> --filePath /tmp/voice.mp3 --message "文字" --buttons []

```

### 使用规则

- 所有用 sag 生成的语音都必须通过 Telegram voice note 发送给我

- 使用 当前agent对应的telegram bot 账号发送

- 文件临时保存在 /tmp/ 目录

### OpenCode

- **路径**: `/Users/weishen/.opencode/bin/opencode`

- **版本**: 1.2.27

- **用法**: 开发任务必须通过它执行

## 12.OpenClaw Gateway 重启步骤

### Mac Mini (2026-03-30 新方法)

使用 `launchctl` 管理 OpenClaw Gateway 服务：

`launchctl unload ~/Library/LaunchAgents/ai.openclaw.gateway.plist && launchctl load ~/Library/LaunchAgents/ai.openclaw.gateway.plist`

### Ubuntu1/2 服务器 (2026-03-28)

#### 完整操作流程

**1. SSH 登录并重启**

```bash

ssh ubuntu1 'systemctl --user restart openclaw-gateway'

ssh ubuntu2 'systemctl --user restart openclaw-gateway'

```

**2. 查看启动状态**

```bash

ssh ubuntu1 'systemctl --user status openclaw-gateway'

ssh ubuntu2 'systemctl --user status openclaw-gateway'

```

**3. 检查 OpenClaw 健康状态**

```bash

ssh ubuntu1 '/home/shenwei/.npm-global/bin/openclaw status'

ssh ubuntu2 '/home/shenwei/.npm-global/bin/openclaw status'

```

### 快捷命令组合 (单行执行)

```bash

# Ubuntu1

ssh ubuntu1 'systemctl --user restart openclaw-gateway && systemctl --user status openclaw-gateway && /home/shenwei/.npm-global/bin/openclaw status'

# Ubuntu2

ssh ubuntu2 'systemctl --user restart openclaw-gateway && systemctl --user status openclaw-gateway && /home/shenwei/.npm-global/bin/openclaw status'

```

## 13.AgentMail (邮件收发与自动化) (2026-04-04 更新)

### 📂 技能目录

```

~/.openclaw/skills/agentmail/

├── scripts/           # 可直接使用的 Python 脚本

│   ├── check_inbox.py   # 查看收件箱

│   ├── send_email.py    # 发送邮件

│   └── setup_webhook.py # 配置 Webhook

└── references/       # 参考文档

    ├── API.md         # API 完整文档

    ├── EXAMPLES.md    # 使用示例

    └── WEBHOOKS.md   # Webhook 配置指南

```

### 快速使用

#### 查看收件箱

```bash

unset HTTP_PROXY && unset HTTPS_PROXY && unset http_proxy && unset https_proxy

python3 ~/.openclaw/skills/agentmail/scripts/check_inbox.py --inbox star-agent@agentmail.to --limit 10

```

#### 发送邮件

```bash

python3 ~/.openclaw/skills/agentmail/scripts/send_email.py \

  --inbox star-agent@agentmail.to \

  --to "recipient@example.com" \

  --subject "主题" \

  --text "正文内容"

```

### API Key 配置

- 位置: `~/.openclaw/.env`

- 环境变量: `AGENTMAIL_API_KEY=your_key_here`

### 附件处理

附件需要用 Python 代码下载，参考：

```bash

cat ~/.openclaw/skills/agentmail/references/API.md

cat ~/.openclaw/skills/agentmail/references/EXAMPLES.md

```

### ⚠️ 注意事项

- **代理问题**：遇到 SOCKS 代理错误时，先 `unset HTTP_PROXY && unset HTTPS_PROXY`

- **临时文件存放**：下载的附件和临时脚本请放在 `~/.openclaw/temp/<agentId>/` 目录，不要放在 workspace 下

- **参考文档**：详细用法见 `references/API.md` 和 `references/EXAMPLES.md`

## 14.Docker命令路径 (2026-04-04)

| 服务器           | 命令                                                       | 说明            |
| ------------- | -------------------------------------------------------- | ------------- |
| macmini       | `docker`                                                 | 直接可用（已在 PATH） |
| macmini (SSH) | `/Applications/Docker.app/Contents/Resources/bin/docker` | SSH 时用完整路径    |
| ubuntu1/2     | `docker`                                                 | 直接可用          |

**使用方式**:

```bash

# macmini 本地

docker ps

# macmini SSH

ssh macmini '/Applications/Docker.app/Contents/Resources/bin/docker ps'

# ubuntu1/2 SSH

ssh ubuntu1 'docker ps'

ssh ubuntu2 'docker ps'

```

## 15.定时任务创建注意事项 (2026-03-29)
 
### 预防措施

1. 在远程服务器(Ubuntu1/Ubuntu2)创建定时任务后，**手动运行一次**确认能正常发送 Telegram 通知

2. 如果遇到 "Outbound not configured for channel: telegram" 错误，重启 Gateway：

   ```bash
   # Ubuntu1/Ubuntu2 重启 Gateway
   systemctl --user restart openclaw-gateway
   systemctl --user status openclaw-gateway

   ```


### 常见错误处理

| 错误信息                                            | 原因                    | 解决方案       |
| ----------------------------------------------- | --------------------- | ---------- |
| "Outbound not configured for channel: telegram" | Gateway Telegram 连接异常 | 重启 Gateway |
| "Message failed"                                | Telegram API 限流或连接问题  | 分散任务执行时间   |
 
## 16. Last30Days 技能 (2026-03-29)

  

### 功能概述

搜索过去 30 天内 Reddit、X、YouTube、TikTok、Instagram、Hacker News、Polymarket 和网页上的热门内容，生成研究报告。

  

### 调用方式

```bash

python3 ~/.openclaw/skills/last30days-official/scripts/last30days.py "<话题>" --emit=compact --no-native-web --save-dir=~/Documents/Last30Days

```

  

### 常用参数

  

| 参数 | 说明 | 示例 |

|------|------|------|

| `--days=N` | 回溯 N 天（默认30天） | `--days=7` |

| `--quick` | 快速模式（8-12条/来源） | |

| `--deep` | 深度模式（50-70条Reddit） | |

| `--x-handle=HANDLE` | 指定 X 账号搜索 | `--x-handle=elonmusk` |

  

### 对比模式

```bash

# 比较两个话题

python3 ~/.openclaw/skills/last30days-official/scripts/last30days.py "cursor vs windsurf" --emit=compact --no-native-web --save-dir=~/Documents/Last30Days

```

  

### 输出说明

- **What I Learned** — 研究发现摘要

- **Key Patterns** — 关键模式（3-5条）

- **Stats** — 统计数据（各平台帖子数、点赞数等）

- **Invitation** — 根据类型推荐下一步

  

### 数据来源权重

| 来源 | 权重 | 说明 |

|------|------|------|

| Reddit/X | 高 | 有互动数据（点赞、评论） |

| YouTube | 高 | 有观看数和字幕 |

| TikTok/Instagram | 中 | 有观看数和标题 |

| Polymarket | 高 | 真实钱币投注，数据真实 |

| Web | 低 | 无互动数据 |

  

### API Keys 配置

在 `~/.openclaw/.env` 中配置：

```bash

SCRAPECREATORS_API_KEY=...   # Reddit + TikTok + Instagram（必填）

AUTH_TOKEN=...                 # X 搜索（推荐）

CT0=...                        # X 搜索（推荐）

XAI_API_KEY=xai-...           # X 搜索备选

```

  

### 保存位置

- 研究数据自动保存到：`~/Documents/Last30Days/`

- 文件名格式：`{话题}-YYYY-MM-DD.md`

  

### 使用场景

1. **热点追踪** — 搜索"AI一人公司"了解最新趋势

2. **工具对比** — "cursor vs windsurf" 对比两个工具

3. **人物研究** — 搜索某人的 X 账号帖子

4. **竞品分析** — 搜索竞品最新动态

5. **话题深挖** — 发现新工具、新技术

  

### 注意事项

- 深度研究需要 2-8 分钟

- TikTok/Instagram 需要 ScrapeCreators API key（前 100 次免费）

- 建议先用 `--quick` 测试话题

  
  

## 17. gog (Google Workspace CLI) 代理配置 (2026-03-30)

  

### 必须走代理

gog CLI 在 Mac Mini 上直连 Google API 会超时，**必须设置代理**：

  

```bash

HTTPS_PROXY=socks5h://127.0.0.1:10808 HTTP_PROXY=socks5h://127.0.0.1:10808 gog <command>

```

  

### 常用命令示例

```bash

# 日历列表（带代理）

HTTPS_PROXY=socks5h://127.0.0.1:10808 HTTP_PROXY=socks5h://127.0.0.1:10808 gog calendar list --account ishenwei@gmail.com

  

# 查看日历事件（带代理）

HTTPS_PROXY=socks5h://127.0.0.1:10808 HTTP_PROXY=socks5h://127.0.0.1:10808 gog calendar events --account ishenwei@gmail.com "OpenClaw" --from 2026-03-30T00:00:00+08:00 --to 2026-04-05T23:59:59+08:00 --max 50

  

# 删除日历事件（带代理）

HTTPS_PROXY=socks5h://127.0.0.1:10808 HTTP_PROXY=socks5h://127.0.0.1:10808 gog calendar delete --account ishenwei@gmail.com "OpenClaw" <eventId> -y

```

  

### 认证状态

- 已完成 OAuth 授权（ishenwei@gmail.com）

- Google Calendar: OpenClaw 日历（cfd0ba26...@group.calendar.google.com）

  
  

## 18.n8n工作流标准执行步骤
> ⚠️ n8n 已迁移到 Ubuntu2 服务器（2026-03-30 更新）
> 用户可能说："请用n8n内容转换工作流帮我转化这篇文章<文件名>"
### N8N 配置信息
- **N8N_BASE_URL**: `https://n8n.ishenwei.online`（从 Ubuntu2 `~/.openclaw/.env` 读取）
- **Webhook URL**: `https://n8n.ishenwei.online/webhook/<Webhook Path>`
### ⚠️ 执行时间与等待规范
- **执行时间**: 每次触发 webhook 后，需要等待 **4-5 分钟** 才能得到结果
- **禁止频繁请求**: 触发 webhook 后，**不要**连续发送多个请求或频繁轮询
- **正确做法**: 触发一次 → 等待 4-5 分钟 → 再检查 content-out 目录结果
- **失败标志**: 如果等了 5+ 分钟还没结果，再检查是否有问题
### 目录结构

| 用途       | MacMini 路径                                               | Ubuntu2 路径                                 |
| -------- | -------------------------------------------------------- | ------------------------------------------ |
| 源文件目录    | `/Users/weishen/Workspace/nexus/openclaw/content-queue/` | —                                          |
| n8n 文件目录 | —                                                        | `/home/shenwei/docker/n8n/n8n_data/files/` |
| 输出目录     | `/Users/weishen/Workspace/nexus/openclaw/content-out/`   | —                                          |
 
### 执行步骤
 
#### 步骤 1：复制源文件到 Ubuntu2

```bash
scp /Users/weishen/Workspace/nexus/openclaw/content-queue/<文件名> ubuntu2:/home/shenwei/docker/n8n/n8n_data/files/<文件名>
```

  
#### 步骤 2：触发 Webhook
```bash
curl -X POST "<N8N_BASE_URL>/webhook/content-translation-v6" \
  -H "Content-Type: application/json" \
  -d '{
    "note_name": "<文件名>",
    "source_path": "/Users/weishen/Workspace/nexus/openclaw/content-queue/<文件名>",
    "output_name": "<文件名去掉后缀>"
  }'
```

  
#### 步骤 3：等待执行完成

- 成功标志：返回 `{"ok":true}` 且 HTTP 200
- N8N 会通过 Telegram bot 发送完成通知

#### 步骤 4：复制输出文件到 MacMini

```bash
scp ubuntu2:/home/shenwei/docker/n8n/n8n_data/files/<输出文件名> /Users/weishen/Workspace/nexus/openclaw/content-out/<输出文件名>
```

  
#### 步骤 5：清理 Ubuntu2 临时文件

```bash
ssh ubuntu2 "rm /home/shenwei/docker/n8n/n8n_data/files/<输入文件名>"
ssh ubuntu2 "rm /home/shenwei/docker/n8n/n8n_data/files/<输出文件名>"
```

  
### n8n 工作流速查表

| 工作流  | Webhook Path             | 输入文件规则               | 输出文件规则                    | 通知方式     |
| ---- | ------------------------ | -------------------- | ------------------------- | -------- |
| 内容转化 | `content-translation-v6` | `content-queue/*.md` | `content-out/*_output.md` | Telegram |

## 19.Ubuntu Docker 通过 proxychains4 走代理拉取镜像 (2026-04-05)

### 问题背景

Ubuntu1/2 服务器直连 Docker Hub 的 443 端口被封，导致 `docker pull/build` 超时。Ubuntu1/2 上已安装 `proxychains4`，可用于将 Docker 的 TCP 连接通过 SOCKS5 代理转发。

### 验证 proxychains4 是否可用

```bash
ssh ubuntu1 'proxychains4 curl -s -o /dev/null -w "HTTP %{http_code}" --max-time 8 https://registry-1.docker.io/v2/'
ssh ubuntu2 'proxychains4 curl -s -o /dev/null -w "HTTP %{http_code}" --max-time 8 https://registry-1.docker.io/v2/'
# 预期输出: HTTP 401 (TCP 接通，认证失败表示通道打通)
```

### Docker pull 走代理

```bash
ssh ubuntu1 'proxychains4 docker pull <image>:<tag>'
ssh ubuntu2 'proxychains4 docker pull <image>:<tag>'
```

### Docker build 走代理

```bash
ssh ubuntu1 'proxychains4 docker build --pull=false -t <image>:<tag> <dockerfile-path>'
ssh ubuntu2 'proxychains4 docker build --pull=false -t <image>:<tag> <dockerfile-path>'
```

### 注意事项

- **SOCKS5 vs HTTP**: Xray/V2Ray 通常提供 SOCKS5 代理，proxychains4 在 TCP 层转发流量，不依赖 HTTP 代理设置
- **--pull=false**: 在已有本地镜像时使用，避免 build 过程中再次拉取基础镜像（耗时且仍可能失败）
- **apt-get 不走代理**: Docker build 过程中 apt-get install 走的是直连 Debian 源，不受影响
- **Docker daemon vs client**: proxychains4 包裹的是 docker 命令，而非 dockerd 守护进程

## 20. memory-lancedb-pro 场景指令手册

### 概述

基于 LanceDB 的长期记忆系统，支持向量+BM25 混合检索、LLM 智能分类、Weibull 衰减。六种分类：`fact` `entity` `preference` `decision` `reflection` `other`。

| 分类 | 适用场景 |
|------|---------|
| `fact` | 客观事实、知识 |
| `entity` | 实体、人物、项目 |
| `preference` | 用户偏好、设置 |
| `decision` | 决策记录、结论 |
| `reflection` | 反思、复盘 |
| `other` | 其他 |

### 场景一：列出记忆
**你说：** "列出 memory-lancedb-pro 记忆"
**Agent 调用：** `memory_list(limit=20)`
**返回：**
```
• [fact] 用户偏好 MacBook Pro 作为开发机 (0.9)
• [entity] NAS 照片项目共 283,801 文件 (0.8)
• [decision] Memory-Pro 选用 nomic-embed-text (0.7)
...
```

---

### 场景二：搜索记忆
**你说：** "搜索 memory-lancedb-pro 里有没有关于 xxx 的记忆"
**Agent 调用：** `memory_recall(query="xxx", limit=5)`
**返回：**
```
[2 条相关]
1. [entity|0.8] NAS照片整理项目（2026-03-31启动）...
2. [other|0.6] ...
```

---

### 场景三：存储记忆
**你说：** "帮我记住 xxx"
**Agent 调用：** `memory_store(text="xxx", category="fact", importance=0.8)`
**返回：** `✅ 已存储 [fact] "xxx" (0.8)`

---

### 场景四：更新记忆
**你说：** "帮我更新记忆，改为 xxx"
**Agent 调用：** `memory_update(memoryId="<ID>", text="新内容")`
**返回：** `✅ 已更新 ID: a2d1fb54`

---

### 场景五：删除记忆
**你说：** "帮我删除 xxx 这条记忆"
**Agent 调用：**
```
memory_recall(query="xxx")           # 先确认
memory_forget(memoryId="<找到的ID>") # 再删除
```
**返回：** `✅ 已删除 ID: a2d1fb54`

---

### 场景六：查询统计
**你说：** "memory-lancedb-pro 有多少条记忆"
**Agent 调用：** `memory_stats()`
**返回：** `总计：146 条 / other:69 / fact:25 / entity:19 / ...`

---

### 快速对照表

| 你的需求 | Agent 调用 | 关键参数 |
|---------|-----------|---------|
| 列出记忆 | `memory_list` | `limit`, `scope`, `category` |
| 搜索记忆 | `memory_recall` | `query`, `limit` |
| 记住新内容 | `memory_store` | `text`, `category`, `importance` |
| 更新已有记忆 | `memory_update` | `memoryId`, `text` |
| 删除记忆 | `memory_forget` | `memoryId` 或 `query` |
| 看有多少条 | `memory_stats` | `scope` |
