From 6606e2ef6d404ae3ec37e34bfc5e464ceb78e98d Mon Sep 17 00:00:00 2001 From: okxlin <61420215+okxlin@users.noreply.github.com> Date: Sat, 1 Aug 2026 03:19:49 +0800 Subject: [PATCH] Add WebClaw app --- apps/webclaw/README.md | 49 +++++++++++++ apps/webclaw/README_en.md | 35 +++++++++ apps/webclaw/data.yml | 31 ++++++++ apps/webclaw/latest/.env.sample | 6 ++ apps/webclaw/latest/data.yml | 85 ++++++++++++++++++++++ apps/webclaw/latest/docker-compose.yml | 44 +++++++++++ apps/webclaw/latest/scripts/init.sh | 2 + apps/webclaw/latest/scripts/uninstall.sh | 4 + apps/webclaw/latest/scripts/upgrade.sh | 4 + apps/webclaw/logo-LICENSE.txt | 7 ++ apps/webclaw/logo.png | Bin 0 -> 9956 bytes apps/webclaw/v0.6.16/.env.sample | 6 ++ apps/webclaw/v0.6.16/data.yml | 85 ++++++++++++++++++++++ apps/webclaw/v0.6.16/docker-compose.yml | 44 +++++++++++ apps/webclaw/v0.6.16/scripts/init.sh | 2 + apps/webclaw/v0.6.16/scripts/uninstall.sh | 4 + apps/webclaw/v0.6.16/scripts/upgrade.sh | 4 + 17 files changed, 412 insertions(+) create mode 100644 apps/webclaw/README.md create mode 100644 apps/webclaw/README_en.md create mode 100644 apps/webclaw/data.yml create mode 100644 apps/webclaw/latest/.env.sample create mode 100644 apps/webclaw/latest/data.yml create mode 100644 apps/webclaw/latest/docker-compose.yml create mode 100755 apps/webclaw/latest/scripts/init.sh create mode 100755 apps/webclaw/latest/scripts/uninstall.sh create mode 100755 apps/webclaw/latest/scripts/upgrade.sh create mode 100644 apps/webclaw/logo-LICENSE.txt create mode 100644 apps/webclaw/logo.png create mode 100644 apps/webclaw/v0.6.16/.env.sample create mode 100644 apps/webclaw/v0.6.16/data.yml create mode 100644 apps/webclaw/v0.6.16/docker-compose.yml create mode 100755 apps/webclaw/v0.6.16/scripts/init.sh create mode 100755 apps/webclaw/v0.6.16/scripts/uninstall.sh create mode 100755 apps/webclaw/v0.6.16/scripts/upgrade.sh diff --git a/apps/webclaw/README.md b/apps/webclaw/README.md new file mode 100644 index 000000000..2d57d6c40 --- /dev/null +++ b/apps/webclaw/README.md @@ -0,0 +1,49 @@ +# WebClaw + +## 产品介绍 + +WebClaw 是一个自托管、无状态的网页内容提取 REST API。它可以抓取公开网页,并返回适合检索、归档和 AI 工作流使用的 Markdown、纯文本、HTML 或结构化 JSON。 + +## 主要功能 + +- 通过 `/v1/scrape` 提取单个网页 +- 支持 Markdown、纯文本、HTML、LLM 文本和 JSON 输出 +- 支持站点抓取、URL 映射、批量提取、差异比较和品牌信息提取 +- 可选接入 Serper.dev 搜索和 WebClaw Cloud 回退服务 +- 使用 Bearer Token 保护所有 `/v1/*` 接口 + +## 访问说明 + +- 安装后通过设置的 HTTP 端口访问 REST API;`/health` 可用于健康检查。 +- 调用 `/v1/*` 接口时,在 `Authorization` 请求头中提供安装时生成的 API Token。 +- 默认包启动开源的 `webclaw-server`,不包含托管版的反机器人绕过、JavaScript 渲染、多租户和计费功能。 +- 服务会访问用户提交的 URL。对公网开放前,请通过 1Panel 反向代理启用 HTTPS,并限制 API Token 的分发范围。 + +## 可选服务 + +- `WEBCLAW_CLOUD_API_KEY` 用于在受保护站点上启用 WebClaw Cloud 回退。 +- `SERPER_API_KEY` 用于启用 `/v1/search`;留空时该接口返回未配置状态,不影响本地网页提取。 + +## 数据说明 + +开源服务器本身无状态,不创建数据库或持久化用户内容。API Token 和可选外部服务密钥由 1Panel 应用配置管理。 + +## 链接 + +- 网站:https://webclaw.io +- 项目:https://github.com/0xMassi/webclaw +- 镜像:https://github.com/0xMassi/webclaw/pkgs/container/webclaw + +## Introduction + +WebClaw is a self-hosted, stateless REST API for extracting public web pages as clean Markdown, plain text, HTML, or structured JSON. + +## Features + +- Extract a page through `/v1/scrape` +- Return Markdown, plain text, HTML, LLM text, or JSON +- Crawl sites, map URLs, process batches, compare pages, and extract brand metadata +- Optionally enable Serper.dev search and WebClaw Cloud fallback +- Protect every `/v1/*` endpoint with a Bearer token + +The `/health` endpoint is available without authentication. Send the generated API token in the `Authorization: Bearer ...` header for `/v1/*` requests. Enable HTTPS through a 1Panel reverse proxy before exposing the service publicly. diff --git a/apps/webclaw/README_en.md b/apps/webclaw/README_en.md new file mode 100644 index 000000000..b0956d244 --- /dev/null +++ b/apps/webclaw/README_en.md @@ -0,0 +1,35 @@ +# WebClaw + +## Introduction + +WebClaw is a self-hosted, stateless REST API for extracting public web pages as clean Markdown, plain text, HTML, or structured JSON. + +## Features + +- Extract a page through `/v1/scrape` +- Return Markdown, plain text, HTML, LLM text, or JSON +- Crawl sites, map URLs, process batches, compare pages, and extract brand metadata +- Optionally enable Serper.dev search and WebClaw Cloud fallback +- Protect every `/v1/*` endpoint with a Bearer token + +## Usage + +- The `/health` endpoint is available without authentication. +- Send the generated API token in the `Authorization: Bearer ...` header for `/v1/*` requests. +- This package runs the open-source `webclaw-server`. Hosted anti-bot bypass, JavaScript rendering, multi-tenant features, and billing are not included. +- The service fetches URLs supplied by API clients. Enable HTTPS through a 1Panel reverse proxy before exposing it publicly and restrict token distribution. + +## Optional Services + +- `WEBCLAW_CLOUD_API_KEY` enables cloud fallback for protected sites. +- `SERPER_API_KEY` enables `/v1/search`. Leaving it blank does not affect local page extraction. + +## Data + +The open-source server is stateless and creates no database. 1Panel manages the API token and optional provider keys as application configuration. + +## Links + +- Website: https://webclaw.io +- Project: https://github.com/0xMassi/webclaw +- Image: https://github.com/0xMassi/webclaw/pkgs/container/webclaw diff --git a/apps/webclaw/data.yml b/apps/webclaw/data.yml new file mode 100644 index 000000000..0f97aef95 --- /dev/null +++ b/apps/webclaw/data.yml @@ -0,0 +1,31 @@ +name: WebClaw +tags: + - 实用工具 +title: 将网页提取为干净内容的自托管 API +description: 将网页提取为干净内容的自托管 API +additionalProperties: + key: webclaw + name: WebClaw + tags: + - Tool + shortDescZh: 将网页提取为干净内容的自托管 API + shortDescEn: A self-hosted API for extracting clean content from web pages + description: + en: A self-hosted REST API that extracts web pages as clean Markdown, text, HTML, or structured JSON. + zh: 将网页提取为干净 Markdown、文本、HTML 或结构化 JSON 的自托管 REST API。 + zh-Hant: 將網頁擷取為乾淨 Markdown、文字、HTML 或結構化 JSON 的自託管 REST API。 + ja: Web ページをクリーンな Markdown、テキスト、HTML、構造化 JSON に抽出するセルフホスト REST API です。 + ko: 웹 페이지를 깔끔한 Markdown, 텍스트, HTML 또는 구조화된 JSON으로 추출하는 자체 호스팅 REST API입니다. + ru: Самостоятельно размещаемый REST API для извлечения веб-страниц в чистый Markdown, текст, HTML или структурированный JSON. + ms: API REST dihos sendiri untuk mengekstrak laman web sebagai Markdown, teks, HTML atau JSON berstruktur yang bersih. + pt-br: API REST auto-hospedada que extrai paginas web como Markdown, texto, HTML ou JSON estruturado e limpo. + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://webclaw.io + github: https://github.com/0xMassi/webclaw + document: https://github.com/0xMassi/webclaw + architectures: + - amd64 + - arm64 diff --git a/apps/webclaw/latest/.env.sample b/apps/webclaw/latest/.env.sample new file mode 100644 index 000000000..3bccd9a0b --- /dev/null +++ b/apps/webclaw/latest/.env.sample @@ -0,0 +1,6 @@ +PANEL_APP_BIND_ADDRESS=0.0.0.0 +PANEL_APP_PORT_HTTP=40102 +WEBCLAW_API_KEY=replace-with-a-strong-random-api-token +WEBCLAW_CLOUD_API_KEY= +SERPER_API_KEY= +CONTAINER_NAME=1Panel-localwebclaw diff --git a/apps/webclaw/latest/data.yml b/apps/webclaw/latest/data.yml new file mode 100644 index 000000000..0361da5c2 --- /dev/null +++ b/apps/webclaw/latest/data.yml @@ -0,0 +1,85 @@ +additionalProperties: + formFields: + - default: 0.0.0.0 + edit: true + envKey: PANEL_APP_BIND_ADDRESS + labelEn: Bind Address + labelZh: 绑定地址 + label: + en: Bind Address + zh: 绑定地址 + zh-Hant: 綁定位址 + ja: バインドアドレス + ko: 바인드 주소 + ru: Адрес привязки + ms: Alamat ikatan + pt-br: Endereco de vinculacao + required: true + type: text + - default: 40102 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP 端口 + label: + en: HTTP Port + zh: HTTP 端口 + zh-Hant: HTTP 連接埠 + ja: HTTP ポート + ko: HTTP 포트 + ru: HTTP-порт + ms: Port HTTP + pt-br: Porta HTTP + required: true + rule: paramPort + type: number + - default: "" + edit: true + envKey: WEBCLAW_API_KEY + labelEn: API Token + labelZh: API Token + label: + en: API Token + zh: API Token + zh-Hant: API Token + ja: API トークン + ko: API 토큰 + ru: API-токен + ms: Token API + pt-br: Token da API + random: true + required: true + rule: paramComplexity + type: password + - default: "" + edit: true + envKey: WEBCLAW_CLOUD_API_KEY + labelEn: Cloud Fallback Key + labelZh: Cloud 回退密钥 + label: + en: Cloud Fallback Key + zh: Cloud 回退密钥 + zh-Hant: Cloud 備援金鑰 + ja: Cloud フォールバックキー + ko: Cloud 대체 키 + ru: Ключ резервного облачного сервиса + ms: Kunci sandaran Cloud + pt-br: Chave de fallback do Cloud + required: false + type: password + - default: "" + edit: true + envKey: SERPER_API_KEY + labelEn: Serper Search Key + labelZh: Serper 搜索密钥 + label: + en: Serper Search Key + zh: Serper 搜索密钥 + zh-Hant: Serper 搜尋金鑰 + ja: Serper 検索キー + ko: Serper 검색 키 + ru: Ключ поиска Serper + ms: Kunci carian Serper + pt-br: Chave de pesquisa Serper + required: false + type: password diff --git a/apps/webclaw/latest/docker-compose.yml b/apps/webclaw/latest/docker-compose.yml new file mode 100644 index 000000000..9fd8fdbc0 --- /dev/null +++ b/apps/webclaw/latest/docker-compose.yml @@ -0,0 +1,44 @@ +services: + webclaw: + image: "ghcr.io/0xmassi/webclaw:latest" + container_name: ${CONTAINER_NAME} + restart: unless-stopped + command: + - webclaw-server + user: "65534:65534" + read_only: true + tmpfs: + - /tmp:rw,nodev,noexec,nosuid,size=16m + cap_drop: + - ALL + security_opt: + - no-new-privileges:true + networks: + - 1panel-network + ports: + - "${PANEL_APP_BIND_ADDRESS}:${PANEL_APP_PORT_HTTP}:3000" + environment: + - WEBCLAW_HOST=0.0.0.0 + - WEBCLAW_PORT=3000 + - WEBCLAW_API_KEY=${WEBCLAW_API_KEY} + - WEBCLAW_CLOUD_API_KEY=${WEBCLAW_CLOUD_API_KEY} + - SERPER_API_KEY=${SERPER_API_KEY} + healthcheck: + test: + - CMD + - bash + - -c + - >- + exec 3<>/dev/tcp/127.0.0.1/3000 && + printf 'GET /health HTTP/1.0\r\nHost: localhost\r\n\r\n' >&3 && + grep -q '"status":"ok"' <&3 + interval: 30s + timeout: 5s + retries: 5 + start_period: 10s + labels: + createdBy: Apps + +networks: + 1panel-network: + external: true diff --git a/apps/webclaw/latest/scripts/init.sh b/apps/webclaw/latest/scripts/init.sh new file mode 100755 index 000000000..6e877466e --- /dev/null +++ b/apps/webclaw/latest/scripts/init.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/apps/webclaw/latest/scripts/uninstall.sh b/apps/webclaw/latest/scripts/uninstall.sh new file mode 100755 index 000000000..2a53d75f3 --- /dev/null +++ b/apps/webclaw/latest/scripts/uninstall.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +exit 0 diff --git a/apps/webclaw/latest/scripts/upgrade.sh b/apps/webclaw/latest/scripts/upgrade.sh new file mode 100755 index 000000000..2a53d75f3 --- /dev/null +++ b/apps/webclaw/latest/scripts/upgrade.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +exit 0 diff --git a/apps/webclaw/logo-LICENSE.txt b/apps/webclaw/logo-LICENSE.txt new file mode 100644 index 000000000..9cab41a43 --- /dev/null +++ b/apps/webclaw/logo-LICENSE.txt @@ -0,0 +1,7 @@ +Asset: logo.png +Source: https://github.com/0xMassi/webclaw/blob/50a17d27e504e558372528a4e6530ff09aee3537/.github/banner.png +Source SHA-256: 0658c42fc44438dfef3038627d347214198a58c39adf64c9b2ac7d36580665cb +Copyright: WebClaw contributors +License: GNU Affero General Public License v3.0 (AGPL-3.0) +License source: https://github.com/0xMassi/webclaw/blob/50a17d27e504e558372528a4e6530ff09aee3537/LICENSE +Modification: cropped the upstream banner to its mark, centered it on a square canvas, and resized it for the app catalog. diff --git a/apps/webclaw/logo.png b/apps/webclaw/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..321368c728d55c98412cd772294b653681e19fa4 GIT binary patch literal 9956 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 K%2Y#*gZ>Ye1A1}* literal 0 HcmV?d00001 diff --git a/apps/webclaw/v0.6.16/.env.sample b/apps/webclaw/v0.6.16/.env.sample new file mode 100644 index 000000000..3bccd9a0b --- /dev/null +++ b/apps/webclaw/v0.6.16/.env.sample @@ -0,0 +1,6 @@ +PANEL_APP_BIND_ADDRESS=0.0.0.0 +PANEL_APP_PORT_HTTP=40102 +WEBCLAW_API_KEY=replace-with-a-strong-random-api-token +WEBCLAW_CLOUD_API_KEY= +SERPER_API_KEY= +CONTAINER_NAME=1Panel-localwebclaw diff --git a/apps/webclaw/v0.6.16/data.yml b/apps/webclaw/v0.6.16/data.yml new file mode 100644 index 000000000..0361da5c2 --- /dev/null +++ b/apps/webclaw/v0.6.16/data.yml @@ -0,0 +1,85 @@ +additionalProperties: + formFields: + - default: 0.0.0.0 + edit: true + envKey: PANEL_APP_BIND_ADDRESS + labelEn: Bind Address + labelZh: 绑定地址 + label: + en: Bind Address + zh: 绑定地址 + zh-Hant: 綁定位址 + ja: バインドアドレス + ko: 바인드 주소 + ru: Адрес привязки + ms: Alamat ikatan + pt-br: Endereco de vinculacao + required: true + type: text + - default: 40102 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: HTTP Port + labelZh: HTTP 端口 + label: + en: HTTP Port + zh: HTTP 端口 + zh-Hant: HTTP 連接埠 + ja: HTTP ポート + ko: HTTP 포트 + ru: HTTP-порт + ms: Port HTTP + pt-br: Porta HTTP + required: true + rule: paramPort + type: number + - default: "" + edit: true + envKey: WEBCLAW_API_KEY + labelEn: API Token + labelZh: API Token + label: + en: API Token + zh: API Token + zh-Hant: API Token + ja: API トークン + ko: API 토큰 + ru: API-токен + ms: Token API + pt-br: Token da API + random: true + required: true + rule: paramComplexity + type: password + - default: "" + edit: true + envKey: WEBCLAW_CLOUD_API_KEY + labelEn: Cloud Fallback Key + labelZh: Cloud 回退密钥 + label: + en: Cloud Fallback Key + zh: Cloud 回退密钥 + zh-Hant: Cloud 備援金鑰 + ja: Cloud フォールバックキー + ko: Cloud 대체 키 + ru: Ключ резервного облачного сервиса + ms: Kunci sandaran Cloud + pt-br: Chave de fallback do Cloud + required: false + type: password + - default: "" + edit: true + envKey: SERPER_API_KEY + labelEn: Serper Search Key + labelZh: Serper 搜索密钥 + label: + en: Serper Search Key + zh: Serper 搜索密钥 + zh-Hant: Serper 搜尋金鑰 + ja: Serper 検索キー + ko: Serper 검색 키 + ru: Ключ поиска Serper + ms: Kunci carian Serper + pt-br: Chave de pesquisa Serper + required: false + type: password diff --git a/apps/webclaw/v0.6.16/docker-compose.yml b/apps/webclaw/v0.6.16/docker-compose.yml new file mode 100644 index 000000000..c5719ed67 --- /dev/null +++ b/apps/webclaw/v0.6.16/docker-compose.yml @@ -0,0 +1,44 @@ +services: + webclaw: + image: "ghcr.io/0xmassi/webclaw:v0.6.16@sha256:ac410944110b14d536225d2fef67b35d8b6f7338d158b00a6b06646a6c8c0ab3" + container_name: ${CONTAINER_NAME} + restart: unless-stopped + command: + - webclaw-server + user: "65534:65534" + read_only: true + tmpfs: + - /tmp:rw,nodev,noexec,nosuid,size=16m + cap_drop: + - ALL + security_opt: + - no-new-privileges:true + networks: + - 1panel-network + ports: + - "${PANEL_APP_BIND_ADDRESS}:${PANEL_APP_PORT_HTTP}:3000" + environment: + - WEBCLAW_HOST=0.0.0.0 + - WEBCLAW_PORT=3000 + - WEBCLAW_API_KEY=${WEBCLAW_API_KEY} + - WEBCLAW_CLOUD_API_KEY=${WEBCLAW_CLOUD_API_KEY} + - SERPER_API_KEY=${SERPER_API_KEY} + healthcheck: + test: + - CMD + - bash + - -c + - >- + exec 3<>/dev/tcp/127.0.0.1/3000 && + printf 'GET /health HTTP/1.0\r\nHost: localhost\r\n\r\n' >&3 && + grep -q '"status":"ok"' <&3 + interval: 30s + timeout: 5s + retries: 5 + start_period: 10s + labels: + createdBy: Apps + +networks: + 1panel-network: + external: true diff --git a/apps/webclaw/v0.6.16/scripts/init.sh b/apps/webclaw/v0.6.16/scripts/init.sh new file mode 100755 index 000000000..6e877466e --- /dev/null +++ b/apps/webclaw/v0.6.16/scripts/init.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/apps/webclaw/v0.6.16/scripts/uninstall.sh b/apps/webclaw/v0.6.16/scripts/uninstall.sh new file mode 100755 index 000000000..2a53d75f3 --- /dev/null +++ b/apps/webclaw/v0.6.16/scripts/uninstall.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +exit 0 diff --git a/apps/webclaw/v0.6.16/scripts/upgrade.sh b/apps/webclaw/v0.6.16/scripts/upgrade.sh new file mode 100755 index 000000000..2a53d75f3 --- /dev/null +++ b/apps/webclaw/v0.6.16/scripts/upgrade.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +exit 0