kernel/kernel-images

GitHub: kernel/kernel-images

Kernel 提供沙盒化的云端浏览器服务,解决自动化工作流和 Web 代理的浏览器环境管理与监控问题。

Stars: 873 | Forks: 65

Kernel Logo

GitHub License Discord Follow @juecd__ Follow @rfgarcia

## 什么是 Kernel? Kernel 为浏览器自动化和网络代理提供了沙盒化、开箱即用的 Chrome 浏览器。此代码库为我们[托管的浏览器基础设施服务](https://kernel.sh/docs)提供支持。 [在此处注册](https://www.kernel.sh/)! ## 主要功能 - 沙盒化的 Chrome 浏览器,支持基于 Chrome DevTools 的浏览器框架(Playwright、Puppeteer)进行连接 - 远程 GUI 访问(实时视图流),用于可视化监控和远程控制 - 可配置的实时视图设置(只读视图、浏览器窗口尺寸) - 可控的浏览器会话视频回放 ## 你可以用它做什么 - 运行基于浏览器的自动化工作流 - 开发和测试使用浏览器的 AI 代理 - 构建需要受控浏览器环境的自定义工具 ## 实现方式 此镜像可用于在 Docker 容器中运行带图形界面的 Chromium,或与 Unikraft unikernels 一起使用。unikernel 实现基于基础 Docker 镜像构建,并额外具有在 unikernel 上运行的优势: - 无网络活动时自动进入待机/"睡眠模式"(在此模式下消耗可忽略的资源) - 进入待机模式时,unikernel 的状态会被快照,并且可以完全恢复到进入睡眠前的状态。如果你想重用会话的状态(浏览器认证 cookie、与本地文件的交互、浏览器设置,甚至是你当时所在的精确页面和窗口缩放级别),这可能很有用。 - 极快的冷重启速度(<20ms),这可能适用于任何需要超低延迟事件处理程序的应用程序。 ## 演示 https://github.com/user-attachments/assets/5888e823-5867-4c01-ad67-ec8989ba9573 ## 在 Docker 中运行 你可以直接构建并运行 Dockerfile 作为 Docker 容器。 ``` cd images/chromium-headful IMAGE=kernel-docker ./build-docker.sh IMAGE=kernel-docker ENABLE_WEBRTC=true ./run-docker.sh ``` ## 在 Unikernel 上运行 或者,你可以在 Unikraft unikernel 上运行浏览器。 ### 1. 安装 Kraft CLI `curl -sSfL https://get.kraftkit.sh | sh` ### 2. 向 CLI 添加 Unikraft 密钥 `export UKC_METRO=` `export UKC_TOKEN=` ### 3. 构建镜像 `IMAGE=YOUR_UKC_USERNAME/chromium-headless-test:latest images/chromium-headless/build-unikernel.sh` ### 4. 运行 `IMAGE=YOUR_UKC_USERNAME/chromium-headless-test:latest images/chromium-headless/run-unikernel.sh` 或 `IMAGE=YOUR_UKC_USERNAME/chromium-headful-test:latest VOLIMPORT_PREFIX=official images/chromium-headful/run-unikernel.sh` 当部署成功完成后,Kraft CLI 将输出类似以下内容: ``` Deployed successfully! │ ├───────── name: kernel-cu ├───────── uuid: 0cddb958... ├──────── metro: ├──────── state: starting ├─────── domain: https://.kraft.host ├──────── image: onkernel/kernel-cu@sha256:8265f3f188... ├─────── memory: 8192 MiB ├────── service: ├─ private fqdn: ├─── private ip: └───────── args: /wrapper ``` ### Unikernel 注意事项 - 该镜像至少需要 8GB 内存。 - 要部署启用了 WebRTC 桌面流媒体(而非 noVNC)的实现:`ENABLE_WEBRTC=true NEKO_ICESERVERS=xxx ./run-unikernel.sh` - 部署到 Unikraft Cloud 时,当 `ENABLE_WEBRTC=true` 时需要使用 [TURN 服务器](https://webrtc.org/getting-started/turn-server),因为目前不支持直接暴露 UDP 端口。`NEKO_ICESERVERS`:描述了 ICEAgent 可以用来与对端建立连接的多个 STUN 和 TURN 服务器。例如:`[{"urls": ["turn:turn.example.com:19302", "stun:stun.example.com:19302"], "username": "name", "credential": "password"}, {"urls": ["stun:stun.example2.com:19302"]}]`。 - 各种服务(mutter, tint)需要几秒钟启动。一旦启动,待机和重启速度极快。 - Unikraft 部署会生成一个 URL。此 URL 是公开的,意味着_任何_拥有该 URL 的人都可以访问远程 GUI。请仅将其用于非敏感的浏览器交互,并在使用完毕后删除 unikernel 实例。 - 你可以调用 `browser.close()` 来断开与浏览器的连接,unikernel 将在网络活动结束后进入待机状态。然后你可以使用 CDP 重新连接到该实例。`browser.close()` 会结束 websocket 连接,但实际上并不会关闭浏览器。 - 可以使用变量 `VCPUS=8` 调整 VCPUS 值。 ## 通过 Chrome DevTools Protocol 连接到浏览器 端口 `9222` 通过 `ncat` 暴露,允许你连接基于 Chrome DevTools Protocol 的浏览器框架,如 Playwright 和 Puppeteer(以及基于 CDP 的 SDK,如 Browser Use)。你可以使用这些框架在云端驱动浏览器。你也可以断开与浏览器的连接并重新连接。 首先,获取浏览器的 CDP websocket 端点: ``` const url = new URL("http://localhost:9222/json/version"); const response = await fetch(url, { headers: { "Host": "" // Required if using a unikernel } }); if (response.status !== 200) { throw new Error( `Failed to retrieve browser instance: ${ response.statusText } ${await response.text()}` ); } // webSocketDebuggerUrl should look like: // ws:///devtools/browser/06acd5ef-9961-431d-b6a0-86b99734f816 const { webSocketDebuggerUrl } = await response.json(); ``` 然后,将远程的 Playwright 或 Puppeteer 客户端连接到它: ``` // Puppeteer const browser = await puppeteer.connect({ browserWSEndpoint: webSocketDebuggerUrl, }); // Playwright const browser = await chromium.connectOverCDP(webSocketDebuggerUrl); ``` ## 浏览器远程 GUI / 实时视图 你可以使用嵌入的实时视图来监控和控制浏览器。实时视图支持对浏览器的读写访问。两者都映射到端口 `443`。 - NoVNC:一个 VNC 客户端。支持读写。在 `./run-docker.sh` 中设置 `ENABLE_WEBRTC=false`。 - WebRTC:一个基于 WebRTC 的客户端。支持读写、窗口调整大小以及复制粘贴。它比 VNC 快得多。当设置 `ENABLE_WEBRTC=true` 时可用。 ### 备注 - WebRTC 实现中的音频流目前无法正常工作,需要修复。 - 实时视图默认是读写模式。你可以在 `docker run` 中添加 `-e ENABLE_READONLY_VIEW=true \` 来将其设置为只读。 ## 回放捕获 你可以使用嵌入的录制服务器在我们的带图形界面镜像中捕获整个屏幕的录制。它一次允许一个录制,可以通过 `WITH_KERNEL_IMAGES_API=true` 启用。 例如: ``` cd images/chromium-headful export IMAGE=kernel-docker ./build-docker.sh WITH_KERNEL_IMAGES_API=true ENABLE_WEBRTC=true ./run-docker.sh # 开始新录制 curl http://localhost:10001/recording/start -d {} # 录制进行中 - 运行代理 # 停止录制 curl http://localhost:10001/recording/stop -d {} # 下载录制文件 curl http://localhost:10001/recording/download --output recording.mp4 ``` 注意:录制文件被编码为 H.264/MPEG-4 AVC 视频文件。[QuickTime 在播放方面存在已知问题](https://discussions.apple.com/thread/254851789?sortBy=rank),请确保使用兼容的媒体播放器! ## 文档 此代码库为我们[托管的浏览器基础设施](https://kernel.sh/docs)提供支持。 ## 贡献 请在提交拉取请求或问题之前阅读我们的[贡献指南](./CONTRIBUTING.md)。 ## 许可证 详情请参阅 [LICENSE](./LICENSE) 文件。 ## 支持 如有问题、疑问或反馈,请在此仓库中[提交 issue](https://github.com/kernel/kernel-images/issues)。你也可以加入我们的 [Discord](https://discord.gg/FBrveQRcud)。 ## 致谢 - 我们的 WebRTC 实现改编自 [Neko](https://github.com/m1k1o/neko)。 - 感谢 [xonkernel](https://github.com/xonkernel) 领导开发了我们的 WebRTC 实时视图。 - 感谢 [Unikraft Cloud](https://unikraft.cloud/) 团队在 unikernel 方面提供的帮助。 由 [Kernel 团队](https://www.kernel.sh) 使用 ❤️ 制作。
标签:AI代理开发, Chrome DevTools, DevOps工具, Docker容器化, EVTX分析, Playwright集成, Puppeteer集成, Unikraft虚拟化, 云端浏览器, 受控浏览器环境, 安全合规, 沙盒浏览器, 测试自动化, 浏览器会话管理, 浏览器即服务, 浏览器自动化, 特征检测, 网络代理, 视频录制与回放, 请求拦截, 远程浏览器访问