维护 Resin Grok 代理池
目标
把不稳定的大批代理收敛为一个可审计的 Resin 入口。验证过程不使用 Grok OAuth、不调用模型生成接口,也不消耗账号 token;生产更新必须保留现有可信订阅、失败关闭并可回滚。
分流
- 搜索 LINUX DO 来源时,先完整使用
find-linuxdo-node-links;继承其linux-do-research交接、附件、敏感 URL 和楼层证据规则。个人订阅 token、单节点凭据和弱混淆地址只记录主题,不加入无人值守配置。 - 实际修改 Grok OAuth 账号的
proxy_id、处理 402/429 或验证指定账号时,单独使用grok-sub2api-ops。真实 429 禁止新增测试。 - 本技能只管理代理来源、节点验证、Resin 订阅和维护任务,不接管 OAuth 生命周期或 Sub2API 通用数据库操作。
拓扑原则
- 不让 OAuth 请求逐次随机换公网 IP。每个 Grok 账号使用唯一 Resin 逻辑 Account,Resin 为它建立粘性租约;物理节点熔断后才迁移。
- Sub2API 中的
proxy_id可以绑定逻辑 Resin 凭据,但不能把它误称为固定物理节点。多个 Sub2API proxy 对象可指向同一 Resin 地址并使用不同Platform.Account用户名。 - 默认接纳所有地区;先为每个已验证地区保留少量最快出口,再按全局延迟补满目标池。地区还用于分布统计和故障审计,但不替代节点可用性判断。只有用户明确要求合规或地域边界时,才配置
allowed_regions或 Resinregion_filters。 - 保留已有可信订阅作为同平台兜底。公开节点放在独立、可替换的本地订阅中,不覆盖可信订阅。Resin 的多个
regex_filters是 AND 关系;合并多个来源时使用一个明确 alternation 正则,不能逐条追加来源正则。 - 重试必须有上限。连接失败由 Resin 被动熔断和下一连接换路处理;不得无限重放带业务副作用的请求。
- 动态出口主要处理传输故障、TLS/CONNECT 失败和出口信誉问题。遇到
429先判定作用域并优先保持同一身份/出口延迟重试:可信Retry-After按要求退避,否则等待 30 秒,必要时再等 30 秒,总主动等待不超过 60 秒。等待后仍可能是单出口限制时,匿名公开GET/HEAD最多串行尝试三个已验证网络路径,携带登录身份时每次事件只切换一个已验证出口做一次 A/B。成功后固定路径;所有有界路径仍为429时使用论坛分类/主题 JSON、reader 原文、公开 CDN 或稍后续跑,不得并发扫出口或持续换 IP。
工作流
- 只读确认实际生产对象:
resin-grok.service、监听地址、Admin token 来源、状态库、目标 Platform、现有订阅和可信兜底。不要凭名称猜环境。 - 检查输入权限和结构,只统计行数、格式、唯一数与哈希,不打印代理地址或凭据。凭据文件和配置必须为
0600。 - 对论坛来源记录主题、楼层、日期、附件/外链状态、有效期和敏感分类。只有公开静态文件或用户明确拥有的来源可进入配置。
- 先运行只读验证。脚本并发执行代理认证、到
grok.com:443的 CONNECT 与 TLS 证书握手,再用 Cloudflare trace 小响应取得出口和地区;不发送 Grok HTTP 业务请求。 - 检查
passed_count、selected_count、唯一出口、地区和失败分类。验证数量低于绝对阈值或相对上一批骤降时停止,不更新生产池。 - 写入前对 Resin
state.db、cache.db使用 SQLite 在线备份并执行integrity_check。只通过官方 Admin API 创建或更新受管订阅、刷新并补充 Platform 正则。 - 更新后核对订阅内容哈希、解析节点数、Platform 路由节点数、可信订阅仍存在和服务健康。失败时用 API 恢复原订阅和 Platform 过滤器,保留恢复点。
- 每日任务复用同一配置;内容未变化时不写生产、不重复备份。只轮换带本技能 owner manifest 的运行目录。
- 论坛批次使用
scripts/discover_linuxdo_proxy_batch.py做低频确定性发现:合并福利分类最新 JSON 与已核验持续发布作者主题页,最多核验六个候选、按主帖真实created_at选三个未过期主题;每主题最多下载两个公开附件并只保留小样本。HTTP 429 和 reader 正文内嵌 429 共享单次任务 60 秒主动等待预算:同出口先等 30 秒重试,必要时再等 30 秒;可信Retry-After超出剩余预算时保留旧源到下一轮,预算阶段结束后匿名请求才串行尝试至多三个已验证路径。不使用论坛 session,不下载全部大分片。 - 发现器先发布按内容 hash 命名的不可变候选代文件,再原子切换 sidecar manifest;验证器以 manifest 指向的代文件为准,兼容路径只作人工查看。附件返回
Content-Length时必须精确匹配,短读不进入样本。manifest 决定过期与 hash,发现失败时保留仍未过期的上批,过期后由验证器自动跳过。
脚本
只读验证:
python3 scripts/resin_pool_sync.py validate --config <config.json>
验证并生产更新:
python3 scripts/resin_pool_sync.py run \
--config <config.json> \
--admin-token-file <systemd-credential-or-private-token-file> \
--confirm-production-write
scripts/proxy_probe.py 支持以下逐行格式:
http://[user:pass@]host:porthttps://[user:pass@]host:portsocks5://[user:pass@]host:portuser:pass@host:porthost:port:user:passhost:port
输入解析默认拒绝私网、环回、链路本地、保留地址和下载重定向到非公网目标。运行报告只保存节点指纹和出口哈希;仅 validated-proxies.txt 含凭据,权限必须保持 0600。
配置约束
配置至少包含:
{
"version": 1,
"state_dir": "/var/lib/resin-pool-maintainer",
"retain_runs": 7,
"sources": [{"id": "local-batch", "type": "file", "path": "/private/proxies.txt"}],
"validation": {"workers": 200, "batch_size": 500, "timeout_seconds": 5, "target_host": "grok.com", "trace_egress": true},
"selection": {"max_nodes": 2000, "max_per_egress": 2, "min_per_region": 1, "require_egress": true, "allowed_regions": []},
"safety": {"min_selected": 20, "min_passed": 20, "min_ratio_to_previous": 0.5},
"resin": {
"base_url": "http://172.17.0.1:10833",
"subscription_name": "managed-grok-public-pool",
"platform_id": "<verified-platform-uuid>",
"platform_name": "GrokEU",
"managed_regex": "^managed-grok-public-pool/",
"platform_regex_filters": ["^(trusted-grok-local-pool|managed-grok-public-pool)/"],
"region_filters": [],
"backup_db_paths": ["/var/lib/resin-grok/state.db", "/var/cache/resin-grok/cache.db"]
}
}
远程来源使用 type=url 与 url;有七天有效期时写入明确 expires_at。不要把不确定的“发帖后七天”永久配置为远程源。
验收与停止条件
- 完成:验证报告无秘密、选中节点达到阈值、Resin 备份可恢复、受管订阅哈希一致、Platform 同时包含可信与受管来源、Grok 账号逻辑身份映射另经 Grok 技能验收。
- 停止:来源身份或时效不清、附件只能依赖个人 cookie、有效节点骤降、API 对象漂移、备份失败、Platform 身份不符、回滚不完整。
- 不把 TLS 握手成功写成 Grok OAuth 账号可用;账号可用性只接受对应 Grok 技能规定的被动证据或必要的指定账号探针。