今天的是2025年12月31日,趁着最后一天把长草许久的本站稍微处理了一下,升级依赖和主题到最新版本,但是发现一个问题,busuanzi不工作了,于是想到了自己搭建的umami也支持统计,那就切换成自己的服务吧。

部署umami

我比较习惯用docker去部署服务,在我的服务器上本身就部署了wordpress+mysql+nginx,为了资源利用,那就整合进去就好了。

docker-compose新增umami

和umami有关的docker-compose如下:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
services:
# mysql数据库
db:
image: mysql:8.0
container_name: db
restart: unless-stopped
env_file: .env
environment:
- MYSQL_MULTIPLE_DATABASES=xxxxx,xxxx # 初始化创建的数据库。
volumes:
- dbdata:/var/lib/mysql
networks:
- app-network
# 第一个wordpress站点
wordpress:
depends_on:
- db
image: wordpress:6.8.3-php8.4-fpm-alpine
container_name: wordpress
restart: unless-stopped
env_file: .env
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_USER=$MYSQL_USER
- WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
- WORDPRESS_DB_NAME=xxxxxx
volumes:
- wordpress:/var/www/html
- ./php-config/custom.ini:/usr/local/etc/php/conf.d/custom.ini
networks:
- app-network
# 第二个WordPress站点
vps:
depends_on:
- db
image: wordpress:6.8.3-php8.4-fpm-alpine
container_name: wp-vps
restart: unless-stopped
env_file: .env
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_USER=xxx
- WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
- WORDPRESS_DB_NAME=xxx
volumes:
- wp-vps:/var/www/html
- ./php-config/custom.ini:/usr/local/etc/php/conf.d/custom.ini
networks:
- app-network
# nginx
webserver:
depends_on:
- wordpress
- vps
- umami # 注意依赖
image: nginx:1.28.0-alpine
container_name: webserver
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- wordpress:/var/www/html
- wp-vps:/var/www/wp-vps
- umami-data:/var/www/umami
- ./nginx-conf:/etc/nginx/conf.d
- certbot-etc:/etc/letsencrypt
networks:
- app-network
# 这里是主要的
umami:
depends_on:
- db
image: docker.umami.dev/umami-software/umami:mysql-latest
container_name: umami
restart: unless-stopped
expose:
- '3000'
environment:
DATABASE_URL: mysql://mysql用户名:mysql密码@db:3306/umamidb #换成你的数据库,记得要先创建数据库,否则无法启动
DATABASE_TYPE: mysql
APP_SECRET: #填一个随机字符串,建议使用openssl rand -base64 32 生成
networks:
- app-network

certbot:
depends_on:
- webserver
image: certbot/certbot
container_name: certbot
volumes:
- certbot-etc:/etc/letsencrypt
- wordpress:/var/www/html
- wp-vps:/var/www/wp-vps
- umami-data:/var/www/umami
command: >
certonly --webroot
--non-interactive
--expand
-w /var/www/html -d tvzr.com
-w /var/www/wp-vps -d vps.tvzr.com
-w /var/www/umami -d umami.tvzr.com
--email youremail@outlook.com
--agree-tos
--no-eff-email
--force-renewal

volumes:
certbot-etc:
wordpress:
dbdata:
wp-vps:
umami-data:

networks:
app-network:
driver: bridge

docker-compose.yml修改完成后,重新启动即可。

1
2
3
docker compose down

docker compose up -d

新增nginx配置

由于要先申请证书,所以先配置80端口,在nginx配置文件中新增一个umami.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
listen [::]:80;

server_name umami.tvzr.com;

location ~ /.well-known/acme-challenge {
allow all;
root /var/www/umami;
}

location / {
rewrite ^ https://$host$request_uri? permanent;
}
}

在DNS中新增一个解析,指向服务器IP。

执行如下命令,申请证书:

1
docker compose run --rm certbot certonly --webroot     --non-interactive     -w /var/www/umami -d umami.tvzr.com    --email youre_email@outlook.com   --agree-tos

因为docker composecertbot的多站点需要有一个交互操作,导致无法自动申请。多站点需要每个域名单独申请证书。证书申请成功后如下所示:

1
2
3
4
5
6
7
8
9
Container wordpress-certbot-run-d571134f25fb Creating 
Container wordpress-certbot-run-d571134f25fb Created
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for umami.tvzr.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/umami.tvzr.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/umami.tvzr.com/privkey.pem
This certificate expires on 2026-03-31.

新增https访问

编辑umami.conf,新增SSL配置,其完整配置如下:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
server {

listen 80;
listen [::]:80;

server_name umami.tvzr.com;

location ~ /.well-known/acme-challenge {
allow all;
root /var/www/umami;
}

location / {
rewrite ^ https://$host$request_uri? permanent;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name umami.tvzr.com;

index index.html index.htm;

root /var/www/umami;

server_tokens off;

ssl_certificate /etc/letsencrypt/live/umami.tvzr.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/umami.tvzr.com/privkey.pem;

include /etc/nginx/conf.d/conf/options-ssl-nginx.conf; # 这两个是我自己用的,对你们不重要
include /etc/nginx/conf.d/conf/cloudflare_ip.conf;# 这两个是我自己用的,对你们不重要
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
# add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# enable strict transport security only if you understand the implications

location / {
proxy_pass http://umami:3000;
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_header Authorization; # 别忘了这个
}

}

配置完成后,重新启动nginx。

1
docker restart webserver # 我的镜像名称是webserver

设置umami

打开umami,输入默认用户名密码 : admin/umami登录到后台。

新增仅浏览用户

因为要在网站中设置token,而admin的权限太高,为了避免手闲的哥们给你搞事情,一定要新建一个仅浏览的用户。

创建用户

新增团队

仅浏览的用户无法新增网站,所以需要通过团队功能使其可以查看团队内的网站。

创建团队

创建团队后,会有一个团队的访问代码。

umami新增团队

复制后,使用另外一个浏览器登录仅浏览的用户,点击加入团队,输入访问代码即可加入。

新增网站

设置 -> 网站中点击添加网站,输入名称和域名。

umami添加网站

将网站ID记录下来,配置到hexo-butterfly-theme的主题配置中,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
umami_analytics:
enable: true
# For self-hosted setups, configure the hostname of the Umami instance
serverURL: https://umami.tvzr.com
script_name: script.js
website_id: 网站ID
option:
UV_PV:
site_uv: true
site_pv: true
page_pv: true
# Umami Cloud (API key) / self-hosted Umami (token)
token: # 需要生成

使用如下方式可以获取token

1
2
3
curl -X POST https://umami.tvzr.com/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username": "仅登录用户名", "password": "你的密码"}'

将返回值中的token复制到上面的配置中。

将新增的网站转移到团队中,点击转移,选择团队名称即可。

transfer-team

这样就可以使用umami来实现网站统计了。

下面是本站效果图

pv和uv

原来在busuanzi的统计数据就全部清零了。

下面是umami的统计图:

umami统计图