Plausible Analytics 自部署与 Azure PostgreSQL

什么是 Plausible Analytics?

正如其名,它是一个统计服务,在官网,它是这样介绍自己的:

Plauable Analytics是Google Analytics的简单、开源、轻量级(<1 KB)和隐私友好的替代品。

使用 Plausible Analytics?

你可以在他们的官网注册一个账号,他们将提供30天的免费试用,其后你可以购买如下最低9美元/mo的套餐:
Princing of Plausible Analytics
这样的开源 SaaS 服务也让他们不到四年就年入百万美元:

How we built a $1M ARR open source SaaS

好,至此你已经会使用 Plausible Analytics 了,本文结束(x

开始将 Plausible Analytics 部署到自己的服务器上

正如本文标题所示,我们是要将 Plausible Analytics 部署到自己的服务器上,Plausible Analytics 的设计是要通过 Docker 进行部署。

必备条件

  • 一台 Linux 服务器
    • x86_64 架构并且支持 SSE 4.2 指令集
    • 已安装 Docker 和 Openssl

官方推荐是至少 4 GB 的内存,但我是在 Azure B1ms (仅 1GB 内存) 也是能够运行的,具体还取决于你的站点流量~

  • PostgreSQL 数据库

在官方文档中,默认将 PostgreSQL以容器形式部署在本机,但你看本文的标题就知道,咱是直接使用 Azure PostgreSQL 的,所以本文仅针对外部数据库部署展开,当然,你也使用其他云服务商的 PostgreSQL 数据库而非仅限于 Azure 。

  • 一个域名
    你不会想着把IP嵌入你的网站作为统计吧(?)

开整

克隆仓库

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

如果你没有安装 Git 你开源直接下载并解压

1
2
curl -L https://github.com/plausible/hosting/archive/master.tar.gz | tar -xz
cd hosting-master

生成密钥

Plausible Analytics 需要一个密钥用于加密数据。

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

这时候用个小本本把密钥记下 先把这串密钥保存到一旁

一些基本配置

  • docker-compose.yml

docker-compose.yml 负责将 Plausible Analytics 部署到 Docker 容器中。
我们这里不需要 PostgreSQL,所以我们把他移除。

展开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
version: "3.3"
services:
mail:
image: bytemark/smtp
restart: always

plausible_events_db:
image: yandex/clickhouse-server:21.3.2.5
restart: always
volumes:
- event-data:/var/lib/clickhouse
- ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro
- ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro
ulimits:
nofile:
soft: 262144
hard: 262144

plausible:
image: plausible/analytics:latest
restart: always
command: sh -c "sleep 10 && /entrypoint.sh db migrate && /entrypoint.sh db init-admin && /entrypoint.sh run"
depends_on:
- plausible_events_db
- mail
ports:
- 8000:8000
env_file:
- plausible-conf.env

volumes:
db-data:
driver: local
event-data:
driver: local
geoip:
driver: local

不要忘记移除 && /entrypoint.sh db createdbdepends_on 中的 plausible_db

  • plausible-conf.env

这个文件用于配置 Plausible Analytics:

1
2
3
4
5
6
7
8
9
10
11
12
ADMIN_USER_EMAIL=admin@example.com # 管理员邮箱
ADMIN_USER_NAME=admin # 管理员用户名
ADMIN_USER_PWD=password # 管理员密码
BASE_URL=https://fbiwarning.com # 网站域名
SECRET_KEY_BASE=lEojX0E/ph8HP8htlXdGWR9QwtCGnJiDzrncrzA73UKsFjrRu4pS0EiSlFCfjgCEXqDm+eAA7I5z9DELAh+6SA== # 你所生成的密钥
DATABASE_URL=postgres://username:password@test.postgres.database.azure.com:5432/sqlname # 数据库url 格式为: postgres:# 用户名:密码@数据库地址:端口/数据库名
MAILER_EMAIL=user@yourmail.com # 邮件发送者邮箱
SMTP_HOST_ADDR=smtp.office365.com # 邮件发送服务器地址
SMTP_HOST_PORT=587 # 邮件发送服务器端口
SMTP_USER_NAME=user@yourmail.com # 邮件发送者邮箱
SMTP_USER_PWD=password # 邮件发送者邮箱密码
DISABLE_REGISTRATION=false # 是否禁止注册

这里要注意,Azure PostgreSQL 不支持在 portal.azure.com 上创建数据库,所以我们要提前自行创建。
我在这使用了 Navicat 图形化操作,当然,你也可以在本地安装 PostgreSQL (无需 安装 Server ) 来操作。

Navicat:
Navicat login
使用 Navicat 创建数据库

Pgadmin4:
PgAdmin login
这里要注意,首次打开是需要设置主密码的,否则会出现 Crypt key is missing. :What is “crypt key missing” error in Pgadmin4 and how to resolve it?



这里就要比 Navicat 方便,全部保持默认就行了。

创建好数据库之后,就要非常注意一点 Azure PostgreSQL 要开启一些插件!!!

这里要区分 Azure PostgreSQL 单一服务器 与 灵活服务器

Azure Database for PostgreSQL(单一服务器)中的 PostgreSQL 扩展
Azure Database for PostgreSQL 灵活服务器中的 PostgreSQL 扩展

设置开启拓展
我刚开始没有找到这个地方,它一直提示缺少CITEXT,折腾了好久,终于在这找到开启的的分类,我直接把拓展全开了

  • MaxMind IP Geolocation 数据库

首先要进入 geoip 文件夹,在docker-compose.geoip.yml中可以设置更新频率:

1
- GEOIPUPDATE_FREQUENCY=168 # update every 7 days

geoip.conf设置你的ID和KEY:

1
2
GEOIPUPDATE_ACCOUNT_ID=<your-account-id>
GEOIPUPDATE_LICENSE_KEY=<your-license-key>

ID 和 KEY 在这里获取:
首先 注册 GeoLite2
在此创建
选项选择”No”,生成后要及时将你的ID和KEY替换上面的内容

回到上一级目录,创建自动更新 GeoIP 的容器:

1
docker-compose -f docker-compose.yml -f geoip/docker-compose.geoip.yml up -d

在创建其他服务的容器:

1
docker-compose up -d

如果此时出现了错误,提示数据库不存在,则应运行如下命令:

1
docker run -it --net hosting-master_default --rm --link plausible_events_db_1:clickhouse-server yandex/clickhouse-client --host plausible_plausible_events_db_1  --query "CREATE DATABASE IF NOT EXISTS plausible_events_db"

这里要做相应的替换,替换成你的容器名称
hosting-master_default
docker containers name
如果你是跟着我流程做的一般情况下名称也是上面一样的

至此,你的 Plausible Analytics 已经安装完成,如果还没有跑起来,去仔细查看 docker 的 logs,有疑问也可在评论区留言,或者前往 Github 反馈问题。

更新

1
2
3
docker-compose down --remove-orphans
docker-compose pull plausible
docker-compose up -d

开始使用

这时我们打开 http://服务器IP:8000 即可看到我们的服务啦!

填写你预设的管理员邮箱和密码
添加网站

此时尽管你把这个代码放到了网站上,它依然是不可用的,别忘了我们这还是访问端口,我们还没有操作域名,我们需要将域名指向该服务器,并使用nginx等服务配置反向代理,反代 http://127.0.0.1:8000 在此不做赘述,请参考 nginx 的文档及相关内容。

当年设置好这些后,别忘了你为什么要用 Plausible Analytics。如果你是为了避免访客的广告拦截器阻挡了你的网站统计分析,这样还是完全不足够的,因为广告拦截器能够立即识别到 plausible.js,你还需继续: Adblockers and using a proxy for analytics
Plausible Analytics 提供了如下一些代理:

独立代理:

  • Akamai
  • Cloudflare Workers
  • CloudFront
  • Google Cloud Platform

集成代理:

  • Netlify
  • Vercel
  • Vercel with Next.JS
  • Fresh
  • Nginx
  • Caddy
  • Django
  • Shared hosting on Apache

以 Cloudflare Workers 为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
const ScriptName = '/xiaoshi.js'; // 脚本名称
const Endpoint = '/api/event';

const ScriptWithoutExtension = ScriptName.replace('.js', '')

addEventListener('fetch', event => {
event.passThroughOnException();
event.respondWith(handleRequest(event));
})

async function handleRequest(event) {
const pathname = new URL(event.request.url).pathname
const [baseUri, ...extensions] = pathname.split('.')

if (baseUri.endsWith(ScriptWithoutExtension)) {
return getScript(event, extensions)
} else if (pathname.endsWith(Endpoint)) {
return postData(event)
}
return new Response(null, { status: 404 })
}

async function getScript(event, extensions) {
let response = await caches.default.match(event.request);
if (!response) {
response = await fetch("https://你的域名/js/plausible." + extensions.join("."));
event.waitUntil(caches.default.put(event.request, response.clone()));
}
return response;
}

async function postData(event) {
const request = new Request(event.request);
request.headers.delete('cookie');
return await fetch("https://你的域名/api/event", request);
}

到此,你就可以替换你的 snippet 为你的 workers 上所设置的域名及路径,并开始使用 Plausible Analytics 了。

结语

Plausible Analytics 尽管提供了诸多方法以避免被广告拦截器拦截(这些方法也是值得借鉴的),但其过于简陋的后台,可能未必能满足部分人的需求
一览
但是,Plausible Analytics 可以提供更多的功能,比如:关联到 Google Search Console、各类事件邮件通知、API 调用、分享统计……

关于更多内容,请参考 Plausible Analytics

参考链接:
Debian 11 使用 Docker 安装 Plausible Analytics 自建网站统计