本文章适用于自建 Umami 服务器。
这两天给网站增加了来源分析,文章标题处显示点击量,用到的是 Umami 分析平台。
Docker Compose 方式搭建
这里我们使用的是 postgresql 版的镜像 ghcr.io/umami-software/umami:postgresql-latest
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
|
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
container_name: umami
ports:
- "127.0.0.1:3000:3000"
environment:
DATABASE_URL: postgresql://umami:umami@db:5432/umami
DATABASE_TYPE: postgresql
APP_SECRET: <your secret string>
depends_on:
db:
condition: service_healthy
init: true
restart: unless-stopped
db:
image: postgres:15-alpine
container_name: umami_db
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: umami
volumes:
- db:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
volumes:
db:
|
反向代理
再用 nginx 进行服务反代(这一步比较重要,后面为了解决安全问题要进行请求过滤)
1
2
3
4
5
6
7
8
9
|
server {
listen 80;
server_name u.example.com;
location / {
include proxy_pass.conf; # 这里引入预定义的 proxy 请求头
proxy_pass http://127.0.0.1:3000;
}
}
|
这样我们的服务就搭建完成了,后面可以利用 Cloudflare Tunnel 把服务穿透给你的域名。
安全问题
但是问题出现了,静态网站获取 url 点击量势必需要把 token 存放在前端页面中(或者利用 Cloudflare Worker 的方式规避,这里暂时不深入),如何避免其他用户获取了 token 以后登录 Umami 站点的管理页面呢?
有个简单的方法是白名单指定的 url 请求,我们统计、查看所用到的请求地址只有 /script.js
, /api/send
, /api/websites/<id>/stats
这三个,所以我们在 nginx 反代的地方进行过滤:
1
2
3
4
5
6
7
8
9
10
11
12
|
server {
...
location ~ ^/(script.js|api/send|api/websites/[0-9a-f-]+/stats)$ {
inclue proxy_pass.conf;
proxy_pass http://127.0.0.1:3000;
}
location / {
return 404;
}
}
|
新的问题
这样我们的安全问题就解决了,但是这样一来我们就只能在内网环境下登录查看统计数据。
下一篇文章中我们会使用 Cloudflare Worker 的方式包装 stats 请求来彻底解决这个问题,且不再限制自建服务器。