简单、隐私友好的谷歌分析替代品,Plausible 自托管部署指南

本文转自 Déjà Vu 的博客,原文:https://dejavu.moe/posts/plausible-selfhosted-with-docker-complete-guide/,版权归原作者所有。欢迎投稿,投稿请添加微信好友:cloud-native-yang

前言

Umami 是一个很棒的自托管网站统计服务,我使用它快一年了。目前为止它仍然无法在 ARM 架构的服务器上部署,此前我一直使用 Vercel + Supabase 托管它。

2866aec72bad6372f45b77751349c089.png
Umami

Umami 用于统计的 JavaScript 脚本体积接近 3KB。

b8d7ebed93d04a37565fc69bef6f723a.png
Umami.js

介绍

最近我瞄上了易于使用和隐私友好的谷歌分析替代品──Plausible[1]|演示地址[2],他们提供付费托管服务,但也开放源码让用户可以自行托管。Plausible 比 Umami 还要轻量很多,用于统计的脚本体积只有 1KB 左右。

860bfd34ccb41cca5d6043d575380854.png
Plausible.js

为了方便用户自部署,他们甚至专门开了个编排容器及相关配置的仓库 plausible/hosting[3],此前有用户要求的 ARM64 架构的也早就上线了,非常 Nice 有没有 🤗!

先决条件

  • 已安装 Docker

  • 已安装 Docker Compose

  • 已安装 Nginx

准备

plausible/hosting[4] 的有些服务我们用不上,我删除了。

SSH 登录服务器,下载所需文件

mkdir plausible && cd plausible \
&& wget https://dejavu.moe/posts/plausible-selfhosted-with-docker-complete-guide/plausible.tar.gz

解压文件

tar -xzvf plausible.tar.gz \
&& rm plausible.tar.gz

现在这个文件目录应该是这样的

.
├── README.md # 备注
├── clickhouse  # Clickhouse
│   ├── clickhouse-config.xml
│   └── clickhouse-user-config.xml
├── docker-compose.yml
├── geoip # GeoIP 相关配置
│   └── geoip.conf
└── plausible-conf.env # Plausible 环境变量

使用 GeoLite2

Plausible 默认使用 dbip[5] 的 GeoIP 数据库,也可以使用 MaxMind 提供的 GeoLite2 数据库,步骤如下:

关闭代理,点击 注册 GeoLite2[6] 链接,填写必要的信息,提交。

064bf8fde51730db5a6f3803240ec5bd.png
Signup

收到有设置密码的邮件:

2f153335f2092e43a2042bcd695ee2f4.png
Signin

登录后就可以创建 GeoLite2 API Key 了。

9593bda7fcc2cf91f0173867c2d6e618.png
GeoLite2

提交后,复制 Account ID 和 License key 写到 geoip/geoip.conf 里保存。

GEOIPUPDATE_ACCOUNT_ID=123456
GEOIPUPDATE_LICENSE_KEY=abcdEFCDhijklmop

编辑 Plausible 的环境变量文件 plausible-conf.env

DISABLE_REGISTRATION=true  # 禁止用户注册
BASE_URL=https://stats.dejavu.moe  # 部署 Plausible 的 BaseURL
SECRET_KEY_BASE=FhNHzoWJyoQgT21RsFQG+KUzJ/o5YbKsszc6CMOArA0OXxjZ763oCGiItOPlKJAfIQO0uov8xt8p5k+MqtmtOQ==

生成一串随机字符,写到上面的 SECRET_KEY_BASE 里:

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

// 示例输出
FhNHzoWJyoQgT21RsFQG+KUzJ/o5YbKsszc6CMOArA0OXxjZ763oCGiItOPlKJAfIQO0uov8xt8p5k+MqtmtOQ==

部署

现在可以开始部署了

sudo docker compose up -d

在 Cloudflare 生成一个源服务器证书 2[7],并安装,更多帮助[8]。下面是一个示例 Nginx 配置文件

server {
    listen 80;
    listen [::]:80;
    # 替换为您的域名
    server_name plausible.your.domain;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    # 替换为您的域名
    server_name plausible.your.domain;

    access_log /var/log/nginx/plausible.access.log;
    error_log /var/log/nginx/plausible.error.log;
		
    # 替换为您的实际(源服务器)SSL 证书路径
    ssl_certificate /etc/nginx/cert/xxx.your.domain.pem;
    ssl_certificate_key /etc/nginx/cert/xxx.your.domain.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_ciphers 'TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+AESGCM:EDH+AESGCM:EECDH+CHACHA20:EDH+CHACHA20:EECDH+AES128:EDH+AES128:EECDH+AES256:EDH+AES256:EECDH+3DES:EDH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS';

    location / {
        proxy_pass http://127.0.0.1:8088;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect off;
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
    }
}

检查 Nginx 配置文件

sudo nginx -t

重载配置文件

sudo systemctl reload nginx

现在在 Cloudflare 控制台将 DNS 解析到服务器 IP 即可访问啦,第一次访问创建的用户即是管理员,登录后,就可以添加网站啦🤤

f21ea9645f28d833e9843628db8b7fb9.png
Setup

添加发信邮箱【可选】

使用外部 SMTP 发信邮箱,编辑 Plausible 环境变量文件

vim plausible-conf.env

添加下面内容

MAILER_EMAIL=plausible@your.domain # 发信邮箱
SMTP_HOST_ADDR=smtp.your.domain # SMTP 主机名
SMTP_HOST_PORT=625 # SMTP 端口
SMTP_USER_NAME=plausible@your.domain # 发信邮箱用户名
SMTP_USER_PWD=admin1234567890 # 发信邮箱密码
SMTP_HOST_SSL_ENABLED=true # 是否启用 SSL?
SMTP_RETRIES=2 # 发信重试次数

然后重启容器

sudo docker compose down --remove-orphans \
&& sudo docker compose up -d

没问题的话可以去 Plausible 后台开启每周/每月/异常流量邮件报告,当然这个邮箱也可以在你忘记密码的时候用来重置密码 🤤

2adea6686ff199488905a6858f2abf75.png
SMTP

重写路径【建议】

Plausible 是一个极其尊重隐私的网站统计服务,它:

  • 与广告技术和监视资本主义无关

  • 不收集任何个人数据,所有统计数据仅为汇总数据

  • 没有跨站点或跨设备跟踪

  • 您 100% 拥有您的网站数据,不会将其发送、共享或出售给任何第三方

  • 完全开源的网络分析软件,可以自行托管

即使如此,它 仍然[9] 被一些广告过滤器规则所屏蔽,作为网站管理员,我们可以使用反向代理脚本和 API 路由来减少被广告过滤器误杀的风险,按照官网文档,至少可以使用的是:

  • Cloudflare Workers[10]

  • Akamai[11]

  • Netlify[12]

  • Vercel[13]

  • CloudFront[14]

  • Nginx[15]

  • Caddy[16]

我的服务依赖 Cloudflare,但 Cloudflare Workers 每日请求数有限制,因此在本文中,我会使用 Cloudflare 转换规则 下面的 重写 URL 规则 来完成这个过程,它实施起来非常容易。

在 Plausible 控制台获取到站点统计的脚本示例如下:

<script defer data-domain="blog.your.domain" src="https://plausible.your.domain/js/script.js"></script>

其中:

  • plausible.your.domain 是您部署 Plausible 的域名;

  • blog.your.domain 是您安装 Plausible 统计脚本的域名。

创建重写 URL 规则:

d72bf8f4e948174fc5172ff3c6bd9b15.png
Add Rewrite Rules

规则名称随便填,传入请求匹配自定义筛选表达式:

e5beba076410ea9cc5ba2fe72f055bc7.png
Rewrite Script Rule

同理,再添加一条规则,重写 API 路由:

74aacaec148c6944a511b750fc80b14a.png
Rewrite API Rule

接下来,修改安装到被统计站点的脚本如下:

<script
  src="https://plausible.your.domain/js/vue.min.js"
  data-api="https://plausible.your.domain/stats/car/benz"
  data-domain="blog.your.domain"
></script>

如果您的站点使用 Plausible 的其他 统计脚本拓展[17] 也按照上面修改就可以。

统计关键词【可选】

Plausible 支持集成 Google Search Console[18],可以获得通过搜索引擎得到的关键词统计,详细配置流程可参阅 Plausible 文档[19],步骤如下:

  • 在 Google Cloud Console[20] 创建一个新项目;

  • 配置 OAuth 同意屏幕;

  • 创建一个 OAuth 客户端,获取 Client ID 和 CLIENT SECRET;

  • 启用 Google Search Console API[21]

将 Client ID 和 Client Secret 添加到 Plausible 环境变量文件里:

GOOGLE_CLIENT_ID=xxxx
GOOGLE_CLIENT_SECRET=yyyy

重启容器即可:

sudo docker compose down --remove-orphans \
&& sudo docker compose up -d

之后在 Plausible 配置下 Google 集成即可:

7481f81a38d473788c535b5ca82b681c.png
Google Integration

城市精细度【可选】

Plausible 的 v1.5.1[22] 版本新增一条可选配置项,完成这步可获得精细度达到省(州)到具体城市的统计效果,但会额外消耗 1GB 左右的 RAM,请酌情选择。

在前面部署好 Plausible 服务后,进入 geoip 文件夹,下载所需数据库:

cd geoip
curl -O https://s3.eu-central-1.wasabisys.com/plausible-application/geonames.csv
# 将 LNpsJCCKPis6XvBP 替换为您的 GeoLite2 API Key
export MAXMIND_LICENSE_KEY=LNpsJCCKPis6XvBP
curl -L "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=${MAXMIND_LICENSE_KEY}&suffix=tar.gz" -o geolite2-city.mmdb.gz
gunzip geolite2-city.mmdb.gz

回到 Plausible 根目录:

cd ..
# 编辑环境变量
vim plausible-conf.env
# 添加下面两行
GEONAMES_SOURCE_FILE=/etc/app/geonames.csv
IP_GEOLOCATION_DB=/etc/app/geolite2-city.mmdb

编辑 docker-compose.yml 文件:

vim docker-compose.yml
# 添加两行(有 + 标记的两行)
 plausible:
    image: plausible/analytics:latest
    restart: always
    command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run"
    ...
    volumes:
       - ./geoip:/geoip:ro
+      - ./geoip/geonames.csv:/etc/app/geonames.csv:ro
+      - ./geoip/geolite2-city.mmdb:/etc/app/geolite2-city.mmdb:ro

重新创建容器即可:

sudo docker compose down && sudo docker compose up -d

参考信息

  • Getting started | Plausible docs[23]

引用链接

[1]

Plausible: https://plausible.io/

[2]

演示地址: https://plausible.io/plausible.io

[3]

plausible/hosting: https://github.com/plausible/hosting

[4]

plausible/hosting: https://github.com/plausible/hosting

[5]

dbip: https://db-ip.com/

[6]

注册 GeoLite2: https://www.maxmind.com/en/geolite2/signup

[7]

2: https://dejavu.moe/posts/plausible-selfhosted-with-docker-complete-guide/#fn:2

[8]

更多帮助: https://dejavu.moe/posts/best-server-security-practices-with-cloudflare/#源服务器证书

[9]

仍然: https://plausible.io/docs/proxy/introduction

[10]

Cloudflare Workers: https://plausible.io/docs/proxy/guides/cloudflare

[11]

Akamai: https://plausible.io/docs/proxy/guides/akamai

[12]

Netlify: https://plausible.io/docs/proxy/guides/netlify

[13]

Vercel: https://plausible.io/docs/proxy/guides/vercel

[14]

CloudFront: https://plausible.io/docs/proxy/guides/cloudfront

[15]

Nginx: https://plausible.io/docs/proxy/guides/nginx

[16]

Caddy: https://plausible.io/docs/proxy/guides/caddy

[17]

统计脚本拓展: https://plausible.io/docs/script-extensions

[18]

Google Search Console: https://search.google.com/search-console/

[19]

Plausible 文档: https://plausible.io/docs/google-search-console-integration

[20]

Google Cloud Console: https://console.developers.google.com/

[21]

Google Search Console API: https://console.developers.google.com/apis/api/searchconsole.googleapis.com

[22]

v1.5.1: https://github.com/plausible/analytics/releases/tag/v1.5.1

[23]

Getting started | Plausible docs: https://plausible.io/docs/self-hosting

f3a4ac8da6a741a27e1a4802eb3b55ff.gif

f1e7f182f9c49631b924dc0105759709.png

你可能还喜欢

点击下方图片即可阅读

我用 Laf 三分钟写个 ChatGPT,Laf 创始人:明天来上班!

2023-03-14

d810b43f94c4384edea1931caa924e25.jpeg

三分钟拥有自己的 ChatGPT (从开发到上线)

2023-03-12

af64060b1de81f0ef1e113f71bb8f721.jpeg

Grafana 展示的 CPU 利用率与实际不符的问题探究

2023-03-07

22907e9dd478559722843f14033d02f2.jpeg

094aeedce26d34b300c9c6c98d44229d.gif

云原生是一种信仰 🤘

关注公众号

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!

f2861bd0df1324d10b9404da39c4eabc.gif

cc4dc93f29949c97564f946e1ccb10f5.gif

点击 "阅读原文" 获取更好的阅读体验!

发现朋友圈变“安静”了吗?

4b3b64e6a8d514d1bf5c600121a0959e.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值