# 云端 mihomo 代理部署教程 > 本文档教你在一台 Linux 云服务器上部署 mihomo(Clash 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) ``` **方法 C:curl 命令行** ```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-为什么需要代理)。 ### 坑 3:mihomo 重启后节点回到 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` 的程序才走代理。 ### 坑 5:config.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 时用双引号包裹。本文的脚本已处理此问题。 ### 坑 7:mihomo 首次启动慢 **症状**:启动 mihomo 后 `curl` 连不上 7890 端口。 **原因**:首次启动会下载 GeoSite/MMDB 数据库(几 MB),需要几秒钟。 **解法**:等 5-10 秒再测试。看日志确认 `Mixed(http+socks) proxy listening at: 127.0.0.1:7890` 出现后再操作。 ### 坑 8:live 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 分钟健康检查 ```