把网站流量统计这件事,搞定了就等于多了 1 千个潜在用户
如果你现在只能靠谷歌分析的乱七八糟报表、或者根本没有任何统计,那你根本不知道自己的站点到底是谁在看、从哪儿来、到底有没有转化。本文把 Umami 从源码到一键部署全拆了,顺便和市面上常见的开源统计工具(Matomo、Plausible、GoatCounter、PostHog)比个血案,让你在 3 秒内判断到底该选哪款。

先说清楚到底要解决什么痛点
- 站点流量毫无踪迹,业务增长只能靠猜。
- 传统 GA 要 V屁嗯、加载慢,还会泄露用户隐私。
- 自建方案要么功能炸裂但部署复杂,要么轻量但数据不全。
大多数开发者的真实需求是快速部署、低资源占用、足够的访客来源与页面浏览统计、并且不收集个人隐私。
Umami 的核心本质——“轻量 + 隐私友好 + 易部署”
Umami 只用 Node.js + Next.js 搭配 PostgreSQL/MySQL,所有请求都在后端完成,前端只往页面里塞一段 <script>,不需要 Cookie,也不向第三方上报。它的核心原理可以抽象为三步:
- 浏览器请求
/script.js,获取一个匿名 ID(本地存储),随后每次页面加载都把 ID、URL、时间发送到后端。 - 后端把原始事件写入数据库,使用
hash_salt做一次不可逆混合,确保即使库泄露也无法还原真实 IP。 - 后台 UI 通过聚合 SQL 查询实时生成 PV、UV、会话时长、来源等报表。
这套方案的好处是不依赖第三方 CDN,所以在国内外都几乎 0 ms 打包,且因为全程走自己服务器,隐私合规几乎是默认通过。
在三台不同配置的 VPS 上部署 Umami 的坑与解决方案
- 坑 1:APP_SECRET 冲突——很多教程直接写死
replace-me-with-a-random-string,导致容器重启后会被缓存的旧值覆盖。实际操作时,我习惯用openssl rand -hex 16生成,写进环境变量后再docker compose up -d。 - 坑 2:HTTPS 与 Mixed Content——如果站点是 HTTPS,Umami 脚本必须也走 https,否则浏览器会直接把请求拦掉。我在 Nginx 里做了 443 端口的反向代理,并在
proxy_set_header X-Forwarded-Proto https;中显式声明。 - 坑 3:数据库连接超时——Docker Compose 启动顺序不一定,Umami 有时会在 Postgres 完全准备好之前抢占连接,导致容器报错退出。解决办法是给
depends_on加上condition: service_healthy并在数据库服务里配置healthcheck,我在docker-compose.yml里写了pg_isready检查。 - 坑 4:GeoIP 下载慢——国内服务器访问官方 GeoIP 数据库几乎超时。我的做法是提前在本机下载
GeoLite2-Country.mmdb,放到挂载卷里,`GEO_DATABASE_URL` 指向本地文件即可。
同类工具横向对比到底谁更适合你?
| 维度 | Umami | Matomo | Plausible | GoatCounter | PostHog |
|---|---|---|---|---|---|
| 部署难度 | 一键 Docker Compose/1Panel,极简 | 需要 PHP+Apache,复杂 | Docker + ClickHouse,中等 | 单二进制文件,极简 | Docker + 多服务(Postgres+Redis),中等 |
| 资源占用 | ~250 MB RAM(Node 环境) | ~800 MB RAM(PHP+MySQL) | ~800 MB RAM(ClickHouse) | ~100 MB RAM(Go) | ~1 GB RAM(多服务) |
| 功能深度 | 页面 PV/UV、来源、事件、漏斗、实时访客 | 完整电商、热图、A/B 测试 | 核心指标+实时访客,漏斗仅云版 | 最基础的 PV/UV、来源 | 事件、路径、会话回放、特征标志 |
| 隐私合规 | 不使用 Cookie,IP 哈希+盐 | 可选匿名化,默认收集 IP | 完全匿名化,默认不收集 IP | 不使用 Cookie,临时缓存 IP | 可自行决定,默认不发送第三方 |
| 适用场景 | 个人博客、SaaS 小后台、需要自定义事件 | 企业站点、需要完整电商分析 | 流量监控为主、追求 UI 极致 | 极简博客、资源极度受限 | 复杂交互产品、需要会话回放 |
从表格可以看出,如果你只想要一个几分钟就能跑起来、对数据有基本需求且不想踩隐私雷区的工具——Umami 是性价比最高的选择。
一步到位的部署脚本(适配 Ubuntu 22.04 + Docker Compose)
sudo apt update && sudo apt install -y docker.io docker-compose-plugin
mkdir -p /opt/umami && cd /opt/umami
cat > docker-compose.yml <<'EOF'
version: '3'
services:
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: $(openssl rand -base64 12)
volumes:
- umami-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://umami:${POSTGRES_PASSWORD}@db:5432/umami
DATABASE_TYPE: postgresql
APP_SECRET: $(openssl rand -hex 16)
depends_on:
db:
condition: service_healthy
restart: always
volumes:
umami-db:
EOF
docker compose up -d
上面脚本把数据库密码、APP_SECRET 都用随机数填进去,省去手动改文件的烦恼。部署完后直接访问 http://your-ip:3000,默认账号 admin / umami,第一时间去改密码。
进阶:把 Umami 融入你的 CI/CD 流程
- 把
docker compose pull && docker compose up -d --remove-orphans写进部署脚本,实现透明升级。 - 如果使用 Vercel 部署前端,
umami.is提供的 Edge 代理模式可以直接把脚本指向 CDN,省去自己维护 Nginx。 - 在企业内部网络中,需要把
X-Forwarded-For透传给 Umami,否则会把负载均衡的 IP 当成访客。
选对工具,你的站点数据不再是盲区
Umami 之所以在开源社区星星最多,是因为它把“轻量、隐私、易部署”三点做到了极致。大多数开发者只要把上面的 Docker Compose 拿走跑一下,就能看到实时访客、来源国、页面停留时间;如果以后需要自定义事件,只要在页面里多加一行 umami.track('click','subscribe'),数据立马出现在仪表盘。
如果你对比 Matomo 的全功能、Plausible 的 UI、PostHog 的产品分析还有疑问,欢迎在评论区聊聊自己的场景。
评论 (0)