转载自 我的个人博客先聊聊我的博客上线以后一直有个痒点到底有没有人看Google Analytics 能回答这个问题但我实在不想装——一个统计脚本几十 KB拖慢加载速度不说还把每个访客的行为数据送给 Google。我的博客连广告都没挂凭什么帮你收集用户数据后来发现了 Umami。开源、自建、一个脚本不到 2KBDashboard 简洁到不用学。更香的是它有 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.ymlversion: 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 nginxcertbot --nginx会自动改 nginx 配置但可能把 SSL 写进default文件导致 HTTPS 命中静态文件反代失效。第三步在 Umami 添加网站打开https://umami.你的域名.com登录后在 Settings → Websites → Add websiteName随便填比如 RyuChan BlogDomain填博客域名比如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你可以把有人在看你的文章这件事变成访客也看得见的数字。写博客最需要的就是这个。有问题欢迎在评论区交流博客地址见主页。
不想把访客数据送给 Google?15 分钟自建 Umami 网站统计先聊聊
发布时间:2026/6/3 1:03:27
转载自 我的个人博客先聊聊我的博客上线以后一直有个痒点到底有没有人看Google Analytics 能回答这个问题但我实在不想装——一个统计脚本几十 KB拖慢加载速度不说还把每个访客的行为数据送给 Google。我的博客连广告都没挂凭什么帮你收集用户数据后来发现了 Umami。开源、自建、一个脚本不到 2KBDashboard 简洁到不用学。更香的是它有 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.ymlversion: 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 nginxcertbot --nginx会自动改 nginx 配置但可能把 SSL 写进default文件导致 HTTPS 命中静态文件反代失效。第三步在 Umami 添加网站打开https://umami.你的域名.com登录后在 Settings → Websites → Add websiteName随便填比如 RyuChan BlogDomain填博客域名比如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你可以把有人在看你的文章这件事变成访客也看得见的数字。写博客最需要的就是这个。有问题欢迎在评论区交流博客地址见主页。