使用 Vercel 部署 Umami 统计,获取访客操作系统、国家/地区、浏览器等数据
最近本站升级到了Umami
统计,在关于我页面,也添加了简单的网站统计数据概览效果。
洪哥提供了使用Docker搭建Umami统计方法,林木木提供了前端调用 Umami API 数据,我这个是基于Vercel自部署的功能实现。
个人认为我自己这套方案的主要优点如下:
感兴趣吗?开干!
Vercel 部署 Umami
首先Fork
官方仓库Umami,名称随便。顺手也点个小星星吧,支持下开源项目。
接着在 Vercel 中,创建一个新项目,选择刚刚Fork
的这个仓库,点击Import
部署该项目。
在自己 Vercel 首页,点击“Storage” —> “Create Database” —> “Serverless Postgres”。
接着地区建议选择新加坡 “Singapore - sin1”,其他默认,创建完成。
访问刚创建的这个服务,点击“Show secret”查看DATABASE_URL
的值,并保存好稍后使用。
小贴士:
通过此处的信息,后期还可以在桌面端如DBeaver
软件中,直连数据库,访问Umami
数据表,用SQL
取数自己分析等等。
以DBeaver
为例,在DBeaver
中创建一个链接,选择PostgreSQL
后,简要配置如下:
- 主机:即该页面的
PGHOST
- 端口:默认
5432
就行 - 认证:选择
Database Native
- 用户名:即该页面的
PGUSER
- 密码:即该页面的
PGPASSWORD
随后点击左下角“测试链接”,如果正常的话,勾选Save password locally
保存密码到本地,然后确定即可。
回到 Vercel 中刚才创建的Umami
项目,点击该项目,在 “Settings” —> “Environment Variables” 下,创建以下环境变量:
变量名 | 取值 | 说明 |
---|---|---|
CORS_ALLOWED_ORIGINS | 配置你自己网站域名,解决跨域问题,如https://blog.guole.fun | 解决Umami 跨域问题,同时一定程度保障网站数据安全性 |
CORS_ALLOWED_HOST | 配置你自己的主域名,如guole.fun | 解决Umami 跨域问题 |
DATABASE_URL | 刚才记录的DATABASE_URL 值 | 官方配置项,数据库链接 |
TRACKER_SCRIPT_NAME | script.js | 脚本名称,就是给Umami 前端嵌入的跟踪器脚本一个新的名称,随便自定义 |
先不要急着去重新部署,因为我们还要调整代码。
在 Umami 中新增接口
在本地创建一个文件夹比如umami
,然后执行以下命令关联和拉取远程仓库:
1 | git init |
在本地编辑器中打开umami/package.json
,在scripts
的build
下面插入一行:
1 | "build-dev": "npm-run-all check-env build-db check-db build-tracker build-app", |
这是为了解决本地调试时,除了第一次,后面无需执行build-geo
步骤(安装完依赖,首次执行 npm run build
,后续使用 npm run build-dev
),避免国内网络情况每次构建都要等很久很久……
记得上面配置的环境变量DATABASE_URL
和CORS_ALLOWED_ORIGINS
吗?在umami/.env
中新增:
1 | DATABASE_URL=postgres://neondb******ire # 刚才记录的值 |
在本地编辑器中打开umami/tsconfig.json
,在原文"styles/*": ["./styles/*"],
下插入一行:
1 | - "styles/*": ["./styles/*"] |
修改后完整 tsconfig.json
1 | { |
在本地编辑器中打开umami/src/lib/middleware.ts
,修改createMiddleware
内容如下:
1 | export const useCors = createMiddleware((req: NextApiRequestWithPath, res, next) => { |
在本地编辑器中打开umami/src/pages/api/share/[shareId].ts
,修改原文:
1 | - import { useValidate } from 'lib/middleware'; |
另外,该文件中新增对useCors
的调用:
1 | + await useCors(req, res); |
接着在本地编辑器中打开umami/src/pages/api/websites/[websiteId]/
目录,新建一个文件getWebsiteMetrics.ts
,内容如下:
1 | import * as yup from 'yup'; |
记得把代码中umami.guole.fun
,换成你部署Umami
后的自定义域名(在 Vercel 中设置)。
至此已完成修改,提交推送到远程仓库,Vercel 就会自动部署,并应用刚才设置的环境变量。
测试接口
确保你的网站已完成Umami
接入(官方文档很详细,就不赘述了)。
在Umami
前端界面中,访问 “设置” —> “网站” —> 选择你的网站 —> “共享链接”,创建一个共享链接(也可以用官方指导里的方法,创建一个 API 秘钥,然后去调用……),这个共享链接只需其中的标识share/
与/${你的域名}
中间这部分字符串。
获取 token 地址:https://你的 umami 域名/api/share/
+ 上文这个字符串
打开hoppscotch.io,创建一个获取 token
的 get
请求,地址就是上面这个,发送看看。应该可以拿到结果。
如果hoppscotch
无法发送请求,去安装下这个浏览器插件。
再创建一个 get
请求,地址是:https://你的 umami 域名/api/websites/在umami设置中,你的网站ID/getWebsiteMetrics
添加一些请求参数:
1 | startAt: 1731859200000 |
添加请求头:
1 | X-Umami-Share-Token: //刚才调用获得的 token |
发送请求试试看吧!应该可以获得下面这样的输出结果:
1 | { |
至此,接口完成。拿到数据随便怎么玩吧。其中name
就是格式化后的名称,icon
是图标,y
就是对应数据值。
使用接口
直接把我自己的实现放出来吧。
之前参考洪哥页面,搞了个about
页面,在其中插入这样的代码:
1 | .author-content |
在该文件末尾,插入一段脚本:
1 | script. |
收工~~
- 感谢鼓励 🙏