baronunread/rdyrct
GitHub: baronunread/rdyrct
一款完全运行在 Cloudflare Workers 边缘网络上的开源团队短链接与二维码管理工具,支持自定义域名、组织协作和订阅计费。
Stars: 13 | Forks: 1
# rdyrct
**基于组织的短链接 + 二维码工具,完全运行在 Cloudflare 边缘网络上。**
[](LICENSE)
[](https://workers.cloudflare.com)
[](https://bun.sh)
[](https://react.dev)
## 一键部署
[](https://deploy.workers.cloudflare.com/?url=https://github.com/baronunread/rdyrct)
这会从 Cloudflare 控制台配置 Worker,并可能提示您创建或选择 KV namespace 和 D1 数据库。您仍需将其 ID 粘贴到 `wrangler.jsonc` 中,设置下方的 secrets,配置 Polar,并将域名指向该 Worker;详情请参阅[部署到 Cloudflare Workers](#deploy-to-cloudflare-workers)。
## 功能
- **短链接**:支持自定义或随机 slug,可在重定向时应用可选的 UTM 参数(source、medium、campaign、term、content)。
- **二维码**:每个链接均可生成(付费计划),中心可选添加 logo,支持实时预览以及 PNG/SVG 格式下载。
- **自定义域名** (Pro):通过 Cloudflare for SaaS 连接 `links.yourbrand.com`,并按域名划分 slug 的 namespace。
- **组织**:具有 `owner` / `admin` / `member` 角色:admin 负责管理团队、域名和计费;member 负责管理链接。
- **Magic-link 邀请**:一次性使用,有效期 7 天,通过电子邮件发送。
- **隐私友好的分析**:每日点击量、热门链接、国家/地区、来源引荐、设备。绝不存储 IP 地址。
- **按用户的 Free/Hobby/Pro 计费**:通过 [Polar](https://polar.sh) 进行,该平台作为记录商户 (Merchant of Record) 并处理税务/VAT。
- **基于 Secret 的隐藏超级管理员控制台**:匹配 `SUPERADMIN_EMAIL` 的账户将获得用于查看使用量、深入查看组织和管理计划的云端控制台面板。其他所有人访问均会返回 404。
## 技术栈
rdyrct 是基于 Cloudflare 优先构建的:整个产品运行在单个 Worker 中,无需托管独立的后端:
- **Cloudflare Workers**:一个 Worker 即可提供 API、重定向热路径和静态 React 应用。
- **D1**:边缘网络上的 SQLite,作为 auth、组织、链接、点击量和域名的唯一事实来源。
- **KV**:用于重定向热路径上的 slug → 目标地址查找,确保点击无需等待 D1。
- **R2**:按组织存储二维码 logo 图片,以不可变方式提供并进行缓存。
- **Cloudflare for SaaS**:用于为 Pro 组织的自有短链接域名提供自定义主机名。
- **Workers Rate Limiting**:对 auth、电子邮件、写入、上传、域名、计费和点击记录分别进行滥用控制。
应用层:
- [Hono](https://hono.dev) 负责路由
- [BetterAuth](https://better-auth.com) 负责邮箱+密码身份验证,支持 email-OTP 验证和 PBKDF2/WebCrypto 哈希
- 基于 D1 的 [Drizzle ORM](https://orm.drizzle.team)
- React 19 + Vite + [`@cloudflare/vite-plugin`](https://github.com/cloudflare/workers-sdk)
- Tailwind v4 + [Base UI](https://base-ui.com)
- TanStack Query + React Router
- [Polar](https://polar.sh) 负责计费,[Resend](https://resend.com) 负责事务性电子邮件
## 本地开发
```
bun install
cp .dev.vars.example .dev.vars # then edit; at minimum set SUPERADMIN_EMAIL
bunx emulate --service resend # local Resend inbox on :4000
bun run db:migrate:local
bun run dev # https://rdyrct.localhost
```
- 使用您设置为 `SUPERADMIN_EMAIL` 的地址注册以解锁管理员控制台;任何其他地址均为普通用户。
- 新账户在限定于组织的页面上会看到创建组织的提示,直到他们创建了第一个组织。
- 电子邮件验证码通过 [emulate.dev](https://emulate.dev) 的 Resend 模拟器发送,而不是通过真实收件箱。读取方式:
curl localhost:4000/emails -H 'authorization: Bearer test_token_admin'
并从最新消息中复制 6 位数字的验证码。
- 设置 `CF_DEV_ENV=1`(`.dev.vars.example` 中的默认值)会在本地存根 Cloudflare 自定义主机名 API:DNS 将在大约 5 秒后准备就绪,TLS 在大约 20 秒后准备就绪,因此无需真实 zone,“检查状态”即可显示相同的进度。若不设置此项,缺失 `CF_API_TOKEN` / `CF_ZONE_ID` 将直接判定失败,而不会伪造响应。
- 针对真实的 [Polar sandbox](https://sandbox.polar.sh) 账户进行计费需要一个公开 URL(`wrangler dev --remote` 或隧道),以便 webhooks 能够访问 `/api/webhooks/polar`。
## 测试
```
bun run test # fast unit tests
bun run test:worker # Worker routes with local D1 and KV bindings
bun run e2e:install # install Chromium for Playwright once
bun run e2e:smoke # real-browser baseline regression checks
bun run verify # types, lint, formatting, unit, and Worker tests
```
Playwright 负责管理本地服务器的生命周期,并且绝不会重置或植入
本地 Cloudflare 状态。失败的浏览器测试会在
`test-results/` 中保留屏幕截图和 trace。
## 部署到 Cloudflare Workers
倾向于手动操作,或者需要在上方的按钮点击后重新部署?请创建以下资源:
```
bunx wrangler kv namespace create LINKS
bunx wrangler d1 create rdyrct
bunx wrangler r2 bucket create rdyrct-qr-logos
```
将返回的 ID 粘贴到 `wrangler.jsonc` 中:
- `kv_namespaces[0].id`
- `d1_databases[0].database_id`
在 `wrangler.jsonc` 中填写非机密变量:
- `APP_URL=https://rdyrct.com`
- `APP_HOST=rdyrct.com`
- `MAIL_FROM=rdyrct 标签:React, Syscalls, 二维码, 团队协作, 短链接, 程序员工具, 网站分析, 自动化攻击