Skip to content
agentforge-techPublic

About

Open-source Web access infrastructure for AI Agents, providing unified Search, Image Search and Web Read capabilities with multi-provider fallback.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Repository files navigation

OpenReach Logo

OpenReach

面向 AI Agent 的开源 Web 访问基础设施
Search · Image Search · Read · Safe Curl

Java 17 Spring Boot 4.1 Maven 3.9+ Docker Ready Version

为 Agent 提供稳定、统一、可扩展的 Web 能力层,而不是让 Agent 直接绑定某一家搜索厂商。


项目入口

  • GitHub: https://github.com/changluya/openreach
  • 内置官网: 服务启动后访问 http://localhost:8080/
  • 官方文档: http://localhost:8080/docs/
  • OpenReach Skill: 官网右上角可直接下载

OpenReach 是什么?

OpenReach 是一个基于 JDK 17 + Spring Boot 的开源 Web Access Infrastructure,面向 AI Agent、Agent Platform、Research Agent 和 HTTP Tool 场景,提供四个核心 Web 原语:

search(query)        -> 搜索网页 / 发现信息源
image-search(query)  -> 文搜图 / 发现图片及来源页
read(url)            -> 读取网页 / 提取正文与元数据
curl(url)            -> 读取公开 API / JSON / raw 源码

核心设计目标只有一句话:

Agent 依赖稳定的能力接口,不依赖具体搜索厂商。

当前 v0.1.4 在 v0.1.3 监控与 CN/GLOBAL 零 Key能力上新增 Safe Curl,可读取 GitHub REST API、raw 源码与公开 JSON/text API;/monitor 内部调用监控后台继续保留。该入口不展示在官网导航中,访问时需要先登录;四个 Web API 的调用记录会异步持久化到 SQLite,默认数据目录为 ./data/monitor(容器内 /app/data/monitor)。核心 Search 路由能力在 v0.1.3 继续沿用并增强:provider=auto 时复用现有 region 参数,通过 SearchRouteResolver + ProviderChainResolver 选择 CN / GLOBAL Provider Chain;默认 region=auto 仍走 CN,保持 v1.0.1 兼容。工程不要求 Serper、Tavily、Brave API 等商业 Search Key 即可启动。

Web Search 的 Bing / 百度 / 搜狗 / 360 / Brave / DuckDuckGo 主要基于公开搜索页面做 best-effort 解析,不属于对应厂商商业 Search API,因此不承诺商业 SLA。Openverse 与 Wikimedia Commons 使用公开读接口。


当前工程能力

能力 HTTP 接口 状态 当前实现 主要输出
Web Search POST /api/web/search ✅ CN/GLOBAL 多 Provider 自动降级 + timeRange 标题、URL、摘要、排名、来源、时间范围
Image Search POST /api/web/image-search ✅ 多图片 Provider 自动降级 + 原图可下载校验 已验证可下载原图、缩略图、来源页、尺寸、License
Web Read POST /api/web/read ✅ Safe HTTP Fetch + Jsoup 标题、正文、最终 URL、元数据、Links
Safe Curl POST /api/web/curl ✅ Public GET/HEAD + SSRF/Self Guard GitHub/API/raw 源码文本、状态码、响应头
Provider Auto Fallback 内部能力 ✅ Provider SPI + Router 上游失败后自动切换下一渠道
URL 去重 内部能力 ✅ Search / ImageSearch 聚合层 去除重复结果
SSRF Protection Read / 图片探测内部能力 ✅ DNS / IP / Port / Redirect 校验 拦截内网、元数据地址和危险跳转
响应体限制 Read 内部能力 ✅ max-bytes / max-chars 避免异常大页面
Agent HTTP Plugin docs/agenthub/skills/ ✅ 标准 HTTP Plugin JSON Search / Image Search / Read / Safe Curl
Docker 部署 Docker / Compose ✅ Runtime-only Image amd64 / arm64 运行模型
内置官网 / Docs / · /docs/ ✅ Spring Boot Static Resources 服务启动即访问,无需独立前端
OpenReach Skill skills/openreach/ ✅ Python Tool + CLI Init / Doctor / Search / Image Search / Read / Curl
Dynamic Browser Read - ⏳ 预留 Playwright Reader JS 渲染页面
CN / GLOBAL Region Router 内部能力 ✅ SearchRouteResolver + ProviderChainResolver region 驱动国内/海外免费链路
Public Attack Surface Guard HTTP Filter ✅ 四 API 精确 Allowlist + JSON-only + 静态资源 Allowlist 禁上传/危险 Method/未知端点/路径穿越/超大请求体
Internal Monitor GET /monitor ✅ Session + SQLite + Async Writer 今日/7日/自定义区间、失败下钻、请求明细、失败记录 UTF-8 日志导出

当前能力边界

能力项 支持情况 说明
普通网页搜索 ✅ 多免费 Provider,支持 auto 或显式指定 Provider
文搜图 ✅ 返回图片及来源页面信息
HTML / SSR 网页读取 ✅ 当前 Read 核心场景
Provider 自动降级 ✅ 超时、解析失败、空结果时继续下一 Provider
Region 参数 ✅ CN aliases 走 CN;其他显式地区走 GLOBAL;auto 默认 CN
Pagination ❌ v0.1.4 仍聚焦首屏 / Top-N
Search 时间范围 ✅ timeRange=any/day/week/month/year;auto 只调用真正支持该过滤的 Provider
精确 Geo ❌ 不承诺商业级地理定位
Knowledge Graph / Shopping / Places ❌ 后续以垂直 Provider 扩展
JavaScript 动态渲染 ❌ 后续接 Playwright
PDF / Office 读取 ❌ 当前 Read 聚焦 HTML
CAPTCHA / 强反爬绕过 ❌ 不建设账号池、住宅代理池、CAPTCHA 绕过体系
商业 SLA / 高 QPS SERP ❌ 生产场景建议接商业 Provider

典型使用场景

OpenReach 的核心价值不是只提供一个“搜索接口”,而是把 发现信息源 → 获取目标页面 → 提取正文内容 串成一条适合 AI Agent 使用的 Web 访问链路。

场景 Search Read 典型用途
企业 / 产品官网 ✅ ✅ 搜索官网、产品页、解决方案、价格页、更新日志,再读取页面正文
技术文档 / 开源项目 ✅ ✅ 搜索官方文档、GitHub 页面;遇到 GitHub API/raw 源码时继续用 Safe Curl 读取机器可读内容
新闻 / 行业资讯 ✅ ✅ 搜索新闻、媒体报道、行业动态,继续读取原始来源页面
博客 / 专栏 / 内容站点 ✅ ✅ 搜索文章并读取正文,用于知识整理、摘要、研究与引用
微信公众号公开文章 ✅* ✅* 搜索公开推文链接,或直接传入公开文章 URL 读取正文
Research / Deep Research Agent ✅ ✅ 先 Search 批量发现来源,再 Read 多个页面进行汇总、对比和归纳
企业 Agent / 智能助手 ✅ ✅ 给内部 Agent 增加实时互联网信息获取能力,减少对单一搜索厂商的绑定
文搜图 / 内容配图 - - 通过 image-search 搜索图片及来源页,用于素材发现和内容生产

一个典型 Agent 调用链路

用户问题
   ↓
search(query)
   ↓
发现官网 / 新闻 / 博客 / 微信公众号公开文章等候选来源
   ↓
read(url)
   ↓
提取标题 / 正文 / 元数据 / Links
   ↓
Agent 总结、问答、对比、引用或继续深度检索

例如,当用户询问某个产品、公司或热点事件时,Agent 可以先通过 search 找到 官网、官方博客、媒体文章、微信公众号公开推文 等信息源,再对候选 URL 调用 read,把页面正文交给上层模型进行总结、分析或引用。

微信公众号说明: OpenReach 可以对公开可访问的微信文章 URL 尝试执行 read;也可以通过 Web Search 尝试发现已经被搜索引擎收录的微信公众号文章。实际可发现性取决于搜索引擎收录情况,页面能否读取则取决于微信页面当时的访问策略、反爬限制和网络环境,因此属于 best-effort 能力,不承诺所有公众号文章都能稳定搜索或读取。

对于需要登录、验证码、强 JavaScript 渲染或严格反爬的页面,当前 v0.1.4 的静态 HTTP Reader 可能无法完整读取,后续计划通过 Playwright / Browser Reader 扩展动态页面能力。


5 分钟快速开始

方式一:Docker 一键启动(推荐)

适合普通使用者。不需要 Clone 工程,也不依赖 Compose 文件;当 codercl/openreach:latest 镜像已经发布到镜像仓库后,直接执行下面这组命令:

sudo mkdir -p /data/openreach/data /data/openreach/logs
sudo chown -R 10001:10001 /data/openreach

docker run -d \
  --name openreach \
  --restart unless-stopped \
  -p 8080:8080 \
  -e OPENREACH_LOG_PATH=/app/logs \
  -e OPENREACH_MONITOR_USERNAME=openreach \
  -e OPENREACH_MONITOR_PASSWORD=openreach \
  -v /data/openreach/data:/app/data \
  -v /data/openreach/logs:/app/logs \
  --log-driver json-file \
  --log-opt max-size=20m \
  --log-opt max-file=3 \
  codercl/openreach:0.1.4

服务启动后同时内置 OpenReach 官网与文档站点:

官网        http://localhost:8080/
快速启动    http://localhost:8080/docs/
接口文档    http://localhost:8080/docs/api.html

常用管理命令:

# 查看容器
docker ps --filter name=openreach

# 查看控制台日志
docker logs -f openreach

# 查看持久化上游日志
tail -f /data/openreach/logs/openreach-upstream.log

# 停止并删除容器(/data/openreach/data 与 logs 仍保留)
docker rm -f openreach

如果宿主机 8080 已被占用,可以改成 -p 18080:8080,此时访问 http://localhost:18080。

启动时指定内部监控用户名 / 密码

v0.1.3 支持在首次启动、容器销毁重建或版本升级时直接通过 Docker 环境变量指定内部监控账号。凭据属于运行配置,不写入 SQLite,因此重建容器时应继续传入你希望使用的用户名和密码:

MONITOR_USERNAME='admin'
MONITOR_PASSWORD='change-me-now'

docker run -d \
  --name openreach \
  --restart unless-stopped \
  -p 8080:8080 \
  -e OPENREACH_LOG_PATH=/app/logs \
  -e OPENREACH_MONITOR_USERNAME="$MONITOR_USERNAME" \
  -e OPENREACH_MONITOR_PASSWORD="$MONITOR_PASSWORD" \
  -v /data/openreach/data:/app/data \
  -v /data/openreach/logs:/app/logs \
  codercl/openreach:0.1.4

不传时默认仍为 openreach / openreach。如果密码包含 $、!、空格等 shell 特殊字符,推荐使用项目提供的 .env.example 复制成 .env 后由 Compose 读取,避免命令行转义错误。


方式二:Docker Compose(可选)

适合已经 Clone 工程、希望通过配置文件管理容器的场景:

docker compose up -d
docker compose ps
docker compose logs -f openreach
docker compose down

方式三:源码直接启动

适合开发、调试和二次开发。

环境要求:

JDK 17+
Maven 3.9+

执行单测:

mvn clean test

启动:

mvn spring-boot:run

服务地址:

http://localhost:8080

服务启动后同时内置 OpenReach 官网与文档站点:

官网        http://localhost:8080/
快速启动    http://localhost:8080/docs/
接口文档    http://localhost:8080/docs/api.html

方式四:源码构建 Docker 并启动

当前 Dockerfile 是 Runtime-only Image:Maven 在宿主机编译并执行测试,Docker 只负责把生成的 JAR 封装成运行镜像。

./bin/quick/package.sh

docker compose -f docker-compose.build.yml up -d --build

如果希望先做完整本地镜像验收:

./bin/quick/docker-verify.sh

国内代理环境:

OPENREACH_BUILD_PROXY=http://127.0.0.1:7891 \
./bin/quick/docker-verify.sh

详细部署说明:


快速验证 API

Web Search

curl -X POST 'http://localhost:8080/api/web/search' \
  -H 'Content-Type: application/json' \
  -d '{
    "query": "Spring Boot AI Agent",
    "limit": 5,
    "region": "US",
    "provider": "auto",
    "timeRange": "month"
  }'

Image Search

curl -X POST 'http://localhost:8080/api/web/image-search' \
  -H 'Content-Type: application/json' \
  -d '{
    "query": "杭州西湖夜景",
    "limit": 8,
    "region": "auto",
    "provider": "auto"
  }'

Web Read

curl -X POST 'http://localhost:8080/api/web/read' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://spring.io/projects/spring-boot/",
    "maxChars": 20000
  }'

更多示例:

服务启动后也可以直接执行:

./bin/quick/smoke-test.sh

OpenReach Skill / Python CLI

OpenReach 内置一个可独立下载的 Python Skill。服务部署后,官网右上角点击 「下载 Skill」 即可获取:

http://<你的 OpenReach 服务器>:8080/downloads/openreach-skill.zip

项目源码中对应目录:

skills/openreach/
├── SKILL.md                     # Agent 使用说明 + ChatGPT-like Search SOP
├── README.md
├── config.example.json
├── scripts/
│   └── openreach.py             # Python Tool + CLI
└── tests/
    └── test_openreach.py

Skill 无需第三方 Python 依赖。Agent 判断是否已初始化时,只执行一次:

python3 scripts/openreach.py check

check 只检查当前 Skill 的 config.json 是否存在;不存在立即返回,网络请求为 0,并要求 Agent 向用户索要 <OPENREACH_BASE_URL>,在用户提供前停止。存在时只读取 base_url,再执行且只执行一次 POST /api/web/search 空 JSON 探测,预期由本地参数校验返回 400 / VALIDATION_ERROR,不会触发真实搜索或上游 Provider。check 不创建/修改配置、不重试、不扫描地址,也不会自动调用 init。

首次初始化只有在用户明确提供服务地址并要求初始化时执行:

python3 scripts/openreach.py init '<OPENREACH_BASE_URL>'

初始化成功后将地址写入当前 Skill 的 config.json:

{
  "base_url": "<OPENREACH_BASE_URL>"
}

check 成功一次后,本次任务直接调用业务 Tool,不需要再执行 doctor 或重复 check:

python3 scripts/openreach.py search "AI Agent" --region US --provider auto --time-range month --limit 5
python3 scripts/openreach.py image-search "杭州西湖" --region auto --provider auto --limit 8
python3 scripts/openreach.py read "https://spring.io/projects/spring-boot/" --max-chars 20000

Python Tool 也可以直接调用:

from skills.openreach import check_initialized, search, image_search, read

state = check_initialized()  # 每个任务只需一次,成功后直接调用业务 Tool
results = search("OpenReach AI Agent", region="US", provider="auto", time_range="month", limit=5)

search / image-search 的 region 默认均为 auto,省略时等价于 auto。v0.1.3 中它继续作为核心路由参数:CN / zh-CN / zh_CN / cn-zh / zh-Hans-CN / china 进入 CN 链,US / JP / SG / GB / GLOBAL / wt-wt 等其他显式地区进入 GLOBAL 链;之后原始 region 再作为 Provider 的 country / locale Hint。auto 默认仍为 CN,可通过 openreach.web.routing.default-route 调整。

Web Search 新增 timeRange:any/day/week/month/year,并兼容常见 d/w/m/y、pd/pw/pm/py、qdr:* 写法。指定时间范围后,provider=auto 会跳过不支持真实上游时间过滤的 Provider,避免参数被静默忽略。当前内置百度 Web 支持 day/week/month/year,Bing Web 已验证 day/week/month,Brave / DuckDuckGo 支持完整时间过滤;Bing year 因免费网页链路暂无稳定可验证参数而不会伪造支持。

为兼容早期版本仅配置 duckduckgo/brave 的部署,restricted timeRange 会在运行期自动恢复当前已验证的 Baidu/Bing 能力链,并在启动日志打印 runtime_capabilities。免费 SERP 命中 429 / Bot Challenge / 403 后会进入短期 Provider cooldown,避免同一出口连续撞限流;Read 则将建连超时与单次请求超时拆分,并仅对 GET 网络 I/O 做一次有界重试,HTTP 4xx/5xx 不盲目重试。

Image Search 现在对候选 imageUrl 做 SSRF 安全 + 重定向 + HTTP 状态 + 图片字节签名即时探测;只有响应生成时可直接下载的被动图片格式才会进入最终 items。失效热链、403/404、HTML/伪图片与 SVG 会被过滤,并继续尝试后续 Provider 补足结果。

Skill 内还提供基于项目 ChatGPT Search 调研抽象出的 Agentic Search SOP:Query Planning → Search → Source Selection → Read → Evidence Check → 再搜索/再读取 → Cross-source Verification → Citation。

详细说明见:skills/openreach/SKILL.md

Provider 支持

Web Search

provider=auto 会先按 region 选路由:

CN     -> Bing 中国 -> 百度 -> 搜狗 -> 360 -> DuckDuckGo
GLOBAL -> Brave Web -> DuckDuckGo HTML -> Bing Global
渠道 Provider Key 接入形式 API Key Route / 定位
Bing bing HTML SERP ❌ CN 用 cn.bing.com;GLOBAL 用 www.bing.com
百度 baidu HTML SERP ❌ CN 核心 fallback
搜狗 sogou HTML SERP ❌ CN fallback
360 搜索 so360 HTML SERP ❌ CN fallback
Brave Web brave 公开 Web SERP ❌ GLOBAL 第一优先级
DuckDuckGo duckduckgo HTML no-JS POST ❌ CN 末路 / GLOBAL 第二路;Challenge fail-fast

Image Search

provider=auto 同样复用 CN / GLOBAL Route:

CN     -> Bing Images -> 百度图片 -> 搜狗图片 -> Openverse
GLOBAL -> Bing Global Images -> Openverse -> Wikimedia Commons
渠道 Provider Key 接入形式 API Key Route / 定位
Bing Images bing 图片搜索结果解析 ❌ CN / GLOBAL Host 自动选择
百度图片 baidu acjson + warmup ❌ CN 核心 fallback
搜狗图片 sogou 页面 State 解析 ❌ CN 图片补充
Openverse openverse 公开 API ❌ CN / GLOBAL 开放许可补充源
Wikimedia Commons wikimedia MediaWiki Action API ❌ GLOBAL 开放许可 / 百科图片补充源

核心架构

                         AI Agent / Agent Platform
                                   │
                    ┌──────────────┼──────────────┐
                    │              │              │
                    ▼              ▼              ▼
              Web Search      Image Search      Web Read
                    │              │              │
                    ▼              ▼              ▼
             SearchService  ImageSearchService WebReadService
                    │              │              │
                    └───────┬──────┘              │
                            ▼                     │
                   SearchRouteResolver            │
                            │                     │
                            ▼                     │
                  ProviderChainResolver           │
                    CN / GLOBAL                   │
                            │                     │
                    ┌───────┴───────┐             │
                    ▼               ▼             ▼
            SearchProvider  ImageSearchProvider PageReader
                  SPI              SPI              │
                    │              │                ▼
          ┌─────────┼──────┐  ┌────┼─────┐   UrlSafetyGuard
          │         │      │  │    │     │          │
        Bing      Baidu  ... Bing Baidu  ...        ▼
                                                   SafeHttpFetcher
                                                        │
                                                        ▼
                                                Jsoup / Extractor

项目通过 Provider SPI 隔离具体上游:

Agent / API
    ↓
统一能力接口
    ↓
Provider Router
    ↓
免费 Provider / 自托管 Provider / 商业 Provider

因此业务侧不需要因为更换搜索厂商而重写 Agent Tool 协议。


工程目录

openreach/
├── src/main/java/
│   └── io/github/changlu/openreach/
│       ├── search/                 # Web Search
│       ├── imagesearch/            # Image Search
│       ├── read/                   # Web Read
│       ├── routing/                # CN / GLOBAL Route + Locale
│       ├── security/               # URL / SSRF 安全
│       ├── config/                 # 配置
│       └── web/                    # HTTP Controller
├── src/test/java/                  # 单元测试
├── src/main/resources/static/      # 内置官网与在线文档
│   ├── index.html                  # http://localhost:8080/
│   └── docs/                       # /docs/ 与 /docs/api.html
├── skills/openreach/               # OpenReach Skill / Python CLI
├── docs/
│   ├── 核心市场调研分析/
│   ├── 核心搜索接口设计/
│   ├── 设计方案/
│   ├── 部署篇/
│   ├── agenthub/
│   └── 设计文档/产物/logo.png      # README 使用的 Logo
├── bin/quick/                      # 测试 / 打包 / 构建 / 发布 / Smoke
├── Dockerfile
├── docker-compose.yml
├── docker-compose.build.yml
└── pom.xml

快捷命令

场景 命令
全量单测(Java + Skill Python) ./bin/quick/check-project.sh
Maven 打包 ./bin/quick/package.sh
本地 Docker 构建 ./bin/quick/docker-build.sh
本地镜像启动验收 ./bin/quick/docker-verify.sh
公网接口 Smoke Test ./bin/quick/smoke-test.sh
调用方到 OpenReach 连接诊断 BASE_URL=<Tool Runner 可访问地址> ./bin/quick/connectivity-test.sh
应用自身 HTTP QPS 基准 ./bin/quick/qps-unit-test.sh
已启动服务真实 QPS 压测 BASE_URL=http://127.0.0.1:8080 ./bin/quick/qps-test.sh
一键发布 Docker Hub ./bin/quick/release.sh
Docker 一键启动 docker run -d --name openreach --restart unless-stopped -p 8080:8080 -v /data/openreach/data:/app/data -v /data/openreach/logs:/app/logs --log-driver json-file --log-opt max-size=20m --log-opt max-file=3 codercl/openreach:latest
Docker Compose 启动(可选) docker compose up -d
Docker Compose 停止 docker compose down

更多说明:bin/quick/README.md


文档导航

核心搜索接口设计

核心市场调研

工程、测试与能力说明

部署与发布


AgentHub / HTTP Plugin

项目已经提供标准 HTTP Plugin JSON:

docs/agenthub/skills/openreach-http-plugin.json

容器 / 沙箱注意: Plugin 的 BASE_URL 必须是 AgentHub / Tool Runner 所在环境可以访问 的 OpenReach 地址。不要把 localhost:8080 当成跨容器默认值;Tool Runner 在另一个容器时,localhost 指向 Tool Runner 自身。若两个容器在同一 Docker Network,可使用 http://openreach:8080(以实际 Service/Container 名称为准)。出现裸 All connection attempts failed 且没有 OpenReach traceId 时,先运行 BASE_URL=<实际地址> ./bin/quick/connectivity-test.sh。

四个核心能力可以直接封装为 Agent Tool:

search
image-search
read
curl

适合作为 AgentHub、Research Agent、Coding Agent、企业内部智能体平台的 Web 基础能力层。


Roadmap

v1.0.1
├── Web / Image / Read 基础原语       ✅
├── 国内免费 Multi-Provider Fallback  ✅
├── SSRF / Docker / Skill / Plugin    ✅
└── 测试基线                          ✅

v0.1.2
├── CN / GLOBAL Region Router        ✅
├── Brave Web                        ✅
├── DuckDuckGo no-JS POST 强化       ✅
├── Bing Web / Image 全球化          ✅
├── Wikimedia Commons Image          ✅
├── Route-aware Provider Chain       ✅
├── Search timeRange                 ✅
├── Image 可下载强校验                ✅
├── 三 API + 官网静态资源安全白名单     ✅
└── 路由 / Provider / 安全 / 回归测试扩增 ✅

v0.1.4 Safe Curl / GitHub 源码读取

  • POST /api/web/curl:仅公网 80/443,GET/HEAD only;
  • 适合 GitHub REST API、raw.githubusercontent.com 与公开 JSON/text API;
  • 禁止请求 OpenReach 自身:当前 Host/serverName/localAddr、自身 Host 解析出的公网 IP、本机网卡地址及 OPENREACH_CURL_BLOCKED_HOSTS 均参与校验;
  • 禁止 Authorization/Cookie/Host/X-Forwarded-* 等敏感 Header、写 Method、二进制下载;
  • 每次 Redirect 重新执行 SSRF + self-target 校验。

v0.1.3 内部监控后台

启动后直接访问:http://localhost:8080/monitor。默认用户名 / 密码均为 openreach。生产环境建议通过 OPENREACH_MONITOR_USERNAME、OPENREACH_MONITOR_PASSWORD 覆盖默认凭据。 监控总览支持“今日 / 近 7 日 / 自定义日期范围”,选择自定义范围后总览、趋势、接口分布与请求明细会同步切换统计区间。点击“调用失败”会自动筛选失败请求,并在请求记录右侧提供“导出失败请求”,按当前日期 / Endpoint / Keyword 条件调用后端导出接口,下载全部匹配失败请求的 UTF-8 .log 诊断日志(含完整入参和返回值)。

v0.1.3 已接入真实请求采集与 SQLite + WAL 持久化。/app/data 是稳定持久化契约,宿主机推荐映射 /data/openreach/data;删除并重建容器时只要继续挂载同一 data 目录,请求监控历史会继续保留。完整 Schema、Migration 与未来 MySQL / PostgreSQL 演进见 docs/设计方案/v0.1.3设计方案文档.md。

Nginx / Docker 后获取真实调用 IP

如果 OpenReach 前面有 Nginx,应用直接看到的 TCP 来源通常是 Docker 网桥(例如 172.17.0.1),因此 Nginx 必须覆盖并透传真实来源头:

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

OpenReach 默认开启 OPENREACH_MONITOR_TRUST_PROXY_HEADERS=true,但只在直连来源属于可信代理网段时解析 X-Forwarded-For/X-Real-IP。默认可信代理为 127.0.0.1/32,::1/128,172.16.0.0/12,覆盖宿主机 Nginx 与常见 Docker Bridge 场景;公网客户端直连时伪造这些 Header 不会生效。自定义代理网络时可设置:

OPENREACH_MONITOR_TRUSTED_PROXY_CIDRS='127.0.0.1/32,::1/128,172.16.0.0/12,10.10.0.0/16'

解析采用从右向左剥离可信代理的方式,不再简单相信 X-Forwarded-For 最左值。升级后只影响新产生的监控记录,SQLite 中已经记录为 172.17.0.1 的历史数据不会自动改写。

OPENREACH_MONITOR_USERNAME=admin \
OPENREACH_MONITOR_PASSWORD='change-me' \
OPENREACH_IMAGE=codercl/openreach:0.1.4 \
  docker compose up -d --force-recreate
v0.1.3
├── /monitor 独立内部监控入口          ✅
├── 默认账号密码 openreach/openreach   ✅
├── 服务端 Session 登录保护            ✅
├── 官网 / 文档不展示监控入口          ✅
├── 今日 / 近 7 日 / 自定义日期总览    ✅
├── 自定义范围联动总览 / 趋势 / 明细     ✅
├── 成功 / 失败趋势与接口分布          ✅
├── 失败请求一键下钻                   ✅
├── 请求明细 / 详情抽屉(真实 API)      ✅
├── SQLite + WAL 持久化                ✅
├── 元数据 / Payload 分表              ✅
├── 异步队列 + Single Writer          ✅
├── Schema Migration V2              ✅
├── 独立 IP 统计                      ✅
├── 中文 Payload UTF-8 修复           ✅
├── 失败请求筛选 / 后端日志导出         ✅
├── Docker 启动账号密码可配置           ✅
└── /app/data 容器重建数据保留          ✅

Next
├── Provider Health / Circuit Breaker
├── Search Quality Gate / Metrics
├── Playwright Dynamic Read
├── 自托管 SearXNG(可选)
├── News / Places 等垂直能力
└── Rerank / Citation / Research Pipeline

关于免费搜索 Provider

OpenReach 的目标不是自研 Google SERP 反爬平台。

当前免费 Provider 通过多渠道容错降低单一上游 DOM 改版、限流、网络出口变化带来的影响,但仍属于 best-effort 能力。

v0.1.3 默认链继续严格坚持 零 API Key / 零账号依赖。未来如果某个部署方自行需要商业 SLA,可以通过 SearchProvider SPI 以可选扩展接入,但不会改变 OpenReach 默认免费开箱路径;项目也不会建设账号池、Cookie 池、住宅代理池或 CAPTCHA 绕过体系。


交流群

扫码加入 OpenReach 交流群,一起交流 Agent 联网能力、多 Provider 路由与开源共建:

OpenReach 交流群

License

当前工程尚未附加正式 LICENSE。

在正式公开发布到 GitHub 前,建议明确选择 MIT、Apache-2.0 或其他符合项目目标的开源许可证。


English

OpenReach is an open-source Web access infrastructure for AI Agents, built with JDK 17 + Spring Boot.

It exposes three stable primitives:

search(query)
image-search(query)
read(url)

Agents depend on stable capabilities, not on a specific search vendor.

Quick start with Docker:

docker run -d --name openreach --restart unless-stopped -p 8080:8080 -e OPENREACH_LOG_PATH=/app/logs -v /data/openreach/data:/app/data -v /data/openreach/logs:/app/logs --log-driver json-file --log-opt max-size=20m --log-opt max-file=3 codercl/openreach:latest

For local development:

mvn clean test
mvn spring-boot:run

See the Chinese sections above for the full capability matrix, provider support, API examples, architecture and deployment documentation.

About

Open-source Web access infrastructure for AI Agents, providing unified Search, Image Search and Web Read capabilities with multi-provider fallback.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages