今天的是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: 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: 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 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 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: 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 compose的certbot的多站点需要有一个交互操作,导致无法自动申请。多站点需要每个域名单独申请证书。证书申请成功后如下所示:
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 Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; 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
设置umami 打开umami,输入默认用户名密码 : admin/umami登录到后台。
新增仅浏览用户 因为要在网站中设置token,而admin的权限太高,为了避免手闲的哥们给你搞事情,一定要新建一个仅浏览的用户。
新增团队 仅浏览的用户无法新增网站,所以需要通过团队功能使其可以查看团队内的网站。
创建团队后,会有一个团队的访问代码。
复制后,使用另外一个浏览器登录仅浏览的用户,点击加入团队,输入访问代码即可加入。
新增网站 在设置 -> 网站中点击添加网站,输入名称和域名。
将网站ID记录下来,配置到hexo-butterfly-theme的主题配置中,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 umami_analytics: enable: true serverURL: https://umami.tvzr.com script_name: script.js website_id: 网站ID option: UV_PV: site_uv: true site_pv: true page_pv: true token:
使用如下方式可以获取token
1 2 3 curl -X POST https://umami.tvzr.com/api/auth/login \ -H "Content-Type: application/json" \ -d '{"username": "仅登录用户名", "password": "你的密码"}'
将返回值中的token复制到上面的配置中。
将新增的网站转移到团队中,点击转移,选择团队名称即可。
这样就可以使用umami来实现网站统计了。
下面是本站效果图
原来在busuanzi的统计数据就全部清零了。
下面是umami的统计图: