一套共享代理核心,两个明确入口:自动创建 Google Cloud 节点,或部署到任意已有 Debian/Ubuntu VPS。
One shared proxy core with two explicit deployment paths: Google Cloud or any existing Debian/Ubuntu VPS.
- Primary: VLESS + Reality
- UDP fallback: Hysteria2
- TCP fallback: AnyTLS
- One credential set and YAML per device
公共依赖:本机安装 python3、openssl 和 OpenSSH。
先安装并登录 gcloud,然后运行:
gcloud auth login
gcloud config set project <你的项目ID>
./deploy-gcp.shGCP adapter 会预留静态 IP、配置云防火墙、创建 Debian VM,并通过 IAP SSH 安装服务端。
VPS 安装 Debian/Ubuntu,并把本机公钥加入初始 root 账户,然后运行:
VPS_PROFILE=frantech \
VPS_SSH_KEY="$HOME/.ssh/frantech_ed25519" \
./deploy-vps.sh <VPS_PUBLIC_IP>VPS_PROFILE 必须为每台 VPS 使用一个唯一名称,例如 dmit、frantech、new-york-01。
不要裸跑 ./deploy-vps.sh,这样可以避免新服务器误用已有 profile。
VPS adapter 会执行以下安全步骤:
- 验证初始 root 公钥登录。
- 创建并验证独立的
mtsudo 用户。 - 配置 UFW,只开放 SSH 和三个代理端口。
- 确认
mt可以登录后才禁用 root 和密码登录。 - 安装三套协议并生成设备 YAML。
重跑时会直接复用已经创建的 mt 用户,不再依赖 root。
不要把私钥复制到服务器、Git 跟踪文件或聊天中。
首次部署后可以把主机专用私钥放在 profiles/<profile>/ssh/,也可以继续通过
VPS_SSH_KEY=/path/to/private-key 显式指定。后续重跑时使用同一个 VPS_PROFILE,脚本会复用该 profile 的 IP、端口和本地密钥。
deploy-gcp.sh / deploy-vps.sh 用户入口
deploy.sh 旧 GCP 命令的兼容入口
providers/ GCP、普通 VPS adapter
core/ 共享部署流水线、密钥、协议安装、规则与 YAML 生成
config/ 不含密钥的配置模板
docs/ 架构说明与排障文档
profiles/<profile>/ 每台服务器独立状态与 ssh/(不提交)
clash-configs/ 所有 profile 的客户端 YAML(不提交)
GCP 和 VPS 真正变化的只有服务器生命周期、连接方式与防火墙;协议和客户端规则只维护一份。详细 seam 和 provider interface 见 架构说明。
想快速理解整个仓库,先看仓库总览与维护说明;它把入口、部署链路、profile、直连/CDN 节点和日常操作放在一处。
独立的 VPS 库存监控已迁至
vps-stock-opencli,不再属于本仓库的代码或测试边界。
首次运行会从 config/deploy.conf.example 创建当前 profile 的本地状态。GCloud 固定使用
profiles/gcloud/;普通 VPS 使用 VPS_PROFILE 对应的 profiles/<profile>/。整个
profiles/ 目录都已被 Git 忽略。
| 配置 | 默认值 | 说明 |
|---|---|---|
REALITY_PORT |
443 |
Reality 监听端口 |
REALITY_TARGET / REALITY_SNI |
1.1.1.1:443 / 空 |
Reality 目标与客户端 SNI |
HY2_PORT |
随机 | Hysteria2 UDP 端口 |
HY2_PORT_RANGE |
空 | 可选端口跳跃范围,例如 30000-30010 |
HY2_OBFS_ENABLE |
false |
可选 Salamander 混淆;开启后不再表现为标准 HTTP/3 |
HY2_ACME_ENABLE |
false |
可选 Cloudflare DNS-01 真实证书 |
ANYTLS_PORT |
随机 | AnyTLS TCP 端口 |
DEVICES |
mac iphone |
每个设备生成独立凭据和 YAML |
PRIVACY_MODE |
true |
CN 流量首次默认走代理;设为 false 后首次默认直连并使用国内加密 DoH,STUN 始终走代理 |
CDN_ENABLE |
false |
可选 Cloudflare Tunnel 出口 |
CDN_ONLY |
false |
仅使用 Cloudflare WS,并关闭直连代理端口 |
WARP_ENABLE |
false |
可选 Reality-WARP 节点;仅该节点的 Xray 出站经过 WARP |
WARP_SOCKS_PORT |
40000 |
服务器本机 WARP SOCKS5 端口,不对公网开放 |
WARP_REALITY_PORT |
随机 | Reality-WARP 直连端口;开启 WARP 时自动生成 |
PROJECT_ID / REGION / ZONE |
GCP 默认值 | 只由 GCP adapter 使用 |
每个 profile 内的敏感文件均已 gitignore:
.secrets.envdeploy.confssh/
不要提交、转发或粘贴这些文件的内容。
部署成功后,每个平台默认得到两份名称明确的 YAML:
clash-configs/gcloud-mac.yamlclash-configs/gcloud-iphone.yamlclash-configs/<profile>-mac.yamlclash-configs/<profile>-iphone.yaml
生成器只替换当前 profile 前缀的文件,例如 frantech 只处理 frantech-*.yaml,不会覆盖
dmit-*.yaml 或 gcloud-*.yaml。客户端 YAML 默认权限为 600,因为其中含节点地址、UUID 和密码;
这可阻止同一台电脑上的其他系统用户读取。iCloud 副本用于设备同步,不作为项目源状态。
- Stash(首要兼容目标):从配置文件页面导入本地或 iCloud YAML
- Clash Verge:Settings → Profiles → Import
- 其他客户端:使用支持 Reality、Hysteria2 和 AnyTLS 的 Mihomo/Clash.Meta 兼容客户端
共享 YAML 以 Stash 当前公开配置格式为基线,同时保留 Mihomo 兼容性。不要直接加入 Stash 未支持的 Mihomo-only 字段,例如数组型 inline rule-provider;确需使用时,应拆分明确的客户端目标并补对应测试。
新生成的配置默认启用 PRIVACY_MODE=true,🇨🇳 国内流量 默认选择代理,避免检测页面同时观察到国内直连与代理出口;遇到无法使用的 CN 服务时,可在 Stash/Mihomo 里把该组手动切到 DIRECT,无需修改 YAML。设置 PRIVACY_MODE=false 会让该组首次默认直连,但仍可手动切回代理。局域网地址始终直连,原有 Apple/Spotify 规则保持不变。
当 PRIVACY_MODE=false,或手动把 🇨🇳 国内流量 切到 DIRECT 时,geosite:cn 域名通过阿里云 / 腾讯云的加密 DoH 解析,解析结果与国内直连出口保持同区,避免海外 DNS 导致 CDN 绕路;这不会产生明文 DNS 请求,但国内 DoH 服务商仍能看到查询出口 IP。其他域名继续使用经代理路由的 Cloudflare / Google DoH,STUN 仍固定走 🤖 AI 隐私出口,不受 PRIVACY_MODE 影响。DNS 在 Stash 使用 follow-rule、在 Mihomo 使用 respect-rules,并保留独立 bootstrap 解析器防止递归依赖。
为覆盖尚未及时进入 geosite:cn 的国内产品,生成器还会把所有 .cn 域名显式送入 🇨🇳 国内流量,并为这些域名优先使用国内 DNS;因此切换该组为 DIRECT 后,域名路由和解析会同时走国内路径。
普通流量默认使用 🛟 自动故障切换:Reality 正常时行为不变,连接失败时按 Reality → CDN → Hysteria2 → AnyTLS 顺序切换。AI 域名和 STUN 使用单独的 🤖 AI 隐私出口,按 Reality → CDN(启用时)切换;两条入口共用服务端 Xray IPv4 出口,不加入 HY2、AnyTLS 或 WARP。CDN-only 时该组只使用 CDN。
AI 规则来自 MetaCubeX category-ai-!cn。生成器把 Anthropic/Claude 的核心域名、认证/CDN、监控与第三方组件、Anthropic IP 段/ASN、NTP 和 STUN 写成高优先级静态规则,置于动态 AI、广告拦截及所有直连规则之前;远程规则集首次下载或刷新失败时,这些流量仍固定走 AI 隐私出口。IP-ASN 需要客户端加载 ASN 数据库,NTP 规则需要代理节点支持 UDP(当前节点均开启 UDP)。DeepSeek、通义、Kimi、豆包等中国 AI 域名不在此静态集合内,继续由后续 CN 或兜底规则处理。
US-Reality-WARP 仅保留为手动可选节点,不进入自动测速或自动故障切换,避免自动选择改变公网出口。
如需真正隐藏源站 IP,把 CDN_ENABLE=true 和 CDN_ONLY=true 同时设置;这会关闭直连 Reality/Hysteria2/AnyTLS,保留 Cloudflare WS 入口。
WARP_ENABLE=true 会在 VPS 上安装 Cloudflare WARP 的 SOCKS5 代理,并额外生成 US-Reality-WARP:客户端仍直连 VPS,只有该节点的 Xray 出站经过 WARP。现有 US-Reality、US-HY2 和 US-AnyTLS 不变。
这条路径不隐藏 VPS 入口 IP,因此不能和 CDN_ONLY=true 同时启用。WARP 只接入 Xray/Reality,Hysteria2 和 AnyTLS 暂不走全局策略路由;服务端会每 60 秒检查一次真实 SOCKS 出口并尝试自愈。
HY2_PORT_RANGE、HY2_OBFS_ENABLE、HY2_ACME_ENABLE 均为可选增强:开启后需要重新部署服务端并重新生成客户端 YAML;默认关闭时不改变已有协议行为。
修改 DEVICES 后重跑同一个 profile 的入口,即可增加或撤销设备。
先把域名接入 Cloudflare,并在目标 profile 的 .secrets.env 写入最小权限 API Token:
Account → Cloudflare Tunnel → Edit
Zone → Zone → Read
Zone → DNS → Edit
Zone 资源只选择目标域名。然后在该 profile 的 deploy.conf 设置:
CDN_ENABLE=true
CDN_ONLY=false
CDN_HOSTNAME=cdn.example.com
CDN_TUNNEL_NAME=<profile>-cdn
重新运行对应部署入口即可自动创建/复用 Tunnel、配置 Ingress、写入橙云 CNAME 并生成 US-CDN。
首次建议保持 CDN_ONLY=false,确认 CDN 节点可用后再单独切换 CDN-only。缺少 API Token 或
Cloudflare 权限不足时,部署会在修改服务器前停止,不会留下半套 VPS 配置。
- 两个入口均按幂等方式设计,会复用已有服务器和本地密钥。
- 只重新生成某个 profile 的客户端 YAML:
NETWORK_NODE_PROFILE=<profile> python3 core/gen-clash.py - 服务端组件版本在
deploy.conf中固定;升级前先改版本并重新部署,避免重跑时无意升级。 - GCP 旧命令
./deploy.sh仍可使用,但会提示改用./deploy-gcp.sh。 - 通用排障见 Troubleshooting。
- 新服务器接入和隔离规则见 Provider Onboarding。
# Provision a new Google Cloud node
./deploy-gcp.sh
# Configure an existing Debian/Ubuntu VPS
VPS_PROFILE=frantech VPS_SSH_KEY="$HOME/.ssh/frantech_ed25519" ./deploy-vps.sh <VPS_PUBLIC_IP>Both entry points run the same shared pipeline:
- Validate provider-specific requirements.
- Generate per-device credentials locally.
- Provision or secure a reachable host.
- Install BBR, Xray/Reality, Hysteria2, AnyTLS, systemd units, and security updates.
- Recover the Reality public key and generate one Stash-first, Mihomo-compatible YAML per device.
The provider adapters only own host lifecycle, connectivity, and firewall behaviour. Key generation, server configuration, routing rules, optional Cloudflare setup, and client generation remain in core/.
For a non-default VPS key:
VPS_PROFILE=<profile> VPS_SSH_KEY=/path/to/private-key ./deploy-vps.sh <VPS_PUBLIC_IP>Never copy private keys or .secrets.env into Git-tracked files, onto the server, or into chat.
MIT — see LICENSE.