Files
winning-wallet-finder/mihomo代理部署教程.md
gavindiaz 125470b24a sync: upstream + our customizations (dashboard, healthcheck, docs)
Synced from github/main: aebcfa2d copybot: live paper feed [skip ci]
Our additions: serve_dashboard.py, bot_dashboard.html, mihomo-healthcheck.sh,
中文文档, 我们的钱包配置
2026-07-21 07:35:48 +08:00

920 lines
27 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 云端 mihomo 代理部署教程
> 本文档教你在一台 Linux 云服务器上部署 mihomoClash Meta 内核)代理,用于绕过 Polymarket 的 geo-block(地理封锁),让 live trading bot 能在禁单地区(美国/英国/法国等)的服务器上下单。
>
> **适用场景**paper bot 不需要代理(只读 API 全球开放),live bot 必须走代理(下单 API 有 geo-block)。
---
## 快速复用(代理已部署完成)
> 如果你所在的服务器**已经部署过 mihomo 代理**(按本文档下方教程完成),直接看这一节就能让新应用走代理。不用重新装。
### 代理位置
| 文件/服务 | 位置 | 说明 |
|-----------|------|------|
| mihomo 程序 | `/usr/local/bin/mihomo` | 二进制本体 |
| 配置文件 | `/etc/mihomo/config.yaml` | 订阅配置 |
| 节点记忆 | `/etc/mihomo/cache.db` | 重启后自动恢复上次选的节点 |
| systemd 服务 | `/etc/systemd/system/mihomo.service` | 24/7 后台运行 |
| 健康检查脚本 | `/opt/mihomo-healthcheck.sh` | 每 5 分钟自动检测 + 轮换 |
| 监听地址 | `127.0.0.1:7890` | HTTP + SOCKS5 混合代理 |
| 管理 API | `127.0.0.1:9090` | 切换节点 / 查状态 |
### 让你的应用走代理
**方法 A:环境变量(最常用)**
在应用的 systemd unit 里加 `EnvironmentFile`,或在启动命令前设环境变量:
```bash
# 临时测试
HTTPS_PROXY=http://127.0.0.1:7890 curl -s https://ipinfo.io/json
# 或写入 env 文件让 systemd 服务用
echo "HTTPS_PROXY=http://127.0.0.1:7890" >> /etc/copybot/你的应用.env
```
Python 的 `requests` / `urllib` / `httpx` 都会自动读 `HTTPS_PROXY` 环境变量,**不需要改代码**。
**方法 B:代码里显式指定(需要改代码)**
```python
import requests
proxies = {"https": "http://127.0.0.1:7890", "http": "http://127.0.0.1:7890"}
r = requests.get("https://clob.polymarket.com/order", proxies=proxies)
```
**方法 Ccurl 命令行**
```bash
curl -x http://127.0.0.1:7890 https://目标网址
# 或
HTTPS_PROXY=http://127.0.0.1:7890 curl https://目标网址
```
### 验证代理在工作
```bash
# 1. 代理服务活着?
systemctl is-active mihomo
# 预期: active
# 2. 端口在监听?
ss -tlnp | grep 7890
# 预期: LISTEN ... 127.0.0.1:7890 ...
# 3. 出口 IP 对不对?
HTTPS_PROXY=http://127.0.0.1:7890 curl -s https://ipinfo.io/json
# 预期: country 不是 US/GB/FR 等禁单地区
# 4. Polymarket 能下单?
HTTPS_PROXY=http://127.0.0.1:7890 python3 /opt/winning-wallet-finder/host/geocheck.py | tail -1
# 预期: VERDICT: TRADABLE
```
### 只让特定应用走代理(不影响其他服务)
mihomo **不是系统级透明代理**(没开 TUN 模式),只有设了 `HTTPS_PROXY` 的程序才走代理。
**正确做法**:只在需要的应用的 env 文件里设 `HTTPS_PROXY`
```
# /etc/copybot/live.env
HTTPS_PROXY=http://127.0.0.1:7890
```
**错误做法**:全局设(会让所有程序走代理):
```bash
# ❌ 不要这样做
echo "HTTPS_PROXY=http://127.0.0.1:7890" >> /etc/environment
echo "export HTTPS_PROXY=http://127.0.0.1:7890" >> ~/.bashrc
```
### 让 systemd 服务依赖代理
如果你的应用**必须**走代理才能工作(如 live bot),在 systemd unit 里加依赖:
```ini
[Unit]
After=network-online.target mihomo.service
Requires=mihomo.service
```
这样 mihomo 挂了你的应用也会停(不会在没代理的情况下裸奔),mihomo 恢复后自动重启。
### 当前节点状态 + 手动切换
```bash
# 看当前用的哪个节点
curl -s http://127.0.0.1:9090/proxies/GLOBAL | python3 -c "import sys,json; print('当前:', json.load(sys.stdin).get('now'))"
# 手动换节点(节点名从 config.yaml 里找)
curl -s -X PUT http://127.0.0.1:9090/proxies/GLOBAL \
-H "Content-Type: application/json" \
-d '{"name":"🇯🇵日本高速06|BGP|CTCU"}'
# 手动跑健康检查(测当前节点通不通,不通自动换)
/opt/mihomo-healthcheck.sh && echo "正常" || echo "异常"
```
### 健康检查自动轮换
已配置 cron 每 5 分钟自动检查:
- 当前节点通 -> 什么都不做
- 当前节点挂 -> 自动遍历所有非美国节点,找到能用的就切换
- 全部挂 -> 写 syslog 告警
```bash
# 查看自动切换记录
journalctl -t mihomo-healthcheck
```
---
## 新服务器部署教程
> 以下是从零开始在新服务器上部署 mihomo 代理的完整步骤。如果你的服务器已经部署过,跳过这一部分,直接看上面的[快速复用](#快速复用代理已部署完成)。
---
## 目录(完整部署)
1. [为什么需要代理](#1-为什么需要代理)
2. [前置条件](#2-前置条件)
3. [安装 mihomo](#3-安装-mihomo)
4. [获取代理订阅配置](#4-获取代理订阅配置)
5. [启动与节点选择](#5-启动与节点选择)
6. [做成 systemd 服务](#6-做成-systemd-服务)
7. [自动健康检查 + IP 轮换](#7-自动健康检查--ip-轮换)
8. [让 live bot 走代理](#8-让-live-bot-走代理)
9. [验证全链路](#9-验证全链路)
10. [日常运维命令](#10-日常运维命令)
11. [常见坑](#11-常见坑)
---
## 1. 为什么需要代理
### Polymarket 的 geo-block
Polymarket 禁止以下地区的 IP 下单(CLOB order API 返回 403):
```
美国 · 英国 · 法国 · 德国 · 意大利 · 荷兰 · 波兰 · 新加坡 · 澳大利亚 · 加拿大安大略 · 巴西
```
**允许的常见地区**:日本、香港、瑞典、南非、印度、韩国、台湾等。
### 两种 API 的区别
| API | 用途 | 有 geo-block | 需要代理? |
|-----|------|---------------|-----------|
| data-api / gamma-api | 读取市场/钱包数据 | ❌ 全球开放 | paper bot 不需要 |
| clob.polymarket.com/order | **下单** | ✅ 禁单地区 403 | **live bot 必须** |
### geo-gate 检测
项目自带 `host/geocheck.py` 脚本检测服务器能否下单:
```bash
cd /opt/winning-wallet-finder
python3 host/geocheck.py
```
结果判读:
- `VERDICT: TRADABLE` → 不需要代理,跳过本教程
- `VERDICT: BLOCKED` → 需要代理,继续往下看
- `VERDICT: UNKNOWN` → 网络问题,检查服务器能不能连 Polymarket
### 代理的工作原理
```
你的服务器(美国/英国等禁单地区)
│ HTTPS_PROXY=http://127.0.0.1:7890
mihomo 代理(监听 127.0.0.1:7890
│ 通过日本/香港等节点中转
Polymarket CLOB API ← 看到的是节点的 IP(日本),不是你服务器的 IP(美国)
```
**关键**:mihomo 不是系统级透明代理(不开 TUN 模式),只有**显式设置了 `HTTPS_PROXY` 环境变量的程序**才走代理。其他程序(paper bot、dashboard、Gitea、SSH 等)全部直连,不受影响。
---
## 2. 前置条件
- [ ] 一台 Linux 服务器(Ubuntu 20.04+ / Debian 11+),root 权限
- [ ] 服务器在 Polymarket 禁单地区(`geocheck.py` 返回 `BLOCKED`
- [ ] 一个 Clash 订阅链接(机场提供),且订阅里有**非禁单地区**的节点(日本/香港/新加坡/韩国等)
- [ ] 你知道订阅里哪些节点是美国的(要避开)
### 确认禁单地区
```bash
python3 /opt/winning-wallet-finder/host/geocheck.py
```
如果输出 `VERDICT: BLOCKED`,说明你的服务器在禁单地区,需要配代理。
---
## 3. 安装 mihomo
mihomo(原名 Clash Meta)是 Clash 的开源内核,纯命令行,无 GUI,适合服务器。
```bash
# 下载
cd /tmp
wget -q https://github.com/MetaCubeX/mihomo/releases/download/v1.19.0/mihomo-linux-amd64-v1.19.0.gz
gzip -d mihomo-linux-amd64-v1.19.0.gz
mv mihomo-linux-amd64-v1.19.0 /usr/local/bin/mihomo
chmod +x /usr/local/bin/mihomo
# 验证
mihomo -v
```
预期输出类似 `Mihomo Meta v1.19.0 ...`
> 如果 GitHub 下载慢,可以用代理或镜像站下载后 `scp` 到服务器。
---
## 4. 获取代理订阅配置
### 4.1 找到你的订阅链接
你的代理机场(如 Clash Verge 订阅)会提供一个订阅 URL,通常长这样:
```
https://xxx.com/api/v1/client/subscribe?token=abcdef123456...
```
**如何找到**
- Clash Verge 客户端 → 订阅页面 → 右键订阅卡片 → 复制订阅链接
- 或机场官网 → 用户中心 → 复制订阅链接
### 4.2 下载订阅配置
⚠️ **大坑**:机场会检测 User-Agent`wget` 默认 UA 会被识别为非 Clash 客户端,返回**假节点**(名字是"当前Clash客户端不支持本机场协议"之类的提示,实际连接 127.0.0.1:65535)。
**必须伪装 User-Agent + 指定 flag=meta**
```bash
mkdir -p /etc/mihomo
wget -O /etc/mihomo/config.yaml \
--user-agent="clash-verge/v1.7.7" \
"你的订阅链接&flag=meta"
```
### 4.3 验证拿到的是真实节点
```bash
# 查看节点列表
grep "name:" /etc/mihomo/config.yaml | head -30
```
**正确**:看到真实节点名,如 `🇯🇵日本高速01|BGP|CTCU``🇭🇰香港高速02|BGP|CMCU` 等。
**错误**(假节点):
```
name: 当前Clash客户端不支持本机场协议
name: 请更换以下支持协议的代理软件
```
如果拿到假节点,尝试以下方法:
1. 换 User-Agent`--user-agent="clash.meta"``--user-agent="ClashforWindows/0.20.39"`
2. 换 flag 参数:`&flag=clash``&flag=meta`
3. 直接在本地 Clash 客户端导出配置文件,`scp` 到服务器
### 4.4 筛选非美国节点
Polymarket 禁单地区包括美国,必须选**非美国**节点。
```bash
# 列出所有节点名
grep "name:" /etc/mihomo/config.yaml | grep -oP "name: [^,}]+" | sed 's/name: //'
```
**可用节点**(不在禁单列表):
- 🇯🇵 日本(JP
- 🇭🇰 香港(HK
- 🇸🇬 新加坡(SG)⚠️ 新加坡在禁单列表!不能用
- 🇰🇷 韩国(KR
- 🇨🇳 台湾(TW
- 🇸🇪 瑞典(SE
**不可用节点**(在禁单列表):
- 🇺🇸 美国(US
- 🇬🇧 英国(GB
- 🇫🇷 法国(FR
- 🇩🇪 德国(DE
- 🇮🇹 意大利(IT
- 🇳🇱 荷兰(NL
- 🇵🇱 波兰(PL
- 🇸🇬 新加坡(SG
- 🇦🇺 澳大利亚(AU
> **注意**:新加坡虽然在很多机场里速度快,但 Polymarket 禁单!必须避开。
### 4.5 改全局模式
mihomo 默认是 `rule` 模式(按规则分流),我们需要 `global` 模式(所有流量走指定节点):
```bash
sed -i 's/^mode: rule/mode: global/' /etc/mihomo/config.yaml
```
---
## 5. 启动与节点选择
### 5.1 前台启动(测试用)
```bash
mihomo -d /etc/mihomo
```
等待几秒(首次启动会下载 GeoSite 数据库),看到 `Mixed(http+socks) proxy listening at: 127.0.0.1:7890` 表示成功。
`Ctrl+C` 退出(后面会做成 systemd 服务)。
### 5.2 选择非美国节点
mihomo 启动后默认 GLOBAL 组走 DIRECT(直连),需要通过 API 手动选节点。
```bash
# 查看当前 GLOBAL 选的什么
curl -s http://127.0.0.1:9090/proxies/GLOBAL | python3 -c "import sys,json; print('当前:', json.load(sys.stdin).get('now'))"
# 切换到日本节点(替换成你订阅里的真实节点名)
curl -s -X PUT http://127.0.0.1:9090/proxies/GLOBAL \
-H "Content-Type: application/json" \
-d '{"name":"🇯🇵日本高速06|BGP|CTCU"}'
```
> **节点名必须跟 config.yaml 里的 `name:` 字段完全一致**(包括 emoji 和特殊字符)。
### 5.3 验证代理 + geo-gate
```bash
# 测出口 IP(应该不是美国)
HTTPS_PROXY=http://127.0.0.1:7890 curl -s https://ipinfo.io/json
# 测 Polymarket geo-gate(关键!)
HTTPS_PROXY=http://127.0.0.1:7890 python3 /opt/winning-wallet-finder/host/geocheck.py
```
预期最后一行:`VERDICT: TRADABLE - order endpoint reachable past the geo-gate`
如果还是 `BLOCKED`,说明选的节点也在禁单地区,换一个节点再试。
### 5.4 mihomo 自动记住节点选择
mihomo 会把节点选择保存在 `/etc/mihomo/cache.db`,重启后自动恢复。**第一次手动选完,以后重启不用再选**。
验证:
```bash
# 选好节点后重启 mihomo
systemctl restart mihomo # 或 kill 后重启
sleep 5
# 看它记不记得
curl -s http://127.0.0.1:9090/proxies/GLOBAL | python3 -c "import sys,json; print('当前:', json.load(sys.stdin).get('now'))"
```
如果输出你之前选的节点名,说明记住了。
---
## 6. 做成 systemd 服务
### 6.1 杀掉前台进程
```bash
kill $(pgrep mihomo)
```
### 6.2 写 systemd unit
```bash
cat > /etc/systemd/system/mihomo.service <<'EOF'
[Unit]
Description=Mihomo (Clash Meta) Proxy
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=mihomo
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
EOF
```
### 6.3 启动 + 验证
```bash
systemctl daemon-reload
systemctl enable --now mihomo
sleep 5
# 确认服务活着
systemctl status mihomo --no-pager | head -5
# 确认端口在监听
ss -tlnp | grep 7890
# 确认节点选择还在(mihomo 应该记住了)
curl -s http://127.0.0.1:9090/proxies/GLOBAL | python3 -c "import sys,json; print('当前节点:', json.load(sys.stdin).get('now'))"
# 确认代理 + geo-gate 通过
HTTPS_PROXY=http://127.0.0.1:7890 python3 /opt/winning-wallet-finder/host/geocheck.py | tail -1
```
预期:
- `Active: active (running)`
- `:7890` 在监听
- 当前节点是你选的非美国节点
- `VERDICT: TRADABLE`
---
## 7. 自动健康检查 + IP 轮换
### 7.1 为什么需要
代理节点可能随时挂掉(服务器维护、被封 IP、网络抖动等)。如果节点挂了:
- live bot 的所有请求超时
- bot 无法下单
- `CASH≠CHAIN` 警告可能出现
需要**自动检测 + 自动切换**到其他可用节点。
### 7.2 健康检查脚本
```bash
cat > /opt/mihomo-healthcheck.sh <<'SCRIPT'
#!/bin/bash
# 检查代理是否通,不通就自动换非美国节点
API="http://127.0.0.1:9090"
PROXY="http://127.0.0.1:7890"
# 1. 测当前节点能不能连 Polymarket CLOB API
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 -x $PROXY \
"https://clob.polymarket.com/markets?next_cursor=" 2>/dev/null)
if [ "$code" = "200" ]; then
exit 0 # 通的,不用换
fi
# 2. 不通,拉所有节点列表,挑非美国的试
nodes=$(curl -s "$API/proxies" | python3 -c "
import sys, json
d = json.load(sys.stdin)
skip = {'DIRECT','REJECT','自动选择','故障转移','良心云','GLOBAL'}
# Polymarket 禁单地区关键词(节点名里包含这些的不选)
blocked = ['美国','US','United States','英国','GB','法国','FR','德国','DE',
'意大利','IT','荷兰','NL','波兰','PL','新加坡','SG','新加坡',
'澳大利亚','AU','澳洲','巴西','BR']
for name, info in d.get('proxies', {}).items():
if name in skip:
continue
if info.get('type') in ('Selector','URLTest','Fallback','LoadBalance'):
continue
if any(k in name for k in blocked):
continue
print(name)
")
# 3. 逐个试,找到能用的就切
for node in $nodes; do
curl -s -X PUT "$API/proxies/GLOBAL" \
-H "Content-Type: application/json" \
-d "{\"name\":\"$node}" > /dev/null
sleep 2
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 -x $PROXY \
"https://clob.polymarket.com/markets?next_cursor=" 2>/dev/null)
if [ "$code" = "200" ]; then
logger "mihomo-healthcheck: switched to $node (previous was down)"
exit 0
fi
done
logger "mihomo-healthcheck: ALL nodes failed - check mihomo or subscription"
exit 1
SCRIPT
chmod +x /opt/mihomo-healthcheck.sh
```
### 7.3 加 cron 定时任务
```bash
# 每 5 分钟检查一次
(crontab -l 2>/dev/null | grep -v mihomo-healthcheck; \
echo "*/5 * * * * /opt/mihomo-healthcheck.sh") | crontab -
# 验证
crontab -l | grep mihomo
```
### 7.4 手动测试健康检查
```bash
/opt/mihomo-healthcheck.sh && echo "代理正常 ✓" || echo "代理异常 ✗"
```
### 7.5 健康检查的工作逻辑
```
每 5 分钟 cron 触发
测当前节点能否连 Polymarket CLOB API
├── 200 OK → 退出(代理正常)
└── 非 200 / 超时 → 当前节点挂了
遍历所有非美国节点
├── 找到一个能连的 → 切换 + 写 syslog
└── 全部失败 → 写 syslog 告警
```
### 7.6 查看健康检查日志
```bash
# 查看切换记录
journalctl -t mihomo-healthcheck
# 或
grep mihomo-healthcheck /var/log/syslog
```
---
## 8. 让 live bot 走代理
### 8.1 原理
`py_clob_client`Polymarket 下单 SDK)底层用 Python `requests` 库,`requests` 自动读 `HTTPS_PROXY` 环境变量。所以只要在 live bot 的环境变量里设 `HTTPS_PROXY`,所有下单请求自动走代理。
### 8.2 配置 live.env
`/etc/copybot/live.env` 里加一行:
```
HTTPS_PROXY=http://127.0.0.1:7890
```
完整 live.env 示例:
```
LIVE_PRIVATE_KEY=0x你的私钥
LIVE_FUNDER_ADDRESS=0x你的钱包地址
LIVE_SIGNATURE_TYPE=1
LIVE_CONFIRM=TRADE LIVE
HTTPS_PROXY=http://127.0.0.1:7890
```
### 8.3 live systemd unit 依赖 mihomo
确保 live bot 的 systemd unit 有 `Requires=mihomo.service``After=mihomo.service`
```ini
[Unit]
Description=Polymarket LIVE Copybot (real money)
After=network-online.target mihomo.service
Wants=network-online.target
Requires=mihomo.service
```
这样 mihomo 挂了 live bot 也会停(不会在没代理的情况下尝试下单),mihomo 恢复后 live bot 自动重启。
### 8.4 隔离原则
| 服务 | 走代理? | 为什么 |
|------|---------|--------|
| live bot | ✅ 走 | 下单需要绕 geo-block |
| paper bot | ❌ 直连 | 只读 API 不受 geo-block,直连更快 |
| dashboard | ❌ 直连 | 本地文件服务,不需要外网 |
| Gitea | ❌ 直连 | 推代码不需要代理 |
| mihomo 本身 | ❌ 直连 | 代理连节点用直连 |
> **不要**把 `HTTPS_PROXY` 写进 `/etc/environment` 或 `~/.bashrc`(全局生效),只放在 `/etc/copybot/live.env` 里,只有 live systemd service 读它。
---
## 9. 验证全链路
### 9.1 代理层
```bash
# mihomo 服务状态
systemctl status mihomo
# 端口监听
ss -tlnp | grep 7890
# 出口 IP(应该非美国)
HTTPS_PROXY=http://127.0.0.1:7890 curl -s https://ipinfo.io/json | python3 -m json.tool
# Polymarket geo-gate
HTTPS_PROXY=http://127.0.0.1:7890 python3 /opt/winning-wallet-finder/host/geocheck.py | tail -1
```
### 9.2 健康检查
```bash
/opt/mihomo-healthcheck.sh && echo "代理正常" || echo "代理异常"
```
### 9.3 live bot 启动验证
```bash
# 重启 live bot
systemctl restart copybot-live
sleep 10
# 看日志,应该有 geo-gate: TRADABLE
journalctl -u copybot-live --since "15 seconds ago" --no-pager | grep -E "geo-gate|armed|TRADABLE|BLOCKED"
```
预期看到 `geo-gate: TRADABLE - order endpoint reachable`
---
## 10. 日常运维命令
### 看日志
```bash
# mihomo 日志
journalctl -u mihomo -f
# 健康检查切换记录
journalctl -t mihomo-healthcheck
# live bot 日志(确认代理在工作)
journalctl -u copybot-live -f
```
### 代理管理
```bash
# 看当前节点
curl -s http://127.0.0.1:9090/proxies/GLOBAL | python3 -c "import sys,json; print('当前节点:', json.load(sys.stdin).get('now'))"
# 手动换节点(替换节点名)
curl -s -X PUT http://127.0.0.1:9090/proxies/GLOBAL \
-H "Content-Type: application/json" \
-d '{"name":"🇯🇵日本高速06|BGP|CTCU"}'
# 手动健康检查
/opt/mihomo-healthcheck.sh && echo "正常" || echo "异常"
# 测代理 + geo-gate
HTTPS_PROXY=http://127.0.0.1:7890 python3 /opt/winning-wallet-finder/host/geocheck.py | tail -1
```
### 服务管理
```bash
systemctl restart mihomo # 重启代理
systemctl stop mihomo # 停代理(live bot 也会停)
systemctl start mihomo # 启代理(live bot 自动重启)
systemctl status mihomo # 看状态
```
### 更新订阅
```bash
# 重新拉订阅(UA 不能忘!)
wget -O /etc/mihomo/config.yaml \
--user-agent="clash-verge/v1.7.7" \
"你的订阅链接&flag=meta"
# 重启生效
systemctl restart mihomo
sleep 5
# 重新选节点(订阅更新后节点名可能变)
curl -s http://127.0.0.1:9090/proxies/GLOBAL | python3 -c "import sys,json; print('当前:', json.load(sys.stdin).get('now'))"
```
### Cron 管理
```bash
crontab -l # 看所有定时任务
# 健康检查每 5 分钟跑一次
# 如果想改频率,编辑 crontab:
crontab -e
```
---
## 11. 常见坑
### 坑 1:机场返回假节点
**症状**`grep "name:" config.yaml` 看到的节点名是"当前Clash客户端不支持本机场协议"之类的提示,连接地址是 127.0.0.1:65535。
**原因**:机场检测到 wget 的 User-Agent 不是 Clash 客户端。
**解法**:加 `--user-agent="clash-verge/v1.7.7"` + `&flag=meta` 参数:
```bash
wget -O /etc/mihomo/config.yaml \
--user-agent="clash-verge/v1.7.7" \
"订阅链接&flag=meta"
```
如果还是假节点,尝试不同的 UA`clash.meta``ClashforWindows/0.20.39``clash-verge/v1.7.7`
### 坑 2:选了新加坡节点,还是 BLOCKED
**症状**:切到新加坡节点后 `geocheck.py` 还是 `BLOCKED`
**原因**:新加坡在 Polymarket 禁单列表里(很多人不知道)。
**解法**:换日本/香港/韩国/台湾等不在禁单列表的节点。禁单列表见 [§1](#1-为什么需要代理)。
### 坑 3mihomo 重启后节点回到 DIRECT
**症状**:重启 mihomo 后 `geocheck.py` 变成 `BLOCKED`,检查发现 GLOBAL 回到 DIRECT。
**原因**:第一次启动后没手动选过节点,cache.db 里没记录。
**解法**:启动后手动选一次节点,mihomo 会记住(保存到 cache.db),以后重启自动恢复。
### 坑 4:代理影响其他服务
**症状**paper bot / dashboard / Gitea 全部变慢或连不上。
**原因**`HTTPS_PROXY` 被设成了全局环境变量(写进了 `/etc/environment``~/.bashrc`)。
**解法**:只在 `/etc/copybot/live.env` 里设 `HTTPS_PROXY`,不要全局设。mihomo 不是透明代理,只有显式设了 `HTTPS_PROXY` 的程序才走代理。
### 坑 5config.yaml 追加 proxy-groups 导致启动失败
**症状**mihomo 重启后报 YAML 解析错误,端口不监听。
**原因**:在 config.yaml 末尾追加了重复的 `proxy-groups:` 段,YAML 不允许重复键。
**解法**:不要追加,用 API 切换节点即可。如果一定要改 proxy-groups,编辑原有段而不是追加。
### 坑 6:健康检查脚本里的节点名有特殊字符
**症状**:健康检查脚本切换节点失败,`curl -X PUT` 返回 400。
**原因**:节点名包含 emoji 或特殊字符(如 `🇯🇵日本高速06|BGP|CTCU`),JSON 转义有问题。
**解法**:脚本里用 `python3` 读取节点列表并输出,`curl``-d` 传 JSON 时用双引号包裹。本文的脚本已处理此问题。
### 坑 7mihomo 首次启动慢
**症状**:启动 mihomo 后 `curl` 连不上 7890 端口。
**原因**:首次启动会下载 GeoSite/MMDB 数据库(几 MB),需要几秒钟。
**解法**:等 5-10 秒再测试。看日志确认 `Mixed(http+socks) proxy listening at: 127.0.0.1:7890` 出现后再操作。
### 坑 8live bot 报 CASH≠CHAIN
**症状**live bot 日志出现 `⚠ CASH≠CHAIN $+X.XX`
**原因**:代理在订单提交中途断了或切换了,bot 以为订单没成交但实际成交了,账本与链上不一致。
**解法**
1. 停 bot`systemctl stop copybot-live`
2. 查链上实际 pUSD 余额
3. 更新 `config.live.json``bankroll_usd` 为实际余额
4. 清 state`rm -f /opt/winning-wallet-finder/copybot_state.live.json /opt/winning-wallet-finder/copybot_fills.live.jsonl /opt/winning-wallet-finder/live/copybot_live_real.json`
5. 重启:`systemctl start copybot-live`
---
## 附录:完整部署一键脚本
> ⚠️ 不建议直接跑,建议按上面步骤一步步来。此脚本仅供参考。
```bash
#!/bin/bash
set -e
# 1. 装 mihomo
cd /tmp
wget -q https://github.com/MetaCubeX/mihomo/releases/download/v1.19.0/mihomo-linux-amd64-v1.19.0.gz
gzip -d mihomo-linux-amd64-v1.19.0.gz
mv mihomo-linux-amd64-v1.19.0 /usr/local/bin/mihomo
chmod +x /usr/local/bin/mihomo
# 2. 拉订阅(替换 SUB_URL
SUB_URL="你的订阅链接"
mkdir -p /etc/mihomo
wget -O /etc/mihomo/config.yaml --user-agent="clash-verge/v1.7.7" "${SUB_URL}&flag=meta"
sed -i 's/^mode: rule/mode: global/' /etc/mihomo/config.yaml
# 3. systemd 服务
cat > /etc/systemd/system/mihomo.service <<'EOF'
[Unit]
Description=Mihomo (Clash Meta) Proxy
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=mihomo
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now mihomo
sleep 8
# 4. 健康检查脚本
cat > /opt/mihomo-healthcheck.sh <<'SCRIPT'
#!/bin/bash
API="http://127.0.0.1:9090"
PROXY="http://127.0.0.1:7890"
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 -x $PROXY "https://clob.polymarket.com/markets?next_cursor=" 2>/dev/null)
if [ "$code" = "200" ]; then exit 0; fi
nodes=$(curl -s "$API/proxies" | python3 -c "
import sys, json
d = json.load(sys.stdin)
skip = {'DIRECT','REJECT','自动选择','故障转移','良心云','GLOBAL'}
blocked = ['美国','US','United States','英国','GB','法国','FR','德国','DE','意大利','IT','荷兰','NL','波兰','PL','新加坡','SG','澳大利亚','AU','澳洲','巴西','BR']
for name, info in d.get('proxies', {}).items():
if name in skip: continue
if info.get('type') in ('Selector','URLTest','Fallback','LoadBalance'): continue
if any(k in name for k in blocked): continue
print(name)
")
for node in $nodes; do
curl -s -X PUT "$API/proxies/GLOBAL" -H "Content-Type: application/json" -d "{\"name\":\"$node}" > /dev/null
sleep 2
code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 -x $PROXY "https://clob.polymarket.com/markets?next_cursor=" 2>/dev/null)
if [ "$code" = "200" ]; then
logger "mihomo-healthcheck: switched to $node"
exit 0
fi
done
logger "mihomo-healthcheck: ALL nodes failed"
exit 1
SCRIPT
chmod +x /opt/mihomo-healthcheck.sh
# 5. cron
(crontab -l 2>/dev/null | grep -v mihomo-healthcheck; echo "*/5 * * * * /opt/mihomo-healthcheck.sh") | crontab -
echo "=== 部署完成 ==="
echo "下一步:手动选一个非美国节点"
echo " curl -s http://127.0.0.1:9090/proxies | python3 -m json.tool | grep name"
echo " curl -s -X PUT http://127.0.0.1:9090/proxies/GLOBAL -H 'Content-Type: application/json' -d '{\"name\":\"节点名\"}'"
echo "然后验证:"
echo " HTTPS_PROXY=http://127.0.0.1:7890 python3 /opt/winning-wallet-finder/host/geocheck.py | tail -1"
```
---
## 文件结构速查
```
服务器
├── /usr/local/bin/mihomo 代理程序本体
├── /etc/mihomo/
│ ├── config.yaml 订阅配置(机场下载)
│ └── cache.db 节点选择记忆
├── /etc/systemd/system/
│ └── mihomo.service systemd 服务定义
├── /opt/mihomo-healthcheck.sh 健康检查脚本
├── /etc/copybot/
│ └── live.env live bot 环境变量(含 HTTPS_PROXY
└── crontab
└── */5 * * * * healthcheck.sh 每 5 分钟健康检查
```