Chhoto URL 是用 Rust 写就的极致自托管短链服务,Docker 镜像压缩后仅 6MB、运行内存不到 5MB。支持自定义短链、自动过期、QR 码生成、JSON-RPC API 接口,移动端友好 UI 加深色模式,零追踪零 Cookie 的极简设计哲学,Docker 一行命令即可部署上线。

🎤 引言

自托管短链工具这么多,为什么偏偏推荐这个 913 Stars 的小项目?

因为它太轻了 —— Docker 镜像压缩后 <6MB,运行内存 <5MB,单二进制 Rust 构建,用 SQLite 存数据。整个项目作者明确表态:"我看这玩意儿做完了,不打算加新功能,只修 bug"。这种"极简主义"在臃肿成风的开源圈属实清流。

名字 Chhoto 来自孟加拉语 ছোট = "小"。合起来就是 Small URL。作者 SinTan1729 用它替代同类 Java 写的 ~200MB 镜像,用 Rust 重写后砍了 97% 体积。

今天聊聊这个轻量得让人感动的短链服务。


⭐ 核心功能

1. 短链生成与重定向

最基础也是最重要的功能 —— 把长链接压成短链接。打开短链直接 302 跳到原 URL,没有中间广告页、没有强制等待(某些商业短链的尿性)。

2. 自定义短链 + 自动过期

  • 用户可以指定短链后缀(比如 mysite.com/ref-vip),不是每家短链都支持这功能
  • 可设置过期时间,过期后访问自动 404
  • 短链创建后可编辑长链目标、加备注

3. 隐私优先的点击统计

只记录"点了几次",不记录 IP、不记录 UA、不写 Cookie。不像某些短链服务,访问一次给你来个用户画像。这点作者明确写在 README 的"Bloat that will not be implemented"。

4. QR 码生成

每个短链一键生成 QR 码,分享到微信群、印刷品、海报都方便。

5. 完整的 JSON-RPC API

不只有 Web UI,还提供 API 给自动化工具调用:

  • POST /api/shorten 创建短链
  • POST /api/expand 还原长链
  • 支持 API Key + Hashed Password 鉴权

6. 公共模式 + 完全隐藏前端

支持两种部署姿态:

  • 私有模式:必须登录才能创建短链
  • 公共模式:任何人可创建短链,但删除/列表需要管理员密码
  • 还可彻底禁用前端,只跑 API 服务

7. 自定义落地页

如果不想直接重定向,可以配置一个 HTML 落地页(类似"您即将访问..."的中转页面),适合营销场景。


📥 安装使用

方式一:Docker Compose(强烈推荐)

新建 compose.yml

services:
  chhoto-url:
    container_name: chhoto-url
    image: sintan1729/chhoto-url
    restart: unless-stopped
    ports:
      - 4567:4567
    volumes:
      - ./database:/database
      - ./html:/html
    environment:
      - CHHOTO_URL=https://s.yourdomain.com
      - CHHOTO_PASS=yourStrongPassword
      - CHHOTO_PORT=4567
      - CHHOTO_USE_HTTPS=true
      - CHHOTO_SLUG_STYLE=UID
      - CHHOTO_SLUG_LENGTH=8
      - CHHOTO_PUBLIC_MODE=false
      - CHHOTO_DISABLE_FRONTEND=false
      - CHHOTO_SQLITE_USE_WAL_MODE=true

启动:

docker compose up -d

浏览器打开 http://your-ip:4567 即可使用。

方式二:Docker CLI

docker run -d \
  --name chhoto-url \
  --restart unless-stopped \
  -p 4567:4567 \
  -v ./database:/database \
  -v ./html:/html \
  -e CHHOTO_PASS=yourStrongPassword \
  sintan1729/chhoto-url

方式三:直接编译(Rust 工具链)

git clone https://github.com/SinTan1729/chhoto-url.git
cd chhoto-url
cargo build --release
./target/release/chhoto-url

编译产物就是单个二进制,扔到任何 Linux/Windows/macOS 机器都能跑。

前置准备

  • Docker 或 Rust 1.75+ 工具链
  • 一个反向代理(Caddy / Nginx)做 HTTPS(强烈建议,README 作者也强调)
  • 端口 4567 可用

官方推荐配置(HS512 passkey + UID 长度 16):

environment:
  - CHHOTO_PASS=改成你的密码
  - CHHOTO_SLUG_STYLE=UID
  - CHHOTO_SLUG_LENGTH=16  # 想跑上万个短链就调大

记得看完 INSTALLATION.md,WAL mode 强烈建议开,能大幅减少数据库卡顿。


🎯 适用场景

  • 个人博客/作品的短链:把公众号、知乎、B站、GitHub 链接统一成自己域名的短链分享
  • 技术文档中的长 URL:写文档时插入 https://yourdomain.com/api-doc 比贴 200 字符的链接清爽
  • 微信群/QQ群推广:微信会拦截部分长链,短链跳转更安全
  • 营销活动临时链接:设个过期时间,活动结束自动失效,省得后台清理
  • 极客的玩具/家庭实验室:跑在树莓派上都不成问题,资源占用忽略不计
  • API 调用者:需要给爬虫、CI/CD 用的批量短链生成工具

🔍 对比/替代方案

项目镜像大小内存语言特点
Chhoto URL6MB<5MBRust极简、无追踪、Docker 易部署
YOURLS~50MB~50MBPHP老牌、自托管经典、需要 PHP+MySQL
Shlink~100MB+~50MBPHP/Rust 部分功能丰富(QR、标签、统计)、有 Docker
Kutt~150MB~100MBNode.js现代 UI、需 PostgreSQL/Redis
Polr~80MB~30MBPHP/Lumen简单,但开发停滞
UrlShortener (simply-shorten)~200MB~100MBJavaChhoto 作者参考的原始项目,被嫌太重

如果追求"装好就用、零追踪、低资源",Chhoto URL 是最舒服的选择。如果需要复杂的权限管理、团队协作、点击画像,请上 YOURLS / Shlink。


⚠️ 注意事项

  1. 必须 HTTPS:内置 HTTP 模式没有 TLS 加密,密码 API Key 都会裸传。生产环境一定要套 Caddy/Nginx 反代。
  2. 公共模式的边界:设为 CHHOTO_PUBLIC_MODE=true 后,任何人可创建短链。你无法控制他们发布什么内容,短链服务可能被用来发违规链接(和你域名关联),需要自己审核或干脆关掉。
  3. 短链长度限制:默认 8 字符 UID 模式下,约能生成 ~280 万个独立短链。如果你要存几十万条链接,把 CHHOTO_SLUG_LENGTH 调到 16 以上,否则可能撞库。
  4. 数据库备份:SQLite 单文件,建议每天 cp database.db backup/。虽然有 WAL 模式降低损坏风险,但硬盘爆了、神仙难救。
  5. API Key 安全:JSON-RPC API 鉴权用的密码虽然支持 hash 存储,但默认是明文在环境变量里。生产环境建议改成 Docker secrets 或 k8s Secret。
  6. 功能锁定:作者明确不打算加新功能。如果你的需求超出"创建+跳转+统计+过期"四件套,这项目就不适合你。
  7. 二次开发难度:作者单方面维护,二次开发需要 fork 自行维护。PR 接受度未知。

✅ 总结

Chhoto URL 是个"做完了就躺平"的少见项目。Rust 写就、6MB 镜像、5MB 内存、SQLite 存储、零追踪零 Cookie、JSON-RPC API、Docker 一键起 —— 对"轻量自托管"的需求来说几乎是终极答案。

它不是给企业团队用的,给极客、个人开发者、小团队、个人博客作者用的。装好扔 VPS 上能用好几年,不管维护。

适合人群:极客、个人博客作者、自托管爱好者、追求轻量的运维人员。
不适合人群:企业团队、需要复杂权限/审计、需要大量链接分析(GA/Click 漏斗等)的场景。
推荐指数:⭐⭐⭐⭐⭐(5/5,纯粹度满分)

GitHub 仓库 看看,Docker Hub 镜像 拉个下来试试,官方 demo(密码 chhoto-url-demo-pass)体验一下。