banner
约 2,100 字
7 分钟

用GitHub和Cloudflar免费搭建一个自己的短链系统

-
-
无标签

摘要

本文介绍了一款基于 GitHub + Cloudflare 免费搭建的开源短链系统 Sink。该系统具备网址缩短、点击统计、自定义短码、AI 生成短码及设备路由等功能,部署在 Cloudflare 边缘网络,数据完全私有。文章详细讲解了部署流程,包括 Fork 代码、配置环境变量、绑定 KV 和 Analytics Engine、添加 nodejs_compat 兼容性标志及绑定自定义域名。相比第三方服务,自建短链数据归属权更安全可控,适合长期运营使用。

前言

发链接的时候,尤其在一些有字数限制或会自动吞超长链接的第三方平台,长长的 URL 经常发不全、甚至干脆被折叠吞掉。短链接就是解决这个问题的好办法。

最近发现一个用 GitHub + Cloudflare 免费搭建短链系统的开源项目 Sink:它不仅能把你的网址压缩到最短,还自带了统计后台,可以看每个链接的点击量、来源、设备分布等,部署还特别简单(全程不花一分钱服务器费)。

项目特色

Sink 的功能相当全:

  • 🔗 网址缩短:把长网址压缩到尽量短

  • 📈 分析:监控链接,收集点击、来源等统计

  • ☁️ 无服务器:跑在 Cloudflare Workers/Pages 上,无需传统服务器

  • 🎨 可定制 Slug:支持个性化短码,且大小写敏感

  • 🪄 AI Slug:调用 Workers AI 帮你自动生成好记的短码

  • ⏰ 链接过期:可为链接设定有效期

  • 📱 设备路由:把 iOS / Android 用户分别重定向到不同地址(比如 App Store 链接)

  • 🖼️ OpenGraph 预览:自定义分享时的标题、描述、配图

  • 📊 实时分析:带实时 3D 地球仪可视化和事件日志

  • 🔲 二维码:一键生成短链对应的二维码

  • 📦 导入导出:支持 JSON / CSV 批量迁移

  • 🌍 多语言:后台界面支持 i18n

  • 🌙 暗黑模式:亮色 / 暗色 / 跟随系统

先搞清楚它是怎么工作的

部署之前值得花两分钟理解这套架构,后面遇到问题时你才知道该往哪查。

Sink 运行在 Cloudflare 的边缘网络上,整条链路是这样的:

  1. 你在后台创建一条短链,长网址和短码的对应关系写进 KV(键值存储)

  2. 别人访问 你的域名/短码

  3. Cloudflare 的 Pages Functions 收到请求 → 查 KV 拿到目标网址 → 返回一个跳转响应

  4. 同时把"有人点了这条链接"这个事件写进 Analytics Engine(分析引擎)

  5. 你在后台看到的点击量、来源、设备分布,都是从 Analytics Engine 里读出来的统计数据

看明白这条链路,几个结论就顺理成章了:

  • 数据完全在你自己的 Cloudflare 账号里,没有第三方平台能看到你的链接去向——这是自建短链最核心的价值

  • 统计功能依赖 Analytics Engine,所以那个绑定漏配,链接能跳转但后台一片空白(这也是网上旧教程最常见的翻车点)

  • 一旦你的 CF 账号或域名出问题,所有短链同时失效。这是自建短链的固有代价,后面会专门讲怎么降低风险

部署方法

整体思路是:Fork 项目 → Cloudflare Pages 导入构建 → 配好环境变量、KV/AI 绑定 → 绑定域名

  1. 打开项目 GitHub 地址,把代码 Fork 到自己账号下。项目地址:https://github.com/miantiao-me/Sink

4f0df016df1901fa.png
  1. 登录 Cloudflare,进任意域名的页面,在**右下角复制你的 **Cloudflare 账号 ID,然后点击旁边的获取 API 令牌

8223b8fc5d9e9550.png
  1. 创建 API 令牌:模板选择读取分析数据和日志(Sink 的统计功能要用它读 Cloudflare 的分析数据)。

65709e71483dfa72.png

创建成功后即可看到令牌值,注意它只显示这一次,务必立刻复制保存好。

523b77d7d1558b4c.png

关于这个令牌的安全性:这里选的是"读取分析数据和日志"模板,只给了只读权限——这是对的。千万别图省事用 Global API Key 或者"编辑所有资源"的令牌,那等于把自己账号的完全控制权交出去。令牌一旦泄露,别人可以读你在 Cloudflare 上的全部分析数据。怀疑泄露就去 API 令牌页面直接撤销重发,不用改密码。

  1. 进入 Cloudflare 的Workers 和 Pages,点击创建应用程序

d6b5db1954c70ec0.png
  1. 点击最下方的开始使用,创建 Pages 项目。

b93b04f317d11f2e.png
  1. 导入自己 GitHub 的 Git 存储,选择刚 Fork 的那个项目。

f8fef8d8132ac99e.png
  1. **框架预设选择 **Nuxt.js(Sink 是基于 Nuxt 的)。

15ff73549d827bbe.png
  1. 环境变量里添加以下三个值:

纯文本
NUXT_SITE_TOKEN = 至少8位的密码,英文数字组合
NUXT_CF_ACCOUNT_ID = Cloudflare的账号ID
NUXT_CF_API_TOKEN = 刚才创建API令牌

NUXT_SITE_TOKEN 是访问后台的管理密码,务必设一个足够强的。

a1eba351142f7bbb.png

这个密码的强度比你想的更重要:它保护的是你全部短链的创建、修改和删除权限。拿到它的人可以把你所有短链的目标改成钓鱼站——而短链天然"看不出真实去向"的特性,会让这种篡改很难被用户发现。建议用密码管理器生成随机字符串,别用"admin123"这类。

  1. 保存并部署。第一次部署通常会失败(缺少运行时配置),属正常现象,选择继续部署即可。

91a9e517c6a02d99.png
  1. 返回 Sink 项目页,进入设置 → 兼容性标志,填写 nodejs_compat(让 Cloudflare 运行时支持 Node 兼容 API)。

e472f513b2f10d9c.png

为什么必须加这一项? Cloudflare 的 Worker 运行时不是 Node.js,而是一个基于 V8 的轻量运行时(Workers Runtime)。很多 Node 内置模块(比如 cryptobufferstream)在里面默认不存在,而 Nuxt 这类框架的构建产物会直接用到它们。nodejs_compat 这个兼容性标志,就是让运行时去模拟这些 Node API。不加,页面就报错——这也是"第一次部署失败"的根本原因。

  1. 再次重新部署,这次就能成功了。

f6f9aba8b300acad.png
  1. 创建 KV 存储:Cloudflare 里选Workers KV,创建一个名为 sink 的命名空间(短链数据存这里)。

649e6a597f18ffdc.png
  1. 绑定 KV、AI 和 Analytics Engine,回到项目设置逐一添加:

  • KV 命名空间绑定,名称 KV → 绑定到 sink

  • Workers AI 绑定,名称 AI → 绑定 Workers AI 目录(用于 AI Slug)

  • Analytics Engine 绑定,名称 ANALYTICS → 绑定到 sink(用于统计)

0b96227ac4648c33.png

这三个绑定的变量名必须完全一致KV / AI / ANALYTICS,大小写敏感)。代码里是按这个名字去取的,写错一个字母,对应功能就静默失效——不报错、就是不工作。这类问题最费时间,建议配完对着截图核一遍。

  1. 添加自定义域名,让短链跑在你自己的域名下。

f84343537018abd0.png
  1. 重新部署后,即可通过自定义域名打开后台。

0fe154d3e6057e5e.png

为什么强烈建议绑自定义域名? 两个原因。一是观感与信任xxx.pages.dev 这类域名在微信、QQ 等平台里较容易被判定为风险域名而拦截,你自己长期使用的域名信任度更高。二是可迁移性:域名是你的,将来想换部署平台,改一下 DNS 指向就行,已经发出去的短链继续有效;用平台自带域名的话,换平台等于所有链接失效。

使用

  1. 登录后台,创建短链接:粘贴长网址、填自定义短码即可。

d212194ca84c65fb.png
  1. 既能生成短链,也能直接生成对应的二维码,方便放海报或线下物料。

969059f306d9514c.png
  1. 后台可以查看每个链接的分析数据(点击量、趋势等)。

3e53c538158dd0f8.png
  1. 还有实时访客记录,能看到刚才谁点了哪个链接。

c33dbb753e288192.png

顺手一个实用知识点:短链的跳转用的是 302(临时重定向),不是 301(永久重定向)。这不是实现偷懒,而是刻意设计——302 表示"临时跳转",浏览器和搜索引擎不会长期缓存这个映射,所以你随时能改短链指向的目标。如果用了 301,浏览器会记住第一次的跳转目标,你后台改了也没用,用户那边还往旧地址跑。做短链服务的都必须是 302。

自建短链 vs 第三方短链服务

自建(Sink)

第三方(bit.ly 等)

费用

免费(CF 免费额度内)

免费档有限制,高级功能付费

数据归属

完全在你自己的账号

在服务商手里

域名

自己的域名,可迁移

服务商的域名

稳定性

取决于你自己的账号/域名

取决于服务商是否跑路

上手成本

需要跟着教程部署一遍

注册即用

我的判断是:偶尔发几条链接,第三方够用;如果你在运营内容,需要长期稳定、可信的短链(比如放在公众号、视频简介里),自建更划算——尤其是"域名可控"这一条,决定了你将来能不能平滑迁移。

结尾

其实这个项目挺早之前就有了,但按网上旧教程部署后,统计功能总是不正常(多半是 KV / Analytics Engine 绑定或兼容性标志没配全)。这次我参考官方视频重新整理了一遍部署步骤,统计功能可以正常使用了,需要的朋友照上面的流程走一遍基本就能跑通。

如果你正需要自建短链、又不想花钱买域名服务或短链 SaaS,Sink 这套全免费方案值得一试——数据完全在你自己的 Cloudflare 账户里,不受第三方平台限制。

常见问题

Q:链接能跳转,但后台看不到任何统计数据?

基本可以断定是 Analytics Engine 没绑或绑错名。检查"Workers 和 Pages → 你的项目 → 设置 → 函数 → Analytics Engine 绑定",变量名必须是 ANALYTICS,并指向名为 sink 的数据集。改完记得重新部署。

Q:AI Slug 功能没反应?

先确认 Workers AI 绑定(变量名 AI)是否配好。另外 Workers AI 的免费额度是按 Neurons 计的,个人用量完全够,但如果你账号里还有别的服务在大量调用 AI,可能会撞上配额。

Q:短码为什么区分大小写?

Sink 支持大小写敏感的短码,好处是同样的字母能组合出更多短码AbCabc 是两个不同链接)。代价是你自己得记清楚——建议重要链接统一用小写,避免发出去之后自己也分不清。

Q:部署后想换域名,老短链还能用吗?

分两种情况:如果只是在同一个域名下换部署方式,链接不变;如果是换域名,老链接就失效了。所以最好的做法是一开始就用你自己的域名,后续迁移都靠改 DNS 指向完成,短链本身不动。

Q:免费额度够用吗?

短链的请求量很小(一次跳转一次请求),Cloudflare 每天 10 万次 Workers 请求的免费额度,对个人来说基本用不完。真正要留意的是 KV 的每日写入次数——但短链是"创建时写一次、被点时只读",写入量极小,属于这套免费方案里最省额度的一类应用。

END

相关文章

暂无相关文章