Umami 自建统计原理
一句话概括:在你的网站嵌入轻量JS追踪脚本,访客浏览器加载脚本后采集页面/浏览器信息,POST上报到你自建的Umami后端服务,后端存入PostgreSQL数据库,后台面板查询数据库做图表展示;主打隐私友好,默认不使用Cookie。
完整流程
1. 前端埋点(访客浏览器)
你在网站 <head> 插入 Umami 给的追踪JS脚本(umami.js)。访客打开页面:
- JS加载,不设置Cookie,通过浏览器信息(IP+UA)生成匿名会话标识;
- 自动采集:页面URL、标题、referrer来源、屏幕分辨率、浏览器语言、Web性能指标(LCP/INP/CLS);
- 页面加载完成触发上报,向你自建Umami服务的
/api/send 发送POST请求,携带payload,里面包含你网站的唯一websiteId;
- 支持手动埋点:
umami.track() 自定义事件(按钮点击、表单提交等);
- 脚本很小,不会拖慢页面;也支持图片 beacon 上报作为降级方案(JS被拦截时)。
注意:Umami不使用第三方Cookie,不追踪跨站用户;访客是匿名,没有持久用户ID。
2. 后端接收(自建Umami服务)
自建的Umami服务(Node.js)接收前端上报:
- 校验
websiteId,判断这个站点是否在后台已添加;
- 提取请求IP、User-Agent,解析设备、浏览器、操作系统;
- 做会话判断:同一个访客一段时间内的多次访问算作同一个会话;
- 清洗数据,过滤机器人(基础防爬虫);
- 将页面浏览记录、事件记录写入 PostgreSQL 数据库。
3. 数据计算与面板展示
后台Dashboard不是实时预计算,查询时从数据库聚合统计:
- PV:页面浏览次数
- UV:独立访客(根据IP+UA组合判断,不是用户ID)
- 会话数、来源域名、热门页面、设备浏览器占比、Web指标
- 支持时间范围筛选,前端渲染图表。
关键特点(和Google Analytics最大区别)
- 数据主权:所有访问数据保存在你自己的PostgreSQL数据库,不走第三方服务器;
- 无Cookie设计:默认不写Cookie,符合GDPR等隐私法规;靠IP+UA识别会话(缺点:同一个局域网多个用户会被合并;IP代理/VPN会影响准确性);
- 轻量:追踪脚本只有几KB;
- 开源,Docker一键部署自建。
局限
- IP+UA识别访客不是绝对精准,容易受代理、CDN、内网影响;
- 基础机器人过滤,复杂爬虫依然会混入统计;
- 脚本被广告拦截插件(AdGuard等)拦截 → 数据丢失;
- 因为不用Cookie,跨设备无法识别同一个真实用户。
简单架构图
访客浏览器 → umami.js采集数据 → POST上报 → 自建Umami后端(Node) → PostgreSQL数据库 → Umami后台面板查询绘图
|