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

27 KiB
Raw Permalink Blame History

云端 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,或在启动命令前设环境变量:

# 临时测试
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:代码里显式指定(需要改代码)

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 命令行

curl -x http://127.0.0.1:7890 https://目标网址
# 或
HTTPS_PROXY=http://127.0.0.1:7890 curl https://目标网址

验证代理在工作

# 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

错误做法:全局设(会让所有程序走代理):

# ❌ 不要这样做
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 里加依赖:

[Unit]
After=network-online.target mihomo.service
Requires=mihomo.service

这样 mihomo 挂了你的应用也会停(不会在没代理的情况下裸奔),mihomo 恢复后自动重启。

当前节点状态 + 手动切换

# 看当前用的哪个节点
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 告警
# 查看自动切换记录
journalctl -t mihomo-healthcheck

新服务器部署教程

以下是从零开始在新服务器上部署 mihomo 代理的完整步骤。如果你的服务器已经部署过,跳过这一部分,直接看上面的快速复用


目录(完整部署)

  1. 为什么需要代理
  2. 前置条件
  3. 安装 mihomo
  4. 获取代理订阅配置
  5. 启动与节点选择
  6. 做成 systemd 服务
  7. 自动健康检查 + IP 轮换
  8. 让 live bot 走代理
  9. 验证全链路
  10. 日常运维命令
  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 脚本检测服务器能否下单:

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 订阅链接(机场提供),且订阅里有非禁单地区的节点(日本/香港/新加坡/韩国等)
  • 你知道订阅里哪些节点是美国的(要避开)

确认禁单地区

python3 /opt/winning-wallet-finder/host/geocheck.py

如果输出 VERDICT: BLOCKED,说明你的服务器在禁单地区,需要配代理。


3. 安装 mihomo

mihomo(原名 Clash Meta)是 Clash 的开源内核,纯命令行,无 GUI,适合服务器。

# 下载
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-Agentwget 默认 UA 会被识别为非 Clash 客户端,返回假节点(名字是"当前Clash客户端不支持本机场协议"之类的提示,实际连接 127.0.0.1:65535)。

必须伪装 User-Agent + 指定 flag=meta

mkdir -p /etc/mihomo

wget -O /etc/mihomo/config.yaml \
  --user-agent="clash-verge/v1.7.7" \
  "你的订阅链接&flag=meta"

4.3 验证拿到的是真实节点

# 查看节点列表
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 禁单地区包括美国,必须选非美国节点。

# 列出所有节点名
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 模式(所有流量走指定节点):

sed -i 's/^mode: rule/mode: global/' /etc/mihomo/config.yaml

5. 启动与节点选择

5.1 前台启动(测试用)

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 手动选节点。

# 查看当前 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

# 测出口 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,重启后自动恢复。第一次手动选完,以后重启不用再选

验证:

# 选好节点后重启 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 杀掉前台进程

kill $(pgrep mihomo)

6.2 写 systemd unit

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 启动 + 验证

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 健康检查脚本

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 定时任务

# 每 5 分钟检查一次
(crontab -l 2>/dev/null | grep -v mihomo-healthcheck; \
  echo "*/5 * * * * /opt/mihomo-healthcheck.sh") | crontab -

# 验证
crontab -l | grep mihomo

7.4 手动测试健康检查

/opt/mihomo-healthcheck.sh && echo "代理正常 ✓" || echo "代理异常 ✗"

7.5 健康检查的工作逻辑

每 5 分钟 cron 触发
    │
    ▼
测当前节点能否连 Polymarket CLOB API
    │
    ├── 200 OK → 退出(代理正常)
    │
    └── 非 200 / 超时 → 当前节点挂了
            │
            ▼
        遍历所有非美国节点
            │
            ├── 找到一个能连的 → 切换 + 写 syslog
            │
            └── 全部失败 → 写 syslog 告警

7.6 查看健康检查日志

# 查看切换记录
journalctl -t mihomo-healthcheck

# 或
grep mihomo-healthcheck /var/log/syslog

8. 让 live bot 走代理

8.1 原理

py_clob_clientPolymarket 下单 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.serviceAfter=mihomo.service

[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 代理层

# 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 健康检查

/opt/mihomo-healthcheck.sh && echo "代理正常" || echo "代理异常"

9.3 live bot 启动验证

# 重启 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. 日常运维命令

看日志

# mihomo 日志
journalctl -u mihomo -f

# 健康检查切换记录
journalctl -t mihomo-healthcheck

# live bot 日志(确认代理在工作)
journalctl -u copybot-live -f

代理管理

# 看当前节点
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

服务管理

systemctl restart mihomo          # 重启代理
systemctl stop mihomo             # 停代理(live bot 也会停)
systemctl start mihomo            # 启代理(live bot 自动重启)
systemctl status mihomo           # 看状态

更新订阅

# 重新拉订阅(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 管理

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 参数:

wget -O /etc/mihomo/config.yaml \
  --user-agent="clash-verge/v1.7.7" \
  "订阅链接&flag=meta"

如果还是假节点,尝试不同的 UAclash.metaClashforWindows/0.20.39clash-verge/v1.7.7

坑 2:选了新加坡节点,还是 BLOCKED

症状:切到新加坡节点后 geocheck.py 还是 BLOCKED

原因:新加坡在 Polymarket 禁单列表里(很多人不知道)。

解法:换日本/香港/韩国/台湾等不在禁单列表的节点。禁单列表见 §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. 停 botsystemctl stop copybot-live
  2. 查链上实际 pUSD 余额
  3. 更新 config.live.jsonbankroll_usd 为实际余额
  4. 清 staterm -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

附录:完整部署一键脚本

⚠️ 不建议直接跑,建议按上面步骤一步步来。此脚本仅供参考。

#!/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 分钟健康检查