Umami:隐私友好的 Google Analytics 替代品

在当今数字化时代,数据分析对于网站和应用程序的成功至关重要。许多企业依赖 Google Analytics 来跟踪用户行为和网站性能,但随着隐私问题的日益严重,越来越多的人开始寻找替代方案。Umami 就是这样一个简单、快速且注重隐私的分析工具。

https://github.com/umami-software/umami

什么是 Umami?

Umami 是一个简单、快速、注重隐私的分析工具,听起来是不是很酷?它就像是 Google Analytics 的小兄弟,但更懂得保护你的隐私。Umami 不会像某些人一样偷偷收集你的数据,反而会让你安心地追踪网站的访问情况

Umami 的超级能力

  • 隐私保护:Umami 不用 cookies,也不收集任何个人信息。你可以放心地追踪数据,而不必担心被大数据公司盯上。

  • 简单易用:Umami 的界面就像一杯清爽的柠檬水,简单明了。无论你是技术小白还是编程高手,都能轻松上手。

  • 自托管选项:想要完全掌控数据?Umami 允许你将其部署在自己的服务器上,数据安全得像是藏在保险箱里。

4. 多种数据库支持:无论你是 PostgreSQL、MySQL 还是 MariaDB 的粉丝,Umami 都能满足你的需求

  • 实时分析:想知道你的网站现在有多少人访问?Umami 会实时告诉你,简直就像是你网站的私人侦探。

如何安装 Umami?

安装 Umami 很简单,步骤不多。推荐按照docker-compose的方式安装。

https://umami.is/docs/install

docker-compose部署

services:
  umami:
    image: docker.umami.dev/umami-software/umami:mysql-latest
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 500M
        reservations:
          cpus: '0.25'
          memory: 200M
    ports:
      - "30010:3000"
    environment:
      DATABASE_URL: mysql://username:password@ip:port/db
      DATABASE_TYPE: mysql
      HASH_SALT: xxxxx
    restart: always

参数说明:

  • image: docker.umami.dev/umami-software/umami:mysql-latest:指定要使用的Docker镜像。这里使用的是Umami软件最新的MySQL版本。

  • deploy::当这个配置文件被Docker Swarm使用时,这部分指定了如何部署服务。

    • resources::定义了服务运行所需的资源限制和预留。

      • limits::设置了容器可以使用的最大资源量。

        • cpus: '0.50':限制CPU使用不超过0.5个核心。

        • memory: 500M:限制内存使用不超过500MB。

      • reservations::设置容器至少需要保证的资源量。

        • cpus: '0.25':至少预留0.25个核心给该容器。

        • memory: 200M:至少预留200MB内存给该容器。

  • ports::将宿主机上的端口30010映射到容器内的3000端口,使得可以通过访问宿主机的30010端口来访问运行在容器内3000端口上的服务。

  • environment::设置环境变量,这些变量通常用于配置应用程序的行为。

    • DATABASE_URL: mysql://username:password@ip:port/db:数据库连接字符串,需要替换usernamepasswordipport以及db为实际值。

    • DATABASE_TYPE: mysql:指定数据库类型为MySQL。

    • HASH_SALT: xxxxx:安全散列盐值,用于加密处理,增强安全性。应替换xxxxx为你自定义的安全盐值。

  • restart: always:无论退出状态码是什么,都总是重启容器。这确保了即使服务意外停止,也会自动重新启动。

nginx反向代理

upstream umami {
    server 127.0.0.1:30010;
}
server {
    listen 80;
    server_name xxx;

    return 301 xxx;
}

server {
    listen 443 ssl;
    server_name xxx;
    add_header Referrer-Policy "strict-origin-when-cross-origin";

    if ($request_method = 'OPTIONS') {
            return 204;
    }
    add_header Access-Control-Allow-Origin '*';
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
    add_header Content-Security-Policy 'frame-ancestors xxx';  # iframe 的,分享链接嵌入
    # SSL 相关配置
    ssl_certificate xxx;
    ssl_certificate_key xxx;

    # 启用 gzip 压缩
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    location / {
        proxy_pass http://umami;
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_hide_header 'Access-Control-Allow-Origin';
        proxy_hide_header 'Content-Security-Policy';
    }
}

参数说明:

Upstream Block

  • upstream umami { server 127.0.0.1:30010; }:定义了一个名为umami的上游服务器组,它指向本地(本机)运行在30010端口上的服务。这通常对应于Docker容器中运行的Umami应用。

HTTP Server Block (Port 80)

  • listen 80;:监听HTTP流量的80端口。

  • server_name xxx;:这里应填写实际的域名或IP地址,代表该服务器块所对应的主机名。

  • return 301 xxx;:将所有通过80端口进入的请求重定向到指定的URL(xxx需要替换为实际目标URL)。这通常用于强制用户从HTTP切换到更安全的HTTPS连接。

HTTPS Server Block (Port 443)

  • listen 443 ssl;:监听HTTPS流量的443端口,并启用SSL支持。

  • server_name xxx;:同样地,这里也需要填写实际的域名。

  • add_header Referrer-Policy "strict-origin-when-cross-origin";:设置引用策略,控制浏览器如何发送referrer信息。

  • if ($request_method = 'OPTIONS') { return 204; }如果请求方法是OPTIONS,则直接返回204 No Content状态码,常用于预检请求(CORS跨源资源共享)。

  • 接下来的几行设置了CORS相关的响应头,允许来自任何源的请求,并指定了允许的方法和头部。

  • Content-Security-Policy:内容安全策略,限制了哪些来源可以被用作iframe的父级页面。

  • ssl_certificate xxx;ssl_certificate_key xxx;:指定SSL证书和私钥的位置,以实现HTTPS加密。

  • 启用了gzip压缩,以减少传输数据大小。

  • location / { ... }:对根路径下的请求进行处理。

    • proxy_pass http://umami;:将请求转发给之前定义的umami上游服务器。

    • proxy_set_header指令用来设置传递给后端服务的HTTP头信息,如原始请求的主机名、协议类型等。

    • proxy_hide_header用于移除由后端响应返回的一些特定头信息,以便客户端无法看到这些信息。

创建website

打开反向代理之后的页面,默认的账号、密码为admin和umami。

按照文档新增website既可。

https://umami.is/docs/add-a-website

image.png

跟踪

因为我用的是halo的插件,https://github.com/halo-sigs/plugin-umami。

只需要在插件的设置页面填好,不用额外在脚本注入里面填跟踪代码。否则每次都会触发两次记录。

更新umami

因为我是用docker-compose部署的,可以用--build参数强制重新构建,或者也可以拉取新的镜像。

docker pull docker.umami.is/umami-software/umami:mysql-latest

其他部署方式可以参考 https://umami.is/docs/updates

非常感谢您的阅读!希望上述信息能够对您有所帮助。