将大量的代理订阅转化为一个稳定、智能、可观测且支持会话保持的统一代理入口。
Resin 是一个专为接管海量节点设计的高性能智能代理池网关。
它用于在上层屏蔽底层代理节点的不稳定性,将分散节点聚合为一个支持 “会话保持(粘性路由)” 的统一代理入口。
[!TIP] 您可以把本文档与项目详细设计文档
DESIGN.md丢给 AI,然后问它任何你感兴趣的问题!

http:// 或 https://。{"outbounds":[...]} 或原始出站数组 [...]。{"proxies":[...]} 或 YAML proxies:。vmess://、vless://、trojan://、ss://、hysteria2://、http://、https://、socks5://、socks5h://。
其中 http://、https://、socks5://、socks5h:// 需使用 scheme://[user:pass@]host:port 形式(可选 #tag;https 额外支持 sni/servername/peer 与 allowInsecure/insecure 查询参数)。IP:PORT 或 IP:PORT:USER:PASS(支持 IPv4 和 IPv6)。socks、http、shadowsocks、vmess、trojan、wireguard、hysteria、vless、shadowtls、tuic、hysteria2、anytls、ssh。ss/shadowsocks、socks/socks4/socks4a/socks5、http、vmess、vless、trojan、wireguard/wg、hysteria、hysteria2/hy2、tuic、anytls、ssh。只需简单三步,即可将你的节点订阅转化为高可用代理池。
推荐使用 Docker Compose 快速启动:
# docker-compose.yml
services:
resin:
image: ghcr.io/resinat/resin:latest
container_name: resin
restart: unless-stopped
environment:
RESIN_AUTH_VERSION: "V1" # 必填:LEGACY_V0 或 V1
RESIN_ADMIN_TOKEN: "admin123" # 修改为你的管理后台密码
RESIN_PROXY_TOKEN: "my-token" # 修改为你的代理密码
RESIN_LISTEN_ADDRESS: 0.0.0.0
RESIN_PORT: 2260
ports:
- "2260:2260"
volumes:
- ./data/cache:/var/cache/resin
- ./data/state:/var/lib/resin
- ./data/log:/var/log/resin
运行 docker compose up -d 启动服务。
(如果你不想使用 Docker,请跳转文末查看 其他部署方式)
http://127.0.0.1:2260(请替换为你的服务器 IP)。RESIN_ADMIN_TOKEN 登录后台。客户端接入方式参考接下来的章节。常见场景下,你可以按客户端能力选择 HTTP 正向代理、SOCKS5 正向代理或反向代理。
如果你只需要一个高性能、大容量、且会自动健康管理的通用代理池,Resin 开箱即用。
启动 Resin 服务后,你可以按客户端能力选择 HTTP 正向代理、SOCKS5 正向代理或反向代理接入。
如果你不想设置代理密码,请将环境变量显式设为空字符串:RESIN_PROXY_TOKEN=""(变量必须定义)。此时 HTTP 正向代理可直接接入 http://127.0.0.1:2260,SOCKS5 正向代理可直接接入 socks5://127.0.0.1:2260。
通过二进制文件或源码运行时,Resin 也会在读取配置前自动加载当前工作目录下的 .env 文件;已经由系统或 shell 设置的环境变量优先级高于 .env。
HTTP 正向代理例子:
curl -x http://127.0.0.1:2260 \
-U ":my-token" \
https://api.ipify.org
SOCKS5 正向代理例子(仅在 RESIN_AUTH_VERSION=V1 时可用):
curl --proxy socks5h://127.0.0.1:2260 \
-U "Default:my-token" \
https://api.ipify.org
如果你当前仍运行在 LEGACY_V0,SOCKS5 入站不会启用;请继续使用 HTTP 正向代理,或先完成迁移后再切换到 V1。当 RESIN_PROXY_TOKEN="" 时,SOCKS5 也允许无认证接入。
如果你的客户端支持修改服务的 BASE_URL,你也可以尝试反向代理接入。URL 格式为:/令牌/Platform(可选).Account(可选)/协议/目标地址。例如,你可以通过下面的 curl 命令通过 Resin 访问 https://api.ipify.org。
curl http://127.0.0.1:2260/my-token/./https/api.ipify.org
正向代理与反向代理的选择:如果条件允许,推荐尽量使用反向代理,对于可观测性更友好。如果您的客户端不支持修改 BaseURL,或者客户端需要 utls、非纯 WebAPI 请求这种反向代理不擅长的情况,请使用正向代理。
如果你的服务对节点有筛选要求,例如只需要某个地区的节点,或者只需要来自某个订阅源的节点,或者只需要名字匹配特定正则表达式的节点,可以使用 Resin 的 Platform 概念来实现。
你可以打开 http://127.0.0.1:2260/ui/platforms Platform 管理页面,创建一个 Platform。例如希望只使用来自美国、香港的节点,你可以创建一个名为 “MyPlatform” 的 Platform,然后在地区过滤规则中填入:
us
hk
对于正向代理(HTTP / SOCKS5),你可以在认证信息中填入希望使用的 Platform。下面分别给出一个 curl 例子:
curl -x http://127.0.0.1:2260 \
-U "MyPlatform:my-token" \
https://api.ipify.org
curl --proxy socks5h://127.0.0.1:2260 \
-U "MyPlatform:my-token" \
https://api.ipify.org
对于反向代理,你可以在 URL 前缀中提供 Platform 信息。下面是一个使用 curl 的例子:
curl http://127.0.0.1:2260/my-token/MyPlatform/https/api.ipify.org
当业务遇到对 IP 变化敏感的服务,或者需要持续交互时,你需要使用 Resin 的核心特性:粘性代理。
在此之前,先了解两个概念:
Default 平台。Tom 或 user_1)。携带特定 Account 的请求,Resin 会优先为其分配稳定的出口节点;当节点不可用时,会重试并优先切换到同 IP 节点,以降低业务侧适配成本。当 RESIN_AUTH_VERSION=V1 时,HTTP 正向代理与 SOCKS5 正向代理共用同一套身份格式:Platform.Account:RESIN_PROXY_TOKEN。
如需 V0 旧格式,可设置
RESIN_AUTH_VERSION=LEGACY_V0,继续使用RESIN_PROXY_TOKEN:Platform:Account。但该模式下不会启用 SOCKS5 正向代理。
直接将身份信息写入代理认证中即可:
# HTTP 正向代理:指定业务账号 user_tom,Resin 会为其长期分配一个稳定的专属 IP
curl -x http://127.0.0.1:2260 \
-U "Default.user_tom:my-token" \
https://api.ipify.org
# SOCKS5 正向代理:身份格式与 HTTP 正向代理保持一致
curl --proxy socks5h://127.0.0.1:2260 \
-U "Default.user_tom:my-token" \
https://api.ipify.org
你可以通过替换业务的 BaseURL 为 Resin 反代地址,将请求直接发给 Resin。
URL 格式进阶为:http://部署IP:2260/密码/平台.账号/协议/目标地址:
# 例如让 user_tom 访问 https 协议的 cloudflare.com:
curl "http://127.0.0.1:2260/my-token/Default.user_tom/https/api.ipify.org"
URL 中携带 Account 的模式定位是“简单使用 / 手动调试”。 生产环境长期集成,推荐优先使用请求头
X-Resin-Account传递 Account。
X-Resin-Account 请求头(推荐正式集成)如果你的客户端(或 SDK)支持自定义请求头,建议直接使用 X-Resin-Account 显式传递 Account,这是最稳定的方式。
Account 来源优先级:X-Resin-Account 请求头 > 反向代理 URL 中的 Account > 请求头提取规则。
示例:
curl "http://127.0.0.1:2260/my-token/MyPlatform/https/api.example.com/v1/orders" \
-H "X-Resin-Account: user_tom"
如果你的客户端不方便设置 X-Resin-Account,但业务请求本身已经有稳定身份头(例如发给目标网站的 API Key、Token、Cookie 等),Resin 也可以通过“请求头提取规则”自动提取 Account。
假设你的服务本来每次请求目标 API 时,都会携带 Authorization 请求头:
Authorization。此时,就算你在反向代理 URL 里不填 Account,Resin 也会在流量经过时读取并解析该 Header。例如:
curl "http://127.0.0.1:2260/my-token/MyPlatform/https/api.example.com/v1/orders" \
-H "Authorization: sk-abc123"
上面的请求中,Resin 发现 sk-abc123 后,会将其作为 Account。后续只要带着同一把 API Key 的请求,会优先保持在同一个出口 IP 上。
[!TIP] 除了 Platform 请求头配置外,Resin 还支持更高级的根据 URL 前缀决定请求头的高级功能!尝试把当前文档与 DESIGN.md 扔给 AI,问它 “请使用简单易懂的语言,向我介绍 Resin 指定请求头提取规则的两种方式,尤其是根据 URL 前缀决定请求头的方式。”
请仅在具备合法处理依据(如用户授权、合同约定或其他适用法律基础)时启用请求头提取,并确保你的日志留存与访问控制策略符合所在地法律法规及目标服务条款。
各类第三方客户端使用 Resin 的方式有所不同,对于业务代码的侵入程度也不同,总结如下:
💡 如果你不需要粘性代理
| 接入方式 | 代码侵入程度 | 说明 |
|---|---|---|
| 接入正向代理 | 🟢 零侵入 | 客户端填入 HTTP 或 SOCKS5 代理地址及认证信息即可。 |
| 接入反向代理 | 🟢 零/低侵入 | 修改服务 BaseURL 即可接入,适配极易。 |
💡 如果你需要粘性代理
| 接入方式 | 代码侵入程度 | 说明 |
|---|---|---|
| 接入正向代理 | 🟡 中侵入 | 需稍微修改代码:为不同用户附带不同认证信息。HTTP 与 SOCKS5 在 V1 下都可使用 平台.账号:密码。 |
| 接入反向代理 | 🟡 中侵入 | 需稍微修改代码:加入 X-Resin-Account 请求头或动态拼接带有账号的反代 URL 路径。 |
| 接入反向代理 + 请求头规则 | 🟢 零/低侵入 | Resin 允许通过识别业务原始头(如 Authorization)自动提取 Account 并进行粘性路由绑定,接入方式与非粘性反代接近。 |
👉 极速集成脚本/提示词(Prompt):
如果你是开发者,想要修改现有项目原生接入 Resin 粘性代理,你可以直接把下面这个模板喂给 AI 帮你写代码:
- doc/integration-prompt.md
方式一:运行预编译二进制文件
前往项目的 Release 页面,下载适合你操作系统架构的程序包。解压得到单个二进制文件 resin。
RESIN_ADMIN_TOKEN=【管理面板密码】 \
RESIN_AUTH_VERSION=V1 \
RESIN_PROXY_TOKEN=【代理密码】 \
RESIN_STATE_DIR=./data/state \
RESIN_CACHE_DIR=./data/cache \
RESIN_LOG_DIR=./data/log \
RESIN_LISTEN_ADDRESS=0.0.0.0 \
RESIN_PORT=2260 \
./resin
也可以在工作目录创建 .env 文件,然后直接运行 ./resin:
RESIN_AUTH_VERSION=V1
RESIN_ADMIN_TOKEN=【管理面板密码】
RESIN_PROXY_TOKEN=【代理密码】
RESIN_STATE_DIR=./data/state
RESIN_CACHE_DIR=./data/cache
RESIN_LOG_DIR=./data/log
RESIN_LISTEN_ADDRESS=0.0.0.0
RESIN_PORT=2260
方式二:通过源码编译
前提条件:请确保环境中已安装 Go 1.25+ 和 Node.js。
# 1. 下载 Resin 源码
git clone https://github.com/Resinat/Resin.git
# 2. 编译 WebUI
cd Resin/webui
npm install && npm run build
cd ..
# 3. 编译 resin 核心
go build -tags "with_quic with_wireguard with_grpc with_utls" -o resin ./cmd/resin
# 4. 运行程序
RESIN_ADMIN_TOKEN=【管理面板密码】 \
RESIN_AUTH_VERSION=V1 \
RESIN_PROXY_TOKEN=【代理密码】 \
RESIN_STATE_DIR=./data/state \
RESIN_CACHE_DIR=./data/cache \
RESIN_LOG_DIR=./data/log \
RESIN_LISTEN_ADDRESS=127.0.0.1 \
RESIN_PORT=2260 \
./resin
RESIN_PROXY_BYPASS,用分号、逗号或换行分隔规则。命中的请求会由 Resin 本机直连目标,而不是通过代理节点。例如:RESIN_PROXY_BYPASS="localhost;127.*;10.*;172.16.0.0/12;192.168.*;<local>"。规则支持精确主机、*/? 通配符、CIDR 网段,以及表示无点号本地域名的 <local>。RESIN_PROXY_TOKEN 未定义?RESIN_PROXY_TOKEN=""。如果你的 shell 会丢弃空环境变量,请创建 .env 文件并写入 RESIN_PROXY_TOKEN=。RESIN_AUTH_VERSION 未定义?LEGACY_V0 或 V1。新用户设置成 V1 即可。有旧数据的老用户可以参考迁移指南。RESIN_AUTH_VERSION=V1;LEGACY_V0 下不会启用 SOCKS5 入站。若 RESIN_PROXY_TOKEN 非空,客户端需要发送 SOCKS5 用户名密码认证;若它被显式设为空字符串,则也允许 NO AUTH。http 或 https(不能写 ws/wss)。Resin 会自动探测并完成 WebSocket 协议升级(Upgrade)。$ claude mcp add Resin \
-- python -m otcore.mcp_server <graph>