如果需要统计博客访问的相关数据,一般会选择「百度统计」或是「谷歌分析」。前者面向中文用户,在数据展示上会更加直观;后者面向全球,功能丰富数据详细,只是需要一定的学习成本和使用门槛。

当然,你也可以尝试自己搭建一个统计工具,将数据完全掌握在自己的手里。比如使用 Umami

本文于近期(2025年6月)简单更新了下,前置了容器安装的方法,更新了 Umami 的 Github 链接。其余部分未改动。整体内容仅供参考。

安装

容器安装

现在已经是 5202 年了,自行编译构建程序那叫一个麻烦!最简单的方法还是用 Docker 来部署 Umami。

参考「Docker -- 从入门到实践」中的教程安装完 Docker-CE 和 docker-compose 后,创建 docker-compose.yml 文件。填入以下内容:

services:

  umami:
    image: ghcr.io/umami-software/umami:postgresql-latest
    container_name: umami
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://umami:umami@umami-db:5432/umami
      DATABASE_TYPE: postgresql
      APP_SECRET: replace-me-with-a-random-string #生成一个随机数替换这里
    depends_on:
      umami-db:
        condition: service_healthy
    restart: always
    healthcheck:
      test: ["CMD-SHELL", "curl http://umami:3000/api/heartbeat"]
      interval: 5s
      timeout: 5s
      retries: 5
    networks:
      - umami

  umami-db:
    image: postgres:15-alpine
    container_name: umami-db
    user: 1000:1000
    environment:
      POSTGRES_DB: umami
      POSTGRES_USER: umami
      POSTGRES_PASSWORD: umami
    volumes:
      - ./database:/var/lib/postgresql/data
    restart: always
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 5
    networks:
      - umami
      
networks:
  umami:
    external: true

因为随着统计数据的日积月累,数据库占用会越来越大,所以这里我使用的是 umami:postgresql 版本。即不使用 MySQL,而是改为使用 PostgreSQL 并将数据文件存储在指定文件夹中。

另外,我创建了一个 umami 网络,你可以删除 networks 字段,或者使用 docker network create umami 也创建一个 umami 网络,用以隔离容器。

之后控制台执行 docker compose up -d 启动即可。

编译安装

或者,你想体验一下编译安装的乐趣,可以自行编译。但是下面这些步骤写于 2020 年,不保证现在也适用。

首先,安装 Umami 需要一个基本的 LNMP 环境,然后再安装 nodejsnpm

先安装 Nodejsnpm

curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
apt-get install -y nodejs
apt-get install -y npm

安装完毕之后,可以用 node -vnpm -v 检查版本。

然后下载 Umami:

git clone https://github.com/mikecao/umami.git
cd umami
npm install

接着创建一个空数据库,比如 umami,然后在 umami 目录中输入:

mysql -u username -p databasename < sql/schema.mysql.sql

username 一般是 rootdatabasename 就是你创建的空数据库的名字,具体例子是:

mysql -u root -p umami < sql/schema.mysql.sql

你也可以在 phpmyadmin 中手动导入到空数据库中。

随后创建配置文件。在 umami 目录中新建一个 .env 的配置文件,填入:

DATABASE_URL=(connection url)
HASH_SALT=(any random string)

其中,connection url 需要填入:

mysql://username:mypassword@localhost:3306/mydb

any random string 填入的是随机字符串,完整的例子是:

DATABASE_URL=mysql://username:mypassword@localhost:3306/mydb
HASH_SALT=123456789

注意去掉括号

编译:

npm run build

启动程序。通常使用 npm start 就可以直接启动,但是退出 ssh 之后就直接停止运行了,所以需要用一些工具保证后台运行,官方文档中的推荐是:

npm install pm2 -g
cd umami
pm2 start npm --name umami -- start 
pm2 startup
pm2 save

这样就可以用了。

后续如有更新 Umami,首先停止运行:

pm2 stop umami

获取更新

git pull

可能会遇到获取更新失败。我也不知道为啥我这每次都失败,可以用这个命令 git reset --hard,然后再执行上一步 git pull
然后重新编译

npm install
npm run build

重新启动

pm2 restart umami

页尾版本号有发生变化,那就是更新成功了。

反向代理

如果是使用容器部署,映射并暴露了端口,那么 ip:3000 是可以直接访问的。为了配合域名访问,建议使用 Nginx 或 Caddy 反向代理 Umami。

这里以 Nginx 举例。在 server 段加入配置:

server {
  server_name umami.yourdomain.com;

  location / {
    proxy_pass http://localhost:3000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

使用

进入后台,登录名是 admin,密码我有些忘了,好像默认是 umami。好像一开始登录还会要求修改密码,我也忘了……

登陆成功之后,第一件事自然是修改语言。右上角修改语言为中文,然后添加网站。注意域名处填写纯域名,开头不要带 https://,结尾不要带 /

之后将跟踪代码填入网站的相应位置,就可以开始数据记录了。

体验

「简洁」,是 Umami 的一大特色。首页以图表形式列出访问量、访问时长等基本信息,而柱状图则可以更直观地了解各个时间段网站的访问情况。

而更详细的数据如流量来源、着陆页,访客设备、地区等,可以在「查看更多」找到。美中不足的是,访客地区的统计并不准确。

在使用 Umami 之前,我也体验过一段时间的「Matomo」。Matomo 开启首页需要较长的加载时间,页面存在着无法关闭的开发者广告。功能丰富但略显臃肿。随着使用时间一长,统计数据量的增加,也会拖慢 Matomo 的运行效率,就需要更高规格的设备才能长期运行,总结下来就是整体使用体验不太好。Umami 则不同,在设计上就主张简洁、快速,运行占用资源低,配置简单,因此在加载上更迅速,使用起来更轻松,只是简洁意味着众多功能的缺失。

不过对于小博客博主来说,这些基础功能就足够了。

其他

从 V1 迁移至 V2

Umami 最近更新到了 V2 版本,数据库连接方式发生了改变,需要手动执行一下迁移命令。如果是使用 Docker 的话,可以这么迁移。

这里参考了 Github 上的 Issue:https://github.com/umami-software/umami/issues/1887

在确保设置好 DATABASE_URL 的前提下执行以下操作。

首先,将 Umami 的镜像修改成 V1 版本,例如:

image: ghcr.io/umami-software/umami:mysql-v1.40

启动后,进入到 容器内部终端:

docker exec -ti -u 0 umami sh

其中,umami 是你设置的容器的名字,请注意修改。

接着,执行如下命令:

apk add git

如果安装不动,可以再执行一下换源命令:

sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories

然后再安装 git

接着,拉取迁移脚本:

git clone https://github.com/umami-software/migrate-v1-v2.git

如果拉去不动,可以在链接前加入 https://ghproxy.com/ 加速:

git clone https://ghproxy.com/https://github.com/umami-software/migrate-v1-v2.git

拉取完成后,进入该脚本内:

cd migrate-v1-v2

执行以下命令:

yarn install

接着依次执行以下命令:

yarn build

脚本会提示「Which database are you using?」 请选择你使用的数据库类型,按方向键选择。
接着执行:

yarn start

运行到最后,脚本会提示「Do you want to delete V1 database tables? (Y/N)」是否删除 V1 数据?我是删了的,因为数据库太大了。

然后输入 exit 退出终端,将镜像修改回 mysql-latest ,重新启动容器,即可完成升级工作。

新版界面长这样:

最后,你还要修改一下脚本代码,因为从 umami.js 改成 script.js 了,大概是为了防那些广告插件。毕竟 umami.js 已经进黑名单了。

参考

  1. Linux 发行版安装 Nodejs
  2. GitHub:Umami
  3. Umami 文档