转载自 我的个人博客
先聊聊
我的博客上线以后,一直有个痒点:到底有没有人看?
Google Analytics 能回答这个问题,但我实在不想装——一个统计脚本几十 KB,拖慢加载速度不说,还把每个访客的行为数据送给 Google。我的博客连广告都没挂,凭什么帮你收集用户数据?
后来发现了 Umami。开源、自建、一个脚本不到 2KB,Dashboard 简洁到不用学。更香的是,它有 Share API,我可以把统计数字实时展示在博客页面上——"本站总访问 12,345 次",那种有人来看的感觉真的很好。
这篇文章记录我从零部署 Umami 到博客展示统计数据的全过程。每一步都是跑过的,复制粘贴就能用。
Umami 是什么
简单说就是个轻量级的 Google Analytics 替代。部署在你的服务器上,数据归你。
装完以后长这样:打开 Dashboard,能看到每篇文章多少人看了、从哪来的、用什么设备。没有多余的图表,没有看不懂的指标。
我的部署架构
我有一台阿里云 ECS,上面跑了 Nginx、Twikoo 评论、Syncthing 图床。Umami 也扔在上面:
- Docker Compose 启动 Umami + Postgres 两个容器
- Nginx 反代子域名
umami.131714.xyz - 博客(Cloudflare Pages 上的 Astro 静态站)加载跟踪脚本
- 博客侧边栏和文章页实时拉取统计数据
第一步:Docker Compose 部署
SSH 登录服务器,建个目录:
mkdir ~/umami && cd ~/umami创建docker-compose.yml:
version: '3' services: umami: image: ghcr.io/umami-software/umami:postgres-latest ports: - "127.0.0.1:3000:3000" environment: DATABASE_URL: postgresql://umami:你的数据库密码@db:5432/umami DATABASE_TYPE: postgresql APP_SECRET: 你的随机密钥 depends_on: db: condition: service_healthy restart: unless-stopped db: image: postgres:16-alpine environment: POSTGRES_DB: umami POSTGRES_USER: umami POSTGRES_PASSWORD: 你的数据库密码 volumes: - ./pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U umami"] interval: 5s timeout: 5s retries: 5 restart: unless-stopped注意端口绑了127.0.0.1——Umami 不直接暴露到公网,后面用 Nginx 反代出去变 HTTPS。
APP_SECRET 用这个命令生成:
openssl rand -hex 32然后把输出的那串字符填进去。
启动:
docker compose up -d docker compose ps # 确认两个容器都是 Up # 新版 Umami 首次访问页面自动引导注册管理员第二步:Nginx 反代 + HTTPS
在/etc/nginx/sites-available/下新建配置:
server { listen 80; server_name umami.你的域名.com; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }启用并上 SSL。别直接用certbot --nginx,很容易出 403:
# 先启用 site sudo ln -s /etc/nginx/sites-available/umami /etc/nginx/sites-enabled/ # 只申请证书,不碰 nginx 配置 sudo certbot certonly --nginx -d umami.你的域名.com证书拿到后,补完整配置:
server { listen 80; server_name umami.你的域名.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name umami.你的域名.com; ssl_certificate /etc/letsencrypt/live/umami.你的域名.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/umami.你的域名.com/privkey.pem; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }sudo nginx -t && sudo systemctl reload nginx
certbot --nginx会自动改 nginx 配置,但可能把 SSL 写进default文件,导致 HTTPS 命中静态文件,反代失效。
第三步:在 Umami 添加网站
打开https://umami.你的域名.com,登录后在 Settings → Websites → Add website:
- Name:随便填,比如 "RyuChan Blog"
- Domain:填博客域名,比如
blog.nywerya.xyz
创建后会得到一个 Website ID,是一串 UUID,记下来。
第四步:配置博客
我的博客用的是 Astro 模板 RyuChan,已经把 Umami 集成好了。只需在配置文件里填几行:
umami: enable: true baseUrl: https://umami.你的域名.com websiteId: 上一步拿到的 UUID shareId: "" timezone: Asia/Shanghai部署后 F12 → Network 能看到/script.js被加载,就已经在统计了。
第五步:把统计数据展示在页面上
Umami 有一个很好用的 Share 功能,可以把统计数字通过 API 公开出去。博客侧边栏的"总访问量"和文章页的"阅读量"就靠这个。
在 Umami 后台 → Settings → Websites → 点你的网站 → Share → Enable share URL,设个密码保存。你会得到一个分享链接,URL 里那串随机字符就是shareId。
填进博客配置:
shareId: jToXL5Z3hnA1gKUw # 你的分享 ID部署后,博客会自动展示全站 PV/UV 和单篇阅读量。
不想自己部署?用 Umami Cloud
如果你不想折腾服务器,Umami 官方有托管服务 cloud.umami.is,注册即用。免费版 3 个网站,个人博客够用了。流程和上面一样,只是 baseUrl 改成https://cloud.umami.is。
几个容易踩的坑
- 端口别暴露公网:
docker-compose.yml里写127.0.0.1:3000:3000,别写3000:3000 - 数据库 pgdata 要映射出来:不然
docker compose down数据就没了 - APP_SECRET 很重要:丢了所有登录 session 失效,要重新登录
- 第一次跑 setup 别忘:不然没有管理员账号,登录不了后台
总结
整个流程走下来也就 15 分钟。部署 Docker → Nginx 反代 → 博客配置 → 开启分享。一次配好就再也不用管,后台自动统计数据,博客自动展示。
自建的好处不只是隐私——有了 Share API,你可以把"有人在看你的文章"这件事变成访客也看得见的数字。写博客最需要的就是这个。
有问题欢迎在评论区交流,博客地址见主页。