Chhoto URL 介绍与选型指南

Chhoto URL 自托管短链接服务认知篇:Rust/Actix + SQLite 极简架构、功能特性、官方部署形态溯源,与 Shlink/YOURLS/Kutt 的量化选型对比(v7.10.3,2026-10-30 实查)。

Chhoto URL自托管RustSQLite2026/10/30

Chhoto URL 介绍与选型指南

目标:本文是 Chhoto URL 的认知篇,面向「自托管短链接服务怎么选、Chhoto URL 适合谁」的问题,基于官方资料完成全景溯源与选型对比。全部信息来自官方仓库与官方徽章接口的联网实查(查询日期 2026-10-30),不涉及本地实测数据;部署与配置的实测内容见本专栏后续篇章。

一、信息基准

本文为 Chhoto URL 认知篇,全部信息基于官方资料溯源编写,不涉及本地实测数据。查询日期为 2026-10-30。

项目内容
软件名称Chhoto URL(Chhoto 为孟加拉语「小」,即 Small URL)
本文信息基准版本v7.10.3(GitHub 最新 Release 实查,对应 git 标签 7.10.3)
开源许可MIT(官方仓库 LICENSE 文件实查,源码包内 SPDX 标记 MIT)
实现语言后端 Rust(Actix Web 框架),前端原生 HTML + JavaScript(Pure CSS 样式)
数据存储SQLite 单文件数据库(默认开启 ACID,可选 WAL 日志模式)
官网https://chhoto.link
官方文档官方仓库 docs/ 目录(INSTALLATION.md、CLI.md、SECURITY.md 等)
源码仓库https://github.com/SinTan1729/chhoto-url 与 https://codeberg.org/SinTan1729/chhoto-url(双镜像)
容器镜像Docker Hub sintan1729/chhoto-url(官方推荐)与 ghcr.io/sintan1729/chhoto-url
在线演示https://demo.chhoto.link(演示密码 chhoto-url-demo-pass,数据库每 15 分钟清空)
维护方Sayantan Santra(SinTan1729),个人开源项目
GitHub stars996(shields.io 官方徽章接口实查,2026-10-30)
最近提交昨天(shields.io last-commit 徽章实查,2026-10-30)

💡 说明:Chhoto URL 的 Release 名称带 v 前缀(如 v7.10.3),而 git 标签本身不带前缀(7.10.3),下载源码包时使用 https://codeload.github.com/SinTan1729/chhoto-url/tar.gz/refs/tags/7.10.3 这种不带 v 的标签路径(2026-10-30 实测可下载,压缩包约 217 KB)。

二、软件概述

Chhoto URL 是一款极简的自托管短链接服务,官方定位是「一个没有不必要功能的简单自托管短链接器,简洁与速度是本项目的核心追求」。它把任意长度的 URL 缩短为一个随机生成的短链,访问短链时直接以 HTTP 307/308 跳转到目标长地址,没有中转广告页、没有跳转等待页。

项目起源于 simply-shorten(draganczukp)项目:作者认为原版理念不错但缺少关键功能,且一个简单的短链服务竟带着约 200 MB 的 Java 运行时镜像,于是用 Rust 重写了整个后端,并补充了命中计数等必要功能。重写后 scratch 基础的容器镜像压缩后不足 6 MB,alpine 基础的镜像压缩后不足 10 MB,常规使用内存占用低于 15 MB(以上均来自官方 README v7.10.3 实查)。

维护节奏上有一个值得注意的「反直觉」声明:作者明确表示「长时间看不到活动不用担心,我认为这个项目已经完成(complete),而不是死亡(dead)」——不太可能再新增功能,但会修复每一个被报告的 bug,并持续跟进安全漏洞更新。2026-10-30 实查其最近提交就在前一天,星数 996 且持续增长,属于典型的「小而稳」型个人维护项目。如果你追求的是功能全面、多租户、团队协作,它不是合适对象;如果你要的是给自己(或小团队)部署一个占用极低、常年不用操心的私人短链服务,它正中靶心。

三、核心架构

3.1 技术栈与进程模型

Chhoto URL 是单进程单体服务:Rust 编写的 Actix Web 后端在一个静态链接二进制内同时承载 HTTP 服务、短链解析跳转、管理 REST API 与前端静态资源,前端以纯 HTML + 原生 JavaScript + Pure CSS 实现(无 Node 构建链、无前端框架运行时),数据落 SQLite 单文件数据库。整个服务没有外部依赖组件,不需要独立的数据库进程、消息队列或缓存层。

  • 后端:Rust + Actix Web(官方 README 实查),面向 x86_64-unknown-linux-musl 等目标静态编译,scratch 镜像内没有任何系统工具与 shell。
  • 前端:构建产物由后端直接托管,管理界面支持移动端自适应与自动深色模式;可通过配置完全关闭前端,只保留 API。
  • 存储:SQLite 单文件,默认 DELETE 日志模式 + EXTRA 同步级别(完全 ACID),官方强烈建议开启 WAL 模式提升并发读写性能;WAL 模式相关原理与调优可参考《SQLite PRAGMA 与配置调优详解》。
  • 健康检查:应用在容器内部回环地址 127.0.0.1:1729 上额外监听一个不对外暴露的 /healthz 路由,返回 healthy/unhealthy,供编排层做存活探测(官方 docs/CLI.md 实查)。

3.2 分发形态

官方主推 OCI 容器镜像分发,Docker Hub 与 GHCR 双渠道同步发布(dev 标签仅 GHCR),同一镜像支持 linux/amd64、linux/arm64、linux/arm/v7、linux/riscv64 四种架构(官方 docs/INSTALLATION.md 实查)。镜像分三档:

镜像标签基础特点适用
latest / scratchscratch(空镜像)压缩后 <6 MB,无 shell、无调试工具追求极限体积的生产部署
latest-alpine / alpinealpine压缩后 <10 MB,含基础 Unix 工具需要进容器排查、使用健康检查 wget 的常规部署
dev 系列alpine测试用途,仅发布到 GHCR上游开发测试,官方明确不建议生产使用

官方同时提供 Kubernetes Helm Chart(仓库 deploy/helm-chart 目录)与 Podman Quadlet 样例(chhoto-url.container),官方正式支持的运行方式为 Docker 与 Podman。除容器外,也可以参照仓库 Makefile 自行编译 Rust 二进制直接运行;社区还有非官方的 FreeBSD port 与 NixOS 包(官方 README「Related software」章节实查,非官方支持)。

3.3 认证与 API 层

认证支持三种方式并可组合:固定管理密码(CHHOTO_PASSWORD,可存 Argon2 哈希)、OIDC 对接(Authelia/Authentik/Pocket ID 等外部身份源)、面向程序调用的 API Key(X-API-Key 请求头)。全部管理操作(增删改查短链)都有对应的 REST API,官方维护了一个同作者开发的命令行客户端 chhoto-url-cli,以及浏览器扩展、Raycast 扩展、Home Assistant 插件、MCP Server 等第三方生态(官方 docs/TOOLS.md 实查)。

💡 技术拓展:自托管短链服务的「跳转语义」有临时与永久两种可选。HTTP 301/308 为永久重定向,浏览器与搜索引擎会长期缓存映射,短链目标变更后旧缓存可能不失效;HTTP 307/308 中的 307 与「临时」302 语义类似但保留请求方法,浏览器每次都会回来问服务器。Chhoto URL 通过 CHHOTO_REDIRECT_METHOD 在 TEMPORARY(307)与 PERMANENT(308)间选择,默认 PERMANENT(官方 docs/INSTALLATION.md 实查)。短链服务一般建议用临时跳转,避免目标地址调整后被浏览器缓存卡住——本专栏部署篇实测即采用 TEMPORARY。

四、功能特性

以下特性清单来自官方 README(v7.10.3,2026-10-30 实查):

  • 任意长度 URL 缩短为随机生成的短链;可选自定义短链别名(官方特别指出这在同类中「出奇地少见」)。
  • 短链支持设定到期时间,到期自动失效;公开模式下可强制所有新建短链带过期时间。
  • 短链创建后可编辑目标地址,也可临时禁用/启用。
  • 每条短链可附加备注(notes),管理界面支持按短链、长链、备注过滤搜索。
  • 访问短链立即重定向,无中转页;以隐私友好方式统计命中次数——只记次数,不记访问者任何信息。
  • 一键生成短链二维码,方便移动端分享。
  • 支持 OIDC 认证(Authelia、Authentik、Pocket ID 等);管理密码与 API Key 均支持存 Argon2 哈希而非明文。
  • 提供完整的 JSON API(官方称「JSON-RPC adjacent API」),配合 API Key 可脱离网页完成全部管理操作。
  • 公开模式(Public Mode):任何访客可建短链,列出与删除仍需管理员密码;甚至可以完全关闭前端只留 API。
  • 站点标题可自定义,可挂载自定义落地页;可配置 Cache-Control 响应头。
  • SQLite 存储默认 ACID,可选 WAL 模式与放弃持久性换取吞吐(CHHOTO_SQLITE_ENSURE_ACID=False)。
  • 数据库自动备份:初始化时与每日 3-4 点间自动备份,保留最近 3 份初始化备份与 7 份每日备份。
  • 长链接协议白名单:默认仅允许 http、https、ftp、magnet,可按需追加。

同时官方在 README 中明确了「拒绝实现」的边界:不做任何跟踪/埋点、不做用户管理(需要给全组织用就「一人一容器」或换别的)、无 Cookie 弹窗与新闻订阅、无付费墙与求捐赠横幅。

五、快速开始(官方最小部署形态)

以下为官方仓库 deploy/compose.yaml(v7.10.3)的最小部署形态摘要,本文认知篇不做本地实测,逐项配置详解与本机实测见本专栏部署篇。

services:
  chhoto-url:
    image: sintan1729/chhoto-url:alpine
    restart: unless-stopped
    ports:
      - 4567:4567
    environment:
      - CHHOTO_DB_URL=/data/urls.sqlite
      - CHHOTO_SQLITE_USE_WAL_MODE=True
      - CHHOTO_PASSWORD=TopSecretPass   # 官方示例原值,部署前必须修改
      - CHHOTO_EXIT_ON_NO_AUTH=True
      - CHHOTO_REDIRECT_METHOD=TEMPORARY
      - CHHOTO_SLUG_STYLE=Pair
    volumes:
      - data:/data
    healthcheck:
      test: wget -qO- http://127.0.0.1:1729/healthz || exit 1
      interval: 60s
      start_period: 10s
      retries: 3
      timeout: 10s

volumes:
  data:

启动后浏览器访问 http://<服务器IP>:4567 输入管理密码即可进入管理界面;Compose 环境准备可参考《Docker Compose 安装与多容器编排》。命令行侧的最小验证形态为官方 CLI.md 提供的无认证只读接口:

curl http://localhost:4567/api/version   # 查询服务端版本
curl http://localhost:4567/api/siteurl   # 查询配置的站点 URL

两个路由无需认证即可访问,是部署后确认服务存活最快的探针(官方 docs/CLI.md 实查)。

六、适用场景与限制

6.1 适用场景

  • 个人或家庭自托管:NAS/VPS 上挂一个常驻短链服务,占用个位数 MB 内存与不到 10 MB 的镜像,几乎无存在感。
  • 域名换归属后保链接:自建短链域名在自己手里,公众号/印刷品/文档里只发短链,目标地址随时可改。
  • 需要命中统计但拒绝用户画像:只数次数不记访客,符合隐私最小化取向。
  • 面向程序调用的短链基础设施:完整 REST API + API Key,可嵌入自动化脚本、浏览器扩展、Raycast 等工作流。
  • 内网/团队工具链:配合 OIDC 对接已有身份认证栈(Authelia/Authentik),作为内网门户的短链组件。

6.2 限制

  • 单用户哲学:无用户体系、无团队空间、无权限分级,公开模式也只是「谁能建链」的开关,不适合多租户运营。
  • SQLite 单机存储:无主从/集群形态,官方也未提供多实例共享存储方案;超大流量(每秒数百读写)场景需自行权衡 ACID 与吞吐开关。
  • 传输加密不内置:管理密码明文传输,官方强烈建议前置 Caddy/Nginx 反代做 HTTPS(反代选型可参考《Caddy 2.11 介绍与选型指南》与《Caddy 2.11.7 Docker Compose 部署指南》)。
  • 功能克制:无 UTM 参数追加、无 A/B 跳转、无地理/设备分流、无访问日志导出,这些是设计上的「不做」而非缺陷。
  • 短链别名总量上限:形容词-名词对(Pair 风格)自动生成的组合空间有限,官方建议超过数千条短链时改用 UID 风格并把长度设为 16 以上。

七、同类选型对比

自托管短链领域常见方案横向对比(架构定性信息按各项目官方 README 惯常口径归纳;星数与版本仅 Chhoto URL 为本次 shields.io/Release 实查值,其余项目未逐一实查、不落具体数字):

维度Chhoto URLShlinkYOURLSKutt
实现语言Rust(Actix Web)PHPPHPNode.js(TypeScript)
数据存储SQLite 单文件SQLite/MySQL/PostgreSQLMySQL/MariaDBPostgreSQL/SQLite
资源定位极致轻量(<15 MB 内存、<10 MB 镜像)功能全面型经典 LAMP 风格功能丰富、界面现代
多用户/多租户明确不做支持(API Key 多域)插件生态扩展支持
管理 APIREST + API Key,全功能覆盖REST API 成熟REST API + 插件REST API
认证方式密码/Argon2、OIDC、API KeyAPI Key + 用户体系账号密码账号 + JWT
部署形态OCI 镜像(双注册表、四架构)+ Helm/QuadletDocker 镜像Docker/传统 PHP 主机Docker 镜像
维护哲学「完成而非死亡」,修 bug + 安全更新,克制加功能活跃迭代长期稳定、更新平缓活跃
量化锚点(2026-10-30 实查)v7.10.3、GitHub stars 996、最近提交昨天未逐一实查未逐一实查未逐一实查

选型解读:要「给自己用、十年不坏、占用极低」选 Chhoto URL;要「多用户、多域名、详尽统计报表」选 Shlink 或 Kutt;要「老牌稳定、PHP 主机即开即用、插件多」选 YOURLS。Chhoto URL 的差异化在于把「轻」做成了硬指标——镜像体积、内存占用、功能面、依赖数同时收敛,这在本赛道没有第二个同量级选手(本表对比对象均为独立开源项目,平台专栏暂未收录,勿与本文混淆)。

八、参考链接