2024-07-22 18:47:14 +08:00
|
|
|
|
# Umami
|
|
|
|
|
|
|
|
|
|
为速度和效率而构建的网站分析
|
|
|
|
|
|
|
|
|
|
Umami 网站分析提供您实时做出决策所需的数据。
|
|
|
|
|
|
|
|
|
|
![Umami](https://file.lifebus.top/imgs/umami_cover.jpg)
|
|
|
|
|
|
2024-08-02 18:36:28 +08:00
|
|
|
|
![](https://img.shields.io/badge/%E6%96%B0%E7%96%86%E8%90%8C%E6%A3%AE%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E5%AE%A4-%E6%8F%90%E4%BE%9B%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81-blue)
|
2024-08-02 18:26:48 +08:00
|
|
|
|
|
2024-08-24 14:48:45 +08:00
|
|
|
|
## 声明
|
|
|
|
|
|
|
|
|
|
> 该应用默认使用 `PostgreSQL` 作为基础数据库,原使用 `MySQL` 数据库的用户需要进行卸载重新安装 `MySQL` 版本。
|
|
|
|
|
>
|
|
|
|
|
> 卸载重装请注意参数保持一致,持久化目录也必须保持一致。
|
|
|
|
|
|
2024-07-22 18:47:14 +08:00
|
|
|
|
## 简介
|
|
|
|
|
|
|
|
|
|
Umami 让您轻松分析数据
|
|
|
|
|
|
|
|
|
|
+ 便于使用
|
|
|
|
|
|
|
|
|
|
Umami 功能强大而简单,易于使用和理解,不需要复杂的设置或标签配置。
|
|
|
|
|
|
|
|
|
|
+ UTM 和自定义事件
|
|
|
|
|
|
|
|
|
|
Umami 会自动理解带有 UTM 参数的链接,并让您根据 UTM 查看和过滤您的网站数据。此外,您还可以跟踪网站上的任何事件,例如按钮点击、表单提交、购买、新闻通讯注册等。
|
|
|
|
|
|
|
|
|
|
+ 没有 Cookie 横幅
|
|
|
|
|
|
|
|
|
|
所有数据均经过 Umami 匿名处理,并且不会收集您网站用户的任何个人信息。您无需选择加入 Cookie
|
|
|
|
|
横幅即可跟踪网站的性能,从而为您的用户提供更好、更值得信赖的体验。
|
|
|
|
|
默认情况下,Umami 符合 GDPRP 和 CCPA。
|
|
|
|
|
|
|
|
|
|
## 环境准备
|
|
|
|
|
|
|
|
|
|
+ 数据库支持
|
|
|
|
|
+ `MySQL` 版本:`5.7+`
|
|
|
|
|
+ `PostgreSQL` 版本:`12.14+`
|
|
|
|
|
|
|
|
|
|
## 安装说明
|
|
|
|
|
|
|
|
|
|
> 默认管理员帐户
|
|
|
|
|
>
|
|
|
|
|
> 用户名: admin
|
|
|
|
|
>
|
|
|
|
|
> 密码: umami
|
2024-08-02 18:26:48 +08:00
|
|
|
|
|
2024-08-09 12:41:56 +08:00
|
|
|
|
## 反向代理
|
|
|
|
|
|
|
|
|
|
> Nginx
|
|
|
|
|
|
|
|
|
|
如果您的请求头中存在自定义字段,请修改:
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
add_header Access-Control-Allow-Headers '*'
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
以下配置修复 ipv6 地址无法收集的问题:
|
|
|
|
|
|
|
|
|
|
```nginx
|
|
|
|
|
server {
|
|
|
|
|
...
|
|
|
|
|
|
|
|
|
|
add_header Content-Security-Policy 'frame-ancestors *';
|
|
|
|
|
add_header Access-Control-Allow-Origin '*';
|
|
|
|
|
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
|
|
|
|
|
add_header Access-Control-Allow-Headers 'x-umami-cache,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
|
|
|
|
|
if ($request_method = 'OPTIONS') {
|
|
|
|
|
return 204;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
location /api/send {
|
|
|
|
|
content_by_lua_block {
|
|
|
|
|
local cjson = require "cjson"
|
|
|
|
|
|
|
|
|
|
local function is_ipv6_address(hostname)
|
|
|
|
|
local match = hostname:match("^[%x:]+$")
|
|
|
|
|
return match ~= nil
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
ngx.req.read_body()
|
|
|
|
|
local data = ngx.req.get_body_data()
|
|
|
|
|
|
|
|
|
|
if data then
|
|
|
|
|
local decoded_data = cjson.decode(data)
|
|
|
|
|
local hostname = decoded_data.payload.hostname
|
|
|
|
|
|
|
|
|
|
if is_ipv6_address(hostname) then
|
|
|
|
|
local new_hostname = "127.0.0.1"
|
|
|
|
|
decoded_data.payload.hostname = new_hostname
|
|
|
|
|
|
|
|
|
|
local modified_data = cjson.encode(decoded_data)
|
|
|
|
|
ngx.req.set_body_data(modified_data)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
ngx.exec("@proxy")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
location / {
|
|
|
|
|
proxy_hide_header 'Access-Control-Allow-Origin';
|
|
|
|
|
proxy_hide_header 'Content-Security-Policy';
|
|
|
|
|
proxy_set_header Host $host;
|
|
|
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
|
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
|
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
|
|
|
proxy_pass http://127.0.0.1:3000;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
location @proxy {
|
|
|
|
|
proxy_hide_header 'Access-Control-Allow-Origin';
|
|
|
|
|
proxy_hide_header 'Content-Security-Policy';
|
|
|
|
|
proxy_set_header Host $host;
|
|
|
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
|
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
|
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
|
|
|
proxy_pass http://127.0.0.1:3000;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
极简配置:
|
|
|
|
|
|
|
|
|
|
```nginx
|
|
|
|
|
add_header Content-Security-Policy 'frame-ancestors *';
|
|
|
|
|
add_header Access-Control-Allow-Origin '*';
|
|
|
|
|
add_header Access-Control-Allow-Methods '*';
|
|
|
|
|
add_header Access-Control-Allow-Headers '*';
|
|
|
|
|
if ($request_method = 'OPTIONS') {
|
|
|
|
|
return 204;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
location / {
|
|
|
|
|
proxy_hide_header 'Access-Control-Allow-Origin';
|
|
|
|
|
proxy_hide_header 'Content-Security-Policy';
|
|
|
|
|
proxy_set_header Host $host;
|
|
|
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
|
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
|
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
|
|
|
proxy_pass http://127.0.0.1:3000;
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2024-08-02 18:26:48 +08:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
![Ms Studio](https://file.lifebus.top/imgs/ms_blank_001.png)
|