跳到主要内容

Docusaurus Umami

Umami

umami 是一个开源自托管的网站分析工具,这里是本站的 umami 数据展示页面。其包括以下功能:

  • 网站流量统计
  • 网站访问来源、设备、页面、时间、地区、浏览器、操作系统统计
  • 自定义操作统计(比如想统计某个 button 的点击次数)
  • 各种集成好的数据展示

并且其本质为一个 Next.js 应用,所以可以很方便的集成到现有的 Next.js 项目中。也可以进行二次开发

安装

安装前,首先确保有以下环境:

  • Node.js 18.17 及以上
  • 数据库二选一
    • MySQL v8.0 及以上
    • PostgreSQL v12.14 及以上
信息

在 Ubuntu 下安装 Node.js 可以参考 Node.js 在 Wsl 下安装 Node.js 可以参考 Node.js - Wsl 在 Linux 下安装 MySQL 可以参考 MySQL

安装 umami

安装 yarn

npm install -g yarn

拉取项目

git clone https://github.com/umami-software/umami.git
cd umami
yarn install

配置数据库

首先在项目根目录下创建一个 .env 文件,并添加如下内容:

.env
DATABASE_URL=mysql://username:mypassword@localhost:3306/mydb

其中:

  • username 数据库用户名,一般是 root
  • mypassword 数据库密码
  • localhost 数据库地址,一般是 localhost
  • 3306/5432 数据库端口
  • mydb 数据库名称

以上为 prisma 标准 DATABASE_URL,这里给出一个样例:

.env
DATABASE_URL=mysql://root:qwer1234@localhost:3306/my-website-umami

配置完成后,使用以下命令初始化 prisma

npx prisma migrate dev

Build 项目

使用 yarn build 命令构建项目

提示

如果服务器内存不太够,可以在本地从头再来一遍,之后把 build 好的 .next 文件夹 scp 到云端即可

配置 nginx

在使用 Umami 的情况下,我们同时在服务器上部署了 Docusaurus 和 Umami,所以需要配置 nginx 进行反向代理,具体可以参考 Nginx Reverse Proxy 一篇

如果想要直接使用 https,在完成上一步的情况下,参考 SSL 一篇进行配置

总之,在配置完成后,nginx 配置文件如下:

/etc/nginx/conf.d/server.conf
...
server {
listen 80;
server_name umami.castamerego.com;

rewrite ^(.*)$ https://$host$1;

location / {
proxy_pass http://localhost:3030;
}
}

server {
listen 443 ssl;
server_name umami.castamerego.com;

ssl_certificate conf.d/cert/umami.castamerego.com.cer;
ssl_certificate_key conf.d/cert/umami.castamerego.com.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://localhost:3030;
}
}

这里是将域名 umami.castamerego.com 重定向到 3030 端口,那么我们后面运行项目时也要在 3030 端口运行,修改 package.json 文件如下:

package.json
  {
...
"scripts": {
"build": "npm-run-all check-env build-db check-db build-tracker build-geo build-app",
- "start": "next start",
+ "start": "next start -p 3030"
}
...
}

运行项目

然后使用 yarn start 命令运行项目,就可以访问你的域名查看项目了,可以看到登录界面,就说明项目已经成功运行了

Login

important

如果直接在服务器上部署,可能会遇到一些问题,比如在服务器管理处,是否开放了端口,有时候可能项目已经跑起来了,但没访问到,细心排查即可

配置 Umami

登录

初次进入登录界面,账号为 admin,密码为 umami。登录后,根据下图指示,修改密码

Reset PW

添加网站

然后根据下图指示,添加你的网站

Add Site

收集数据

点击刚刚新建好的网站中的编辑。在下图所示页面,可以看到一个跟踪代码,将其复制下来备用

Script

展示数据

根据下图指示,开启共享链接,开启后,其他人可以通过下面这个生成的链接查看你的网站数据

Share

配置 Docusaurus

接下来需要在 Docusaurus 中进行配置

创建插件

首先在 src 文件夹下创建 plugin 文件夹,然后创建 plugin-umami.js 文件,内容如下:

需要修改的有三个地方,一个是 href,换为自己的域名即可。srcdata-website-id 则都是上一步收集数据中复制的跟踪代码的内容,放到对应位置即可

src/plugin/plugin-umami.js
async function umamiPlugin() {
// 判断是否为开发环境
const isDevelopment = "development" === process.env.NODE_ENV;

return {
name: "docusaurus-umami-plugin",

injectHtmlTags() {
if (isDevelopment) return;
return {
headTags: [
{
tagName: "link",
attributes: {
rel: "preconnect",
// 换成你的域名
href: "https://xxxx.com/",
},
},
{
tagName: "script",
attributes: {
defer: true,
// 这里就是上一步复制的跟踪代码中的内容
src: "https://xxxx.com/script.js",
"data-website-id": "e993a914-0864-4b88-a53c-75e46dc174d7",
},
},
],
};
},
};
}

module.exports = umamiPlugin;
important

注意,笔者在这里设置了只有在生产环境下才注入代码,读者在测试时,可以取消 isDevelopment 的判断,这样就可以在开发环境下看到数据了

注册插件

接下来就是在 docusaurus.config.js 中注册插件

docusaurus.config.js
  ...
plugins: [
require.resolve("docusaurus-plugin-image-zoom"),
function myPlugin(context, options) {
...
},
+ "./src/plugins/plugin-umami"
],
...

最后重新 build 一遍博客,随便点几个页面,查看你的 umami 网站,应该可以看到数据了

FAQ

获取不到国家(一直是 unknown)

由于我们使用了 nginx 进行反代理,所以 umami 获取的数据,都是被 nginx 重新包装过的。我们需要进行设置,才能获取访客真实的信息,看了网上很多内容,最终结果如下,在之前的基础上,umami 的 location 中添加如下内容即可

/etc/nginx/conf.d/server.conf
  server {
listen 443 ssl;
server_name umami.castamerego.com;

ssl_certificate conf.d/cert/umami.castamerego.com.cer;
ssl_certificate_key conf.d/cert/umami.castamerego.com.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://localhost:3030;
+ proxy_buffering on;
+ proxy_http_version 1.1;
+ proxy_ssl_session_reuse off;
+ proxy_ssl_server_name on;
+ proxy_set_header X-Forwarded-Proto https;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Host $host;
}
}
请作者喝可乐🥤: