Featured image of post 利用 Umami 搭建来源分析服务器,并避免 Umami ApiKey 被泄露的安全问题

利用 Umami 搭建来源分析服务器,并避免 Umami ApiKey 被泄露的安全问题

本文章适用于自建 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 请求来彻底解决这个问题,且不再限制自建服务器。

使用 Hugo 构建
主题 StackJimmy 设计