去年写过一篇 使用 Umami 自建网站流量统计分析工具 的文章,使用 Umami 期间总体不错,但迫于不熟悉 nodejs,每次更新 build 总会跳一堆错误,趁着假期准备换一个更方便的工具。其实以前也折腾过不少 Web Analytics 工具( 推荐 5 款免费开源的网站流量分析统计工具 ),这里再记录一下自建 Plausible Analytics 的过程。

docker-plausible-web-analytics

其实自建过程在官方文档里已经很详细了,通过 Docker Compose 搭建几行命令就完事了。安装 Docker 和 Docker Compose 可以参考文章: Debian 系统安装 Docker 教程

安装和更新

1. 安装

在合适的文件目录下克隆仓库文件:

git clone https://github.com/plausible/hosting
cd hosting

此时目录下会有两个文件需要配置:

  • docker-compose.yml:配置 Docker Compose,包括网络、数据库、SMTP 等;
  • plausible-conf.env:配置 Plausible 服务,完整的配置文件可以参考这里

其中需要注意的是 BASE_URL 是你的域名地址(例如:http://yourdomain.com 或者 https://web.yourdomain.com,目前不支持子目录),而 plausible-conf.env 则需要一个随机的 64 位字符 SECRET_KEY_BASE 用来提高安全性,可以通过下面的命令生成:

openssl rand -base64 64 | tr -d '\n' ; echo

在该目录下启动服务:

docker compose up -d

默认会运行在 http://{hostname}:8000,第一次登录时可能会要求验证邮箱地址,如果前面没有配置 SMTP,可以通过下面的命令认证所有当前用户:

docker compose exec plausible_db psql -U postgres -d plausible_db -c "UPDATE users SET email_verified = true;"

添加网站(如下图,只需要输入根域名)之后将分析链接放入相应网站的 head 中即可。

plausible-add-website

Plausible 默认使用 dbip 的 IP 数据库,支持更换为 MaxMind,具体可以参考官方文档

2. 更新

Docker Compose 的更新比较简单:

docker compose down --remove-orphans
docker compose pull plausible
docker compose up -d

配置 Nginx 反代

使用 Nginx 反带记得提前将前面 docker-compose.yml 中的 Plausible 服务端口修改为 127.0.0.1:8000 并重启服务,一个简单的 Nginx 部分配置如下:

location / {
    proxy_pass http://localhost:8000;
    proxy_http_version 1.1;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header X-Forwarded-Proto $scheme;
}

被去广告插件拦截

毫无疑问,Plausible 也是被常见的去广告规则拦截了的,例如 EasyPrivacy,目前可以通过 proxy_pass 来解决,下面分享下我自用的配置:

location = /custom.js {
    rewrite /custom.js /js/plausible.js break;
    proxy_pass http://localhost:8000;
    proxy_http_version 1.1;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location = /event {
    rewrite /event /api/event break;
    proxy_pass http://localhost:8000;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host  $host;
}

相应网站中的链接也需要修改:

<script defer data-domain="example.com" data-api="https://yourdomain.com/event" src="https://yourdomain.com/custom.js"></script>