最近节日
正在加载日历...----
使用 Vercel 部署 Umami、Neon 托管 PostgreSQL 数据库,介绍 Prisma 7 适配、自定义域名和 Share API 展示博客 UV/PV 的配置方法。

本文将 Umami 部署到 Vercel,将 PostgreSQL 数据库部署到 Neon,再通过 Share API 在博客首页展示 UV/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,密码 umami/websites/{id} 路径中的 UUID 即 Website ID;也可在网站设置页的 Tracking Code 面板里复制 data-website-id 的值Vercel 的
.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,无需服务端鉴权即可在博客首页展示访问数据。
/websites/{id}/settings)miaowu)、选择主题,勾选要公开的内容(推荐只勾选 Traffic → Overview)https://stats.yourdomain.com/share/xxxxxxxxxxxxxxxxsiteConfig.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(Prisma 7 版本)已移除 Data retention 设置与后台自动清理任务:网站设置里只剩 Edit / Tracking Code / Replay / Share / Data(Reset、Delete、Transfer)五个面板,设置导航只有 Preferences、Profile、Teams。旧教程「Data retention 设 1 年」的步骤不再适用,数据容量需要自行监控。
个人博客量级估算:一条事件记录约几百字节,日均几百 PV 的站点一年约 100-200 MB,Neon 免费版 0.5 GB 通常够用数年,平时无需处理。
建议做法:
-- 删除一年前的事件DELETE FROM website_event WHERE created_at < now() - interval '1 year';-- 清理已无事件引用的 event_dataDELETE FROM event_data WHERE website_event_id NOT IN (SELECT event_id FROM website_event);-- 删除已无任何事件的 sessionDELETE FROM session WHERE session_id NOT IN (SELECT DISTINCT session_id FROM website_event);进入 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 后台 → 网站设置页地址栏 /websites/{id} 或 Tracking Code 面板 |
| Share ID | Umami 后台 → 网站设置 → Share 列表 |
| Umami 公开数据分享链接 | Umami 后台 → 网站设置 → Share 列表 |
| Vercel 项目地址 | Vercel Dashboard |
| Umami 自定义域名 | Vercel → Settings → Domains |
⚠️ 数据库密码和管理员密码不要提交到 GitHub 或公开分享。
Website ID和Share ID可公开,前者已在页面 HTML 中暴露,后者是 Umami 设计的公开访问凭据。