自带域名 + 自动 HTTPS
自有域名加进来做 DNS 激活校验,通过后由 Caddy on-demand TLS 自动签发 Let's Encrypt 证书并续期;平台域名配一条泛解析,每个租户自动获得 <slug>.<平台域名>。
on-demand TLS · 重试 5min / 最长 72h自托管 · 多租户 · 短链服务
Janus 把短链服务装进你自己的服务器:租户带自己的域名进来,Caddy 为每个已激活域名自动签发并续期 HTTPS,访问热路径上零 DB 查询地完成一次规则裁决。
热路径
从 Host 定位到落下一行访问明细,全过程发生在跳转热路径上。三条硬约束守在这里:零 DB 查询、零写放大、fail-open。
用 Host 头映射到 active 域名;未命中直接 404,并且不记明细。
Host → domain短码找到短链与目标池;同一短码在不同域名下可指向不同目标。
code → link + targets停用 / 已逻辑删除 / 无可用目标 / 落地页文件缺失,一律 404,并记一行 outcome=failed 明细。
短链开启规则时按 priority 升序求值,首条命中即裁决;规则快照按租户整份缓存在内存,零 DB 查询。
first match wins跳转型从目标池轮询选一个 → 302(默认)或 301;落地页型先到落地页,点击后再进目标。
round-robin → 302动作 / 结果 / IP / User-Agent / 来源 / 语言 / 国家 / 命中规则,一行一次访问。
visit row核心能力
补一条不依赖外部服务的短链基础设施:域名、证书、规则、明细,闭环自洽。
自有域名加进来做 DNS 激活校验,通过后由 Caddy on-demand TLS 自动签发 Let's Encrypt 证书并续期;平台域名配一条泛解析,每个租户自动获得 <slug>.<平台域名>。
on-demand TLS · 重试 5min / 最长 72h租户之间的域名、短链、规则、落地页完全隔离;部署者持有平台管理员角色,可治理全平台。
Casbin RBAC · tenant / superadmin13 个可求值访客字段 × 14 个运算符,条件组可嵌套;裁决为放行 / 改写目标 / 404 / 限流,按 priority 升序首条命中即裁决。
visual 条件树 或 Expr 表达式一条短链可配多个目标 URL,访问时按轮询选择其一;跳转方式临时 302 或永久 301,每条独立配置。
round-robin · 302 / 301落地页来源二选一:填外部地址,或上传含 index.html 的 zip 由平台托管。每条短链一份 JS SDK,按钮点击自动绑定并回传点击。
/<code>/sdk.js · /<code>/click每次访问落一行:动作 / 结果 / IP / UA / 来源 / 语言 / 国家。总览走专用聚合端点,含 KPI、CTR、失败与风险拦截分布,以及离线 ip2region 驱动的世界地图。
?range=today|3d|7d|30d|1y会话 cookie 之外,另发 24 小时 Bearer JWT 供脚本 / CLI 使用——header 认证,免疫 CSRF;配套限流、bcrypt 密码与统一 { code, message, details } 错误响应。
POST /api/auth/token → Authorization: Bearer …租户全局或单条规则专属地自定义 404 / 429 页面,决议优先级为规则专属 → 租户全局 → 系统内置;错误页带 CSP sandbox 与 nosniff。
rule → tenant → default规则引擎
选一个访客画像,看规则引擎怎么判。规则按 priority 升序求值,首条命中即裁决;取不到数据恒不命中——取反写法也不例外。
未命中任何规则 → 走原跳转流程,从目标池轮询选一个,302 到目标。
注意:country 取不到值时,`country not_in [CN]` 这类取反条件同样不命中——否则「拦截非中国访客」会变成拦截所有人。
架构
前后端分离:后端镜像内无任何前端文件,前端独立构建为 nginx 镜像——改前端不必重打后端。
技术栈
后端启动顺序:加载配置 → 连接 Postgres → 执行初始化脚本 → 初始化超管 → 启动后台 worker → 监听 HTTP。后台 worker 负责 DNS 重试、证书探活、访问记录与 token 清理。
邮件可插拔:配置 SMTP 走真实发送;未配置时用控制台 mailer 把邮件内容打印到后端日志,便于无外网环境开发。
开始自托管
单服务器部署:Go 后端 + Vue 3 SPA + PostgreSQL 16 + Caddy,一条命令全部跑起来。唯一的外部依赖是 Let's Encrypt 与可选的 SMTP。