跳到主要内容

架构 ​

Slite 采用纯客户端 Nuxt 4 前端配合 Nitro Node.js 服务端运行于单一进程中,所有数据均存储在本地,无需依赖外部云平台服务。

有人打开短链接时发生什么 ​

  1. 公开解析: 访客访问你域名下的短链接。公开短链解析逻辑优先于管理端鉴权中间件执行。
  2. 缓存与查询: Slite 优先查询进程内短链接内存缓存。若未命中,则从权威 SQLite 数据库加载并回填缓存。
  3. 规则匹配: 依次匹配存储的链接规则:有效期限、访问密码、已持久化的安全警告标记(DoH 检测仅在创建或编辑短链时执行,跳转时直接读取已有标记而不做实时 DNS 查询)以及智能分流(设备或国家/地区覆盖)。
  4. 跳转与记录: 向访客返回 HTTP 重定向响应(默认 301),并异步向本地 DuckDB 分析数据库写入一条访问日志事件。
  5. 后台管理: 管理员在 /dashboard 或通过 REST API 管理短链接、导出数据和查看统计报表,两者均需验证 NUXT_SITE_TOKEN。

本地存储 ​

所有持久化数据统一保存在 NUXT_DATA_DIR(容器内默认为 /data)目录下:

相对路径存储引擎是否必需说明
slite.sqliteSQLite / Drizzle必需权威存储 — 保存全部短链接、标签及系统核心配置
analytics.duckdbDuckDB推荐访问分析事件、点击指标及地理位置查询日志
files/imagesunstorage 文件系统可选用户上传的社交分享预览图片
backupsunstorage 文件系统可选自动每日生成的短链接 JSON 快照与手动备份文件

SQLite 与进程内内存缓存 ​

SQLite 是系统全部短链接与核心状态的唯一权威数据源。

短链接缓存基于 unstorage memory 驱动实现:

  • 缓存仅存在于当前运行的 Node.js 进程内存中。
  • 属于进程内部状态,可随时按需从 SQLite 重建,绝非第二数据源。
  • 进程冷启动时缓存为空,短链接在被首次访问时按需回填至内存。
  • 任何短链接的新增、修改或删除操作在提交 SQLite 后,会同步清理对应的内存缓存项。
  • 若缓存读取或写入异常,系统会自动停用缓存并直接回退至 SQLite 查询。

上传的图片与短链接备份文件通过 unstorage 文件系统驱动保存在 files/images 与 backups 目录中。

进程模型与运行约束 ​

Slite 严格遵循单进程独占架构:

  • 每个本地持久化数据目录同一时间仅允许一个容器或 Node.js 进程运行。
  • SQLite、DuckDB 与进程内存缓存均非分布式系统,不支持多进程集群、横向副本扩容或基于网络共享文件系统(如 NFS、SMB)挂载。
  • 容器重建与版本升级必须确保旧进程已完全停止且保留底层本地数据卷。

可选服务 ​

  • AI 辅助: 基于 xsai 连接任意兼容 OpenAI 协议的模型接口(如 OpenAI、DeepSeek、Ollama 等)。请求仅传递目标 URL,不抓取网页内容。
  • 点击 Webhook: 在短链接被点击时,异步向配置的外部接口推送带有 HMAC-SHA256 签名的 JSON 事件。
  • GeoIP 地理位置: 使用本地 MMDB 数据库解析访客的地理位置信息。发布版 Docker 镜像已内置 DB-IP City Lite;缺少数据库时自动平稳回退。
  • 近实时视图: 实时仪表盘采用约 10 秒轮询与前端队列逐秒重放机制,并非基于 SSE 或 WebSocket 长连接。