1628 字
8 分钟
部署 Umami 服务统计博客的访客数、浏览量
2026-01-08
- 次浏览
Umami API 文章相关文档
Umami API 获取访客数 / 浏览量 / 访问次数 / 在线人数
使用 Umami Server API 在自部署环境下获取博客的 PV、UV、Visits 以及在线人数,并安全地展示到前端页面。
🔗/posts/blog/umami-server-api-analytics-guide/
Blog

方案说明#

为了给博客增加 文章浏览量与访客统计功能,我在服务器上部署 Umami 作为统计方案。

适用环境:

  • CentOS 7.9
  • Nginx 反向代理
  • 静态博客(Astro / Fuwari)
  • 自建统计服务
为什么自建 Umami

数据留在自己服务器上,不依赖第三方,也不用把访客数据交给外部服务。Umami 默认不用 Cookie,不收集多余个人信息,对访客友好。后续想怎么用这些统计数据(侧边栏展示、文章阅读次数等),都按自己需求来,不用受限于第三方平台的展示方式。

实现目标#

部署完成后,可以实现以下功能:

  • 访客数(UV)
  • 总浏览量(PV)
  • 各页面 / 文章浏览量
  • 可视化后台统计面板

架构说明#

  • 浏览器访问你的博客页面(Cloudflare Pages 或 Nginx 静态站点都行)
  • 页面里嵌入 Umami 的统计脚本:https://analytics.example.com/script.js
  • 脚本会把 PV/UV 等数据上报到你自建的 Umami 服务
  • Umami 后台面板也通过 https://analytics.example.com 访问
图表加载中...

使用 Docker 部署 Umami 统计服务#

服务器环境#

  • 操作系统:CentOS 7.9
  • Web Server:Nginx 1.20.x
  • 容器:Docker + docker-compose
  • 数据库:PostgreSQL ≥ 12(建议 14/15)

域名与访问方式#

Umami 最好用独立子域名,例如:analytics.example.com

该域名通过 Nginx 反代到 Umami 服务,并启用 HTTPS。

DNS 添加一条 A 记录指向服务器公网 IP。

Umami 用独立子域名:

  • 不和博客站点混在一起
  • Nginx 配置更清晰
  • 后续可以单独加访问控制/防护策略

安装 Docker 与 docker-compose#

安装 Docker(阿里云镜像)

Terminal window
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io

启动并设置开机自启

Terminal window
systemctl start docker
systemctl is-enabled docker
docker -v

配置阿里云 Docker 镜像加速器

进入阿里云控制台:容器镜像服务 ACR → 镜像工具 → 镜像加速器

会给你一个专属地址,形如:https://xxxxxx.mirror.aliyuncs.com

阿里云官方镜像加速

Terminal window
mkdir -p /etc/docker
cat >/etc/docker/daemon.json <<'EOF'
{
"registry-mirrors": [
"https://xxxxxx.mirror.aliyuncs.com"
],
"dns": ["223.5.5.5", "114.114.114.114"]
}
EOF

说明:

  • registry-mirrors:配置阿里云镜像加速器(你提供的地址)
  • dns:避免某些环境下拉镜像时的 DNS 抖动(加了更稳)
Terminal window
systemctl daemon-reload
systemctl restart docker

安装 compose 插件

Terminal window
yum install -y docker-compose-plugin

验证

Terminal window
docker compose version

创建 Umami 部署目录#

放在 /opt/umami(清晰、好管理):

Terminal window
mkdir -p /opt/umami
cd /opt/umami

再建两个子目录,用于持久化数据与备份:

Terminal window
mkdir -p postgres backups
  • postgres/:PostgreSQL 数据卷(容器重启/更新不会丢数据)
  • backups/:手动导出 SQL 备份文件(升级前先备份)

编写 docker-compose.yml#

/opt/umami 目录下创建 docker-compose.yml

Terminal window
vim /opt/umami/docker-compose.yml

填入(推荐 PostgreSQL 15 阿里云镜像 + Umami 官方镜像):

/opt/umami/docker-compose.yml
version: "3.9"
services:
db:
image: m.daocloud.io/docker.io/library/postgres:15
container_name: umami-db
restart: unless-stopped
environment:
# 数据库名/用户/密码:你可以改,但要和下面 Umami 的 DATABASE_URL 对应
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: "CHANGE_ME_STRONG_PASSWORD"
volumes:
# 持久化数据库数据,容器删除/重建不会丢
- ./postgres:/var/lib/postgresql/data
healthcheck:
# 让 Umami 等数据库健康后再启动(减少首次启动时的报错概率)
test: ["CMD-SHELL", "pg_isready -U umami -d umami"]
interval: 10s
timeout: 5s
retries: 5
umami:
# 官方预构建镜像(含 postgresql 支持),两个 registry 二选一:
image: docker.umami.is/umami-software/umami:postgresql-latest
# image: umamisoftware/umami:postgresql-latest
container_name: umami
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
# 注意:host 写 db(compose 网络内的服务名),不是 127.0.0.1
DATABASE_URL: "postgresql://umami:CHANGE_ME_STRONG_PASSWORD@db:5432/umami"
# 用于加密会话/令牌,必须随机且足够长
APP_SECRET: "CHANGE_ME_RANDOM_SECRET"
# 建议填写你对外访问的完整 URL(含 https)
APP_URL: "https://analytics.example.com"
ports:
# 只绑 127.0.0.1,Umami 不直接暴露公网,外部走 Nginx 反代 + HTTPS
- "127.0.0.1:3000:3000"

必须改的值

  1. POSTGRES_PASSWORDDATABASE_URL 里的密码:
  • CHANGE_ME_STRONG_PASSWORD → 改成强密码(建议 16+ 位,含大小写/数字/符号)
  1. APP_SECRET:会话加密密钥(建议随机、足够长)
  • CHANGE_ME_RANDOM_SECRET → 用随机值替换(至少 32 字节)
  1. APP_URL:对外访问的完整 URL(含 https)
  • https://analytics.example.com → 改成你实际的域名

生成随机密钥(复制输出替换进去):

Terminal window
openssl rand -base64 32
为什么要 127.0.0.1:3000:3000

Umami 本体没必要直接暴露公网;公网只开放 80/443 给 Nginx,安全面会小很多。


启动 Umami#

/opt/umami 目录下执行:

Terminal window
cd /opt/umami
docker compose up -d

查看容器状态:

Terminal window
docker compose ps

本机验证 Umami 是否已启动:

因为我们只绑定到 127.0.0.1,所以在服务器本机验证:

Terminal window
curl -I http://127.0.0.1:3000

看到 200/302 一类响应,说明 Umami 服务已在本机可用。

配置 Nginx 反向代理#

创建站点配置文件(推荐独立文件,便于管理):

Terminal window
vim /etc/nginx/conf.d/umami.conf

写入:

/etc/nginx/conf.d/umami.conf
server {
# 80 强制跳转到 443
listen 80;
server_name analytics.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name analytics.example.com;
# ssl证书
ssl_certificate /etc/nginx/ssl/analytics.example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/analytics.example.com/privkey.pem;
# 反代到本机 Umami(只在 127.0.0.1:3000 监听)
location / {
proxy_pass http://127.0.0.1:3000;
# 这些 header 很关键:让 Umami 识别真实域名、访客 IP、协议
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;
# HTTP/1.1 + 关闭缓冲,避免 WebSocket 或长连接异常
proxy_http_version 1.1;
proxy_buffering off;
}
}

检查并重载 Nginx:

Terminal window
nginx -t
nginx -s reload

此时访问应可打开:https://analytics.example.com

首次登录 Umami 后台(默认账号)#

访问:

默认管理员账号通常是:

  • admin
  • umami

第一次登录后记得修改密码(Settings → Profile)。

在 Umami 后台添加站点 & 获取统计脚本#

  1. 后台创建 Website(站点)

  1. 填你的博客域名(例如 blog.example.com

  1. 保存后得到一段脚本,形如:

<script async defer data-website-id="YOUR_WEBSITE_ID" src="https://analytics.example.com/script.js"></script>

把脚本加到博客全局布局(例如 Layout 的 或 底部)。

之后访问博客任意页面,Umami 会记录:

  • PV/UV
  • Top pages
  • 每个页面(URL)的访问量

验证是否统计成功#

浏览器 Network 验证

打开博客页面 → F12 → Network,检查是否请求了:

  • https://analytics.example.com/script.js
  • https://analytics.example.com/api/send 或类似上报接口(版本可能略有不同)

Umami 后台验证

进入 Dashboard 看实时数据是否增长(PV/Visitors)。


备份与升级#

备份 PostgreSQL#

/opt/umami 下执行:

Terminal window
cd /opt/umami
# 导出 SQL 到本地 backups 目录
docker compose exec -T db pg_dump -U umami umami > backups/umami-$(date +%F-%H%M).sql

升级 Umami 版本#

拉最新镜像并重启:

Terminal window
docker compose pull
docker compose up -d

如果升级后异常:可以用备份 SQL 恢复数据库,然后回退镜像版本。

回滚步骤(简化版)#

Terminal window
# 停掉服务
docker compose down
# 启动数据库容器
docker compose up -d db
# 恢复数据库
cat backups/umami-2026-01-08-1430.sql | docker compose exec -T db psql -U umami umami
# 再启动全部
docker compose up -d
部署 Umami 服务统计博客的访客数、浏览量
https://blog.xhwen.cn/posts/blog/deploy-umami-with-docker/
作者
朗姆提子冰淇淋
发布于
2026-01-08
许可协议
CC BY-NC-SA 4.0

评论

文字让我们短暂相逢。

评论加载中…