
Relaynet 开源中继发布,让浏览器标签页获得真实网络连接
来源标题:Show HN: Relaynet – open-source relay that gives browser tabs a real network
开源项目 Relaynet 发布,通过 WebSocket 转发以太网帧,让自带 TCP/IP 栈的客户端(如浏览器虚拟机)获得 IPv4 TCP/UDP 联网能力。项目提供托管中继服务 relaynet.network,并支持用 docker compose 自托管,无需配置或第三方账户。同一账户的会话共享一个私有网络。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
https://relaynet.network 上有一个托管的多用户网络中继(中继端点 wss://relay.relaynet.network)。自带 TCP/IP 协议栈的客户端(浏览器虚拟机,或用于 SSH、USB/IP、调试和自定义协议的用户态协议栈)通过 WebSocket 发送以太网帧,从而获得访问互联网的 IPv4 TCP 和 UDP 能力;同一账号的会话共享一个私有网络。文档页面(web/docs/docs.md)列出了使用场景,以及何时应改用其他方案。 git clone https://github.com/beriberikix/relaynet cd relaynet && docker compose up 然后打开 http://localhost 并创建账号(或以 admin 身份登录,密码会在 docker compose logs relay 中打印一次);运营面板位于 http://127.0.0.1:8001。无需任何配置或第三方账号。compose.yaml 列出了可选设置:用于 HTTPS 的域名、通过任意 OpenID Connect 提供商实现单点登录、S3 备份。指南位于 docs/self-hosting/:快速开始、单服务器、单点登录,以及 relaynet.network 本身是如何部署的。 中继行为变更请提交到 fork,其他所有内容提交到这里(CONTRIBUTING.md)。会进入 fork 的工作所对应的问题在本仓库中用 repo:fork 标签跟踪。 compose.yaml 快速开始:中继和站点在同一台机器上 deploy/ 站点的容器(Caddy),用于 compose 和其他主机 relay/ 中继进程的容器镜像 + Fly.io 配置 web/ 浏览器前端(Cloudflare Worker、静态资源) client/ relaynet.js,可重连的客户端辅助库(npm: relaynet) infra/ 运营工具(探针、负载测试、Grafana、法律页面)以及 Cloudflare、Auth0 和运营访问的设置说明 docs/ 自托管指南、设计说明、安全审计和威胁模型 升级中继的方式是修改 relay/package.json 中的 tarball 版本,并在该目录运行 npm install 以刷新 lockfile。 推送到 main 且会改动任一镜像的提交会将它们发布到 GitHub 的容器注册表,并附带构建来源证明(publish-images.yml):ghcr.io/beriberikix/relaynet-relay(以 rootlessRelay 版本打标签)和 ghcr.io/beriberikix/relaynet-web。 围绕固定版本的中继有三个可部署组件。自托管时,它们运行在同一个源上。在 relaynet.network 上,它们分散在 Cloudflare 和 Fly.io 上。infra/ 存放从外部驱动这些组件的运营工具:探针、负载生成器、Grafana 配置和法律页面生成器。 client: ./client/README.md - relaynet npm 包(MIT):connectRelay / RelayConnection,一个可重连的 relay.v1 传输层,带心跳、退避和关闭分类。 deploy: ./deploy/README.md - Docker compose 自托管资源:relaynet-web 的 Caddy 镜像(./deploy/caddy/README.md)以及 compose-check.sh,即 compose 快速开始的端到端冒烟测试。 infra: ./infra/README.md - 运营工具:Grafana 告警和仪表盘、法律页面构建、负载生成器、CLI 探针及其 Cloudflare Worker 版本、预发布运营脚本、Fly 日志转发器配置。 relay: ./relay/README.md - 中继容器镜像、Litestream 备份、Fly.io 生产与预发布配置。它本身没有中继代码。 web: ./web/README.md - relaynet.network 的 Cloudflare Worker(静态资源)和仪表盘 app.js;文档源文件和生成器在 ./web/docs/README.md。 docs/: 设计说明、安全审计和威胁模型,以及自托管指南。仅包含文字,因此没有契约。 全局不变量 中继是固定依赖(relay/package.json)。本仓库只通过升级版本改动它,绝不打补丁。 每次部署只有一台中继机器:会话和 IP 池都在内存中(relay/fly.toml,fly deploy --ha=false)。 令牌仅以 relay.token.<token> WebSocket 子协议或 /api/* 上的 Authorization: Bearer 形式传输。client/relaynet.js 拒绝通过 ws:// 向非回环主机发送令牌。 站点的非 CSP 安全响应头在 web/public/_headers(Cloudflare)和 deploy/caddy/Caddyfile 中手工重复维护。Caddy 的 CSP 由 deploy/caddy/entrypoint.sh 根据环境生成,并且有意与 _headers 不同。 web/public/ 中由 Markdown 生成的文件(docs.html、docs.md、llms.txt、terms.html、acceptable-use.html、privacy.html)绝不手工编辑。请编辑 web/docs/docs.md 或 infra/legal/.md 并重新构建。 infra/probe/probe.mjs 和 infra/probe-worker/src/index.ts 运行相同的端到端检查(连接、DHCP、DNS),必须保持同步。 基础镜像和下载的二进制文件通过 digest 或 checksum 固定(relay/Dockerfile、deploy/caddy/Dockerfile、infra/log-shipper/fly.toml)。 全局副作用 中继的 SQLite 数据库位于 /data 卷上,启用 Litestream 时会复制到 S3 兼容存储(relaynet.network 上为 Cloudflare R2)。 代表中继会话进行出站互联网访问(IPv4 TCP/UDP)。探针和负载生成器会通过它产生真实的 DNS 和 HTTP 出站流量。 来自 GitHub Actions 的部署:Fly.io(中继,先预发布;日志转发器)、Cloudflare Workers(站点、探针 worker)、npm(client/)、GHCR(relaynet-relay 和 relaynet-web 镜像)。 relay-rollback.yml 可手动重新部署较早的中继镜像;schema 迁移不会被回滚。 GitHub Actions 读取的生产数据:backup-restore-check.yml(每周)和 migration-rehearsal.yml(手动)使用只读密钥从 R2 将生产副本恢复到 runner 上。两者都不会写回;每周检查失败会开一个 issue。 监控:Grafana Cloud 告警和仪表盘(infra/grafana/provision.py),来自探针 worker 和手动 relay-probe.yml 运行的 Better Stack 心跳。 站点上的浏览器存储:localStorage(选中的 org、OIDC 用户存储)和 sessionStorage(中继会话、待处理邀请)。 系统验证 没有根构建。从仓库根目录运行 CI 所运行的内容(.github/workflows/ci.yml): (cd client && npm test) for f in web/public/.js; do node --check "$f"; done python3 web/docs/build.py && git diff --exit-code -- web/public docker compose up -d --build --wait --wait-timeout 180 && deploy/compose-check.sh
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。