最近节日
正在加载日历...----

使用 Vercel + Neon 免费部署 Umami 网站统计,记录 Prisma 7 适配、自定义域名绑定及通过 Share API 拉取站点 UV/PV 的接入方式。
用 Vercel + Neon 免费部署 Umami,并通过 Share API 在博客首页展示 UV/PV。个人博客(< 10 万 PV/月)零成本运行。
博客用户 │ ▼Cloudflare CDN (博客静态站) │ 加载 script.js ▼Vercel (Umami Next.js 应用) │ 读写数据 ▼Neon (Serverless PostgreSQL)| 服务 | 免费额度 | Umami 实际消耗 | 够用 |
|---|---|---|---|
| Vercel Hobby | 100 万次函数调用/月,100 GB-Hours | 个人博客约 1-5 万次/月 | ✅ |
| Neon Free | 0.5 GB 存储/项目,100 CU-hours/项目 | Umami 数据约 50-200 MB/年 | ✅ |
Cloudflare D1 基于 SQLite,Umami 仅支持 PostgreSQL,无法兼容。
umamiSingapore 或 TokyoDATABASE_URL 连接字符串
访问 github.com/umami-software/umami,点击 Fork,保持默认设置。
Umami 最新版使用 Prisma 7,url 和 directUrl 不再支持在 schema.prisma 中配置,已移至 prisma.config.ts。Umami 项目根目录已自带 prisma.config.ts:
import 'dotenv/config';import { defineConfig, env } from 'prisma/config';
export default defineConfig({ datasource: { url: env('DATABASE_URL'), },});无需手动修改,只需确认 Fork 出来的版本中存在该文件。
umami 仓库,Import| Name | Value |
|---|---|
DATABASE_URL | Neon 中复制的 Prisma 连接字符串 |
umami-xxxx.vercel.appadmin,密码 umamiVercel 的
.vercel.app域名在国内可能被墙,绑定自定义域名解决。
stats.yourdomain.com)| Type | Name | Target | Proxy status |
|---|---|---|---|
| CNAME | stats | cname.vercel-dns.com | 关闭(灰色云朵) |
⚠️ Proxy 必须关闭。Vercel 自带 CDN,开 Cloudflare Proxy 会冲突导致 SSL 问题。
在网站 <head> 中添加:
<script async src="https://你的Umami域名/script.js" data-website-id="你的 Website ID"></script>可选参数:
| 参数 | 说明 |
|---|---|
data-auto-track="false" | 禁用自动追踪,需手动调用 umami.track() |
data-do-not-track="true" | 尊重浏览器 DNT 设置 |
data-domains="example.com" | 仅在指定域名下追踪 |
本博客已内置 Umami 组件,修改 src/config/siteConfig.ts:
analytics: { umamiAnalytics: { websiteId: "你的 Website ID", shareId: "你的 Share ID", // 用于拉取公开统计,见第八步 scriptUrl: "https://你的Umami域名/script.js", trackOutboundLinks: true, collectWebVitals: false, },},组件 src/components/analytics/UmamiAnalytics.astro 负责注入脚本并自动追踪出站链接点击。
通过 Umami 的 Share API,无需服务端鉴权即可在博客首页展示访问数据。
https://stats.yourdomain.com/share/xxxxxxxxxsiteConfig.ts 的 shareId 字段实现位于 src/components/layout/HomeDataLayer.astro,核心流程:
siteConfig.analytics.umamiAnalytics 取出 scriptUrl(推导出 base url)和 shareIdshareId 调用 GET /api/share/{shareId} 获取 websiteId 和 token(1 小时缓存)token 调用 GET /api/websites/{websiteId}/stats?startAt=0&endAt={now},请求头携带:
x-umami-share-token: {token}x-umami-share-context: 1uv/visitors 即访客数,pv/pageviews 即浏览量// 核心调用逻辑(简化版)const shareRes = await fetch(`${statsBaseUrl}/api/share/${shareId}`);const share = await shareRes.json();const websiteId = share.websiteId || share.entityId;const token = share.token || shareId;
const statsRes = await fetch( `${statsBaseUrl}/api/websites/${websiteId}/stats?startAt=0&endAt=${Date.now()}`, { headers: { "x-umami-share-token": token, "x-umami-share-context": "1", "Content-Type": "application/json", }, },);const data = await statsRes.json();// data.uv / data.visitors → UV// data.pv / data.pageviews → PV不需要在本项目后端配置 Umami 的 API Token。Share URL 是 Umami 提供的公开访问入口,前端可直接调用。
如果只需要跳转到 Umami 公开面板,可在博客路由中直接重定向到 https://stats.yourdomain.com/share/{shareId}。
Umami 后台 → Settings → Websites → 你的网站 → Data retention,建议设为 1 年,避免超出 Neon 0.5 GB 免费额度。
进入 Fork 的 GitHub 仓库 → Sync fork → Update branch,Vercel 自动检测变更并重新部署。
| 问题 | 解决方案 |
|---|---|
P1012: The datasource property url is no longer supported | Prisma 7 破坏性变更,确认 prisma.config.ts 已配置 url,schema.prisma 中不能有 url/directUrl |
国内访问 .vercel.app 慢/打不开 | 绑定自定义域名,Cloudflare DNS 关闭 Proxy |
SSL 警告 sslmode "prefer" is treated as alias for "verify-full" | 将 sslmode=require 改为 sslmode=verify-full,不影响功能 |
首页 UV/PV 显示 -- | 检查 shareId 是否正确、Share URL 是否开启、Umami 域名是否可访问 |
| 公开统计面板样式与别人不同 | Umami 不同版本分享页样式不同,无配置项可切换 |
| 项目 | 存放位置 |
|---|---|
| Neon 数据库密码 | Neon Dashboard → Settings → Database |
| Neon 连接字符串 | Neon Dashboard → Connection Details |
| Umami 管理员账号 | Umami 后台 → Settings → Profile |
| Website ID | Umami 后台 → Edit Website |
| Share ID | Umami 后台 → Edit Website → Share URL |
| Umami 公开数据分享链接 | Umami 后台 → Edit Website → Share URL |
| Vercel 项目地址 | Vercel Dashboard |
| Umami 自定义域名 | Vercel → Settings → Domains |
⚠️ 数据库密码和管理员密码不要提交到 GitHub 或公开分享。
Website ID和Share ID可公开,前者已在页面 HTML 中暴露,后者是 Umami 设计的公开访问凭据。