阅读视图

发现新文章,点击刷新页面。
🔲 ☆

Vercel 云服务构建 Umami

之前由于 Umami 自建网站访问量统计系统 有很多人跟我说云服务基本白嫖没有自己的服务器,如何进行搭建。此处即可使用 Vercel 来进行免费构建服务。

所需项目地址:Umami

Umami的相关信息可以看我之前的文章,此项目还需要 MySql/Postgresql,可使用收费/免费服务,此处不做推荐。


Vercel介绍

网站链接:Vercel

  • 免费 20 GB 空间
  • 提供 Serverless 服务
  • 免费自定义域名,支持 HTTPS
  • 不限站点与 Serverless API 数量
  • Serverless 支持 Node.js, Go, Python, Ruby
  • 提供 Google Cloud 与 AWS 节点,有香港与台湾节点
  • 支持 now.sh CLI,GitHub,GitLab,Bitbucket 导入/部署

对于白嫖党还是非常友好的(MJJ狂喜

构建Umami

Fork项目

打开 Umami 项目地址,将项目Fork到自己的仓库。

img

在 Vercel 主页新建项目

点击 Create a New Project 新建项目

img

选择刚刚 Fork 的仓库

找到 Umami 然后点击 Import

img

构建 Umami

此处需要增加两个环境变量,其变量名以及值格式如下:

1
2
3
4
5
6
7
变量名:HASH_SALT      值:自定义字符串
变量名:DATABASE_URL 值:数据库链接字符如下所示:
#在此之前请将SQL文件下的数据库文件导入数据库
postgresql://username:mypassword@localhost:5432/mydb
mysql://username:mypassword@localhost:3306/mydb

变量名:TRACKER_SCRIPT_NAME 值:自定义 (此变量用于更改脚本名称,可不填写,但推荐填写,否则脚本会被拦截,会致使统计数据不准确。

添加完成后,点击 Deploy 即可开始构建

img

构建完成

等待两三分钟即可构建完成

img

初始信息如下:

1
2
账号:admin
密码:umami

img

此时即可登录配置

绑定自定义域名

选择 Settings -> Domains 输入需要绑定的域名并且选择 Add 添加

img

根据提示设置相关解析,然后即可访问。

img

成功访问

img

关于使用 Vercel 构建 Umami 修改 umami.js 文件名的问题

在 SETTINGS -> ENVIRONMENT VARIABLES 里面新增环境变量 TRACKER_SCRIPT_NAME 然后赋值后重构项目即可。

🔲 ☆

解决 Umami 统计脚本被拦截广告插件拦截

使用外挂 JS 的方式来统计数据,虽然可以统计真实的访客记录,但是会被 uBlock 此类的广告拦截插件给直接拦截掉,以至于无法准确的获取访客数据。

简单了解了下此类插件的拦截策略,是通过检测脚本文件名进行的。可以通过修改 JS 文件名来进行防止统计信息脚本被拦截。


方法一(推荐)

官方在 1.26.0 版本上增加了 TRACKER_SCRIPT_NAME 这个环境变量来提供修改统计脚本的操作,这也是本站现在使用的方法。

但是此环境变量中的值,有些情况会失效,更换即可,原因未知。

打开目录中的 .env 文件,添加以下文本:

1
TRACKER_SCRIPT_NAME=自定义名称

img

输入完成后保存即可。

重启服务,修改网站链接中的脚本地址

img重启UMAMI服务

img访问网址,修改已生效

使用 CloudFlare Workers修改名称

这个方法是以为大佬在项目讨论区分享的,也试了以下,效果一致。

新建CloudFlare Workers

左侧选择 Workers,然后创建服务

img

选择启动器,然后创建服务

服务名称自定义,启动器选择 HTTP 处理程序

img

然后点击快速编辑,并将以下信息 修改输入 并 保存。

img

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
const ScriptName = '/umami.js';     //自定义脚本名称
const Endpoint = '/foo/bar';
const UmamiUrl = 'https://bcon.roywang.cn'; //UMAMI服务域名地址。
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET,HEAD,POST,OPTIONS',
'Access-Control-Max-Age': '86400',
};
const ScriptWithoutExtension = ScriptName.replace('.js', '')
addEventListener('fetch', event => {
event.passThroughOnException();
event.respondWith(handleRequest(event));
})
async function handleRequest(event) {
const pathname = new URL(event.request.url).pathname
const [baseUri, ...extensions] = pathname.split('.')
const clientIP = event.request.headers.get("CF-Connecting-IP")
if (baseUri.endsWith(ScriptWithoutExtension)) {
return getScript(event, extensions)
} else if (pathname.endsWith(Endpoint)) {
return postData(event)
}
return new Response(null, {status: 404})
}
async function getScript(event, extensions) {
let response = await caches.default.match(event.request);
if (!response) {
response = await fetch(UmamiUrl +"/umami.js");
var js = await response.text();
js = js.replace("/api/collect", Endpoint);
response = new Response(js, {
headers: {
...response.headers,
...corsHeaders,
'Access-Control-Allow-Headers': response.headers.get('Access-Control-Request-Headers'),
},
})
event.waitUntil(caches.default.put(event.request, response.clone()));
}
return response;
}
async function postData(event) {
const request = new Request(event.request);
request.headers.delete('cookie');
response = await fetch(UmamiUrl +"/api/collect", request);
var js = await response.text();
response = new Response(js, {
headers: {
...response.headers,
...corsHeaders,
'Access-Control-Allow-Headers': request.headers.get('Access-Control-Request-Headers'),
},
});
return response;
}

img

文件名称修改成功。

CloudFlare Workers 绑定自定义域名

域名需要 NS 接入CloudFlare,增加解析 至 8.8.8.8,并且打开 CloudFlare 代理

img

在左侧选择 Workers,并选择添加路由。

img输入路由,以及选择服务、环境。

此处有个误区,路由在域名后面需要添加 /* 很多用户在使用时都会犯这个错误。

img

修改网站中的脚本地址。

img

第一种方法最简单,也最推荐,当然如果服务的线路非常差,比CloudFlare 还差的话,推荐使用第二种方法。

如后续还被屏蔽,只需重新修改脚本名称即可。

🔲 ☆

Umami - 自建网站访问量统计系统

由于站点较多,而且为了保护隐私,比较抵触使用 CNZZ 或 GOOGLE 等第三方的访问量统计系统。最近发现了一个统计网站访问量的工具。也使用了一段时间,现在将搭建教程分享出来:


项目介绍

项目地址:Umami

UMAMI 基于Node.js 开发,并且支持 MySQL 或 Postgresql 等数据库存储方式,可以将数据掌握在自己手中。并且 UMAMI 还提供了非常详细的流量分析可视化的界面,UI 体验以及统计准确度十分不错(此处所讲统计精准度为实际真是访客的访问量,有可能一天只有1-2请做好心理准备。)

官方文档:Umami Docs

环境需求

由于 Umami 基于Node.js 开发,采用 MySQL 或 Postgresql 数据库存储数据,所以配置要求如下:

  • Node.js 14.18 或更高的版本
  • 服务器上安装了 MySQL 5.7 或以上 或 Postgresql 12.14 或以上

2022-7-22 更新:今天更新 umami 时,发现更换了 umami 构建安装方式,遂更新一波,可能配图不正确,但步骤基本一致。

2023-5-3更新:更新了一下 Node.js 的版本,以及文章上的一些错误。

2023-8-21更新:程序守护更改为 PM2 管理,进而放弃 systemctl ,其在我这次将服务迁移到国内服务器内出现了很大的问题,以及文章上的一些错误。

2024-2-8更新:更新了Node.js 的版本,以及文章上的一些错误。


环境配置

本文基于宝塔面板,使用 MySQL 进行安装

安装配置 Node.js

此处 MySQL 安装方式此处不再进行演示,如您已安装 Node.js 并且配置成功,则此步可以跳过。

安装 Node.js 命令如下

1
2
3
cd /www/server/nodejs
wget https://nodejs.org/dist/v21.6.0/node-v21.6.0-linux-x64.tar.gz
tar -xzvf node-v21.6.0-linux-x64.tar.gz

设置 Node.js 全局变量:

在宝塔面板打开 /etc/profile 文件,将以下配置输入文件最后面,并保存

1
2
export NODE_HOME=/www/server/nodejs/node-v21.6.0-linux-x64
export PATH=$NODE_HOME/bin:$PATH

输入以下命令用于重载全局配置。

1
source /etc/profile

输入 node -v 和 npm -v 返回以下信息即配置完成

img

配置成功

安装 Yarn

1
npm install -g yarn

查看版本信息,如遇 yarn:未找到命令,请看:《NodeJS 和 npm 配置全局变量

img

国内服务器此步骤由于 Node.js 没有大陆节点,速度较慢。请耐心等待

部署 Umami

克隆仓库

1
2
cd /www/wwwroot
git clone https://github.com/umami-software/umami

img

安装依赖

国内服务器此步骤由于 Node.js 没有大陆节点,速度较慢。请耐心等待

千万不要使用淘宝的 registry 镜像源!!!!!!!!

否则安装依赖会出错!!!!!!!!

1
2
cd umami
yarn install

img

依赖安装完成

配置数据库

创建数据库:打开宝塔面板,点击左侧 数据库->添加数据库。输入数据库相关信息即可。

img

配置 .env 文件

在 umami 文件夹中新建一个名为 .env 的文件

img

文件具体配置如下:

1
2
DATABASE_URL=mysql://用户名:密码@localhost:3306/库名
HASH_SALT=roywang (加密字符 随机即可)

img

配置示例

构建 Umami

千万不要使用淘宝的 registry 镜像源!!!!!!!!

否则安装依赖会出错!!!!!!!!

1
yarn build

img

构建完成

导入数据库

1
yarn update-db

运行

1
yarn start

img

默认用户名:admin 默认密码:umami

此时即可通过 IP:3000访问网站了,但为了方便使用,还需进行以下操作

其他配置

设置程序守护,此处以 PM2 为例

打开目录 umami 安装目录

1
2
3
4
5
6
#全局安装 pm2
yarn global add pm2

pm2 start yarn --name umami -- start
pm2 startup
pm2 save

img

设置网站反代

宝塔新建站点 -> 打开SSL - > 反向代理 ->添加反向代理

目标 URL 填写:http://127.0.0.1:3000

img配置反代

img

配置站点

登录 Umami

默认账号:admin
默认密码:umami

img

添加站点,并将代码放到网站

部分来收集数据。

升级配置

此时必须保证 Umami 没有正在运行,重新 拉取仓库、安装依赖、构建项目、启动即可

1
2
3
4
5
6
7
8
9
10
#拉取仓库
git pull
#安装
yarn install
#构建项目
yarn build
#更新数据库
yarn update-db
#启动项目
systemctl start umami

后语

特别强调,无论国外源多慢都强烈要求使用国外源。在使用淘宝源时,构建会失败!!!!!!!!!!!!!

**解决了统计JS被广告拦截插件给屏蔽的问题:**https://bcon.roywang.cn/umami-js-name/

🔲 ⭐

Umami V1 升级到 V2

前段时间发现,Umami 已经更新到了 V2 版本,遂升级了一下,也遇到不少坑,记录一下。

请注意,升级有风险,请您注意备份已有的数据库以及项目文件,以便升级中遇到错误,进行回退。
另外,此处介绍的为基于 《Umami 自建网站访问量统计系统》做的V1->V2的升级,如您没使用过Umami,请配合本文内容与《Umami 自建网站访问量统计系统》中的内容进行项目部署。

本文中,并无介绍 Node.js 与 yarn 的安装与配置,请参考上面链接中的文章进行安装部署。

项目介绍

项目地址:Umami

Umami 基于Next.js 开发,并且支持 MySQL 或 Postgresql 等数据库存储方式,可以将数据掌握在自己手中。并且 Umami 还提供了非常详细的流量分析可视化的界面,UI 体验以及统计准确度十分不错(此处所讲统计精准度为实际真是访客的访问量,有可能一天只有1-2请做好心理准备。)

官方文档:Umami Docs


升级数据库

本地升级

如果你之前使用过 Umami V1,打算从 V1 升级到 V2,直接执行下面的命令:

cd umami
npx @umami/migrate-v1-v2@latest

上面打开目录,请按照实际情况来修改。

托管平台升级

如果你选择的使用 Vercel 之类的托管平台,以至于没有目录的权限,则需要克隆 V1->V2的升级项目,进行数据库升级。

git clone https://github.com/umami-software/migrate-v1-v2.git
cd migrate-v1-v2
yarn install
yarn build

则需要在文件夹中创建一个 .env 的文件,其内容如下:

DATABASE_URL={connection url}

运行项目以升级数据库结构

yarn start

重新构建

数据库升级成功后,则需要重新构建项目,在此处写明升级方法。

本地构建项目

在构建之前,请备份 .env 文件,备份后需要删除整个 umami 数据库

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

此时需要将备份好的 .env 文件,放回到目录中。

构建项目:

yarn build

构建完成后,可运行项目:

yarn start

配置文件也需要进行更新,原来的 umami.service 已不可使用,请替换为新版:

[Unit]
Description=Umami App
After=network.target

[Service]
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/www/server/nodejs/node-v16.14.2-linux-x64/bin/
ExecStart=/www/server/nodejs/node-v16.14.2-linux-x64/bin/yarn start
WorkingDirectory=/www/wwwroot/umami
Restart=always
RestartSec=10
Type=simple
User=root
Group=root

[Install]
WantedBy=multi-user.target

此时保存即可,运行:

# 更新配置
systemctl daemon-reload
# 启动服务
systemctl start umami
# 设置开机启动
systemctl enable umami

详细的管理命令如下:

# 启动服务
systemctl start umami
# 设置开机启动
systemctl enable umami
# 停止服务
systemctl stop umami
# 重启服务
systemctl restart umami
# 查看状态
systemctl status umami
# 更新配置
systemctl daemon-reload

使用 Vercel 构建 Umami V2

有关 Vercel 构建 Umami V2的方法,与构建 V1 并无区别,可参考我写的这篇文章:

Vercel 云服务构建 Umami

其他

之前的文章介绍过使用 CDN 加速 Umami 的脚本,Umami升级到V2后,脚本内容已经更新,需要您更新托管到 CDN 的静态文件。

下载文件,然后上传到服务器即可。

升级后,网站上的配置链接不必进行更改。

如在安装或构建过程中遇到错误,请检查使用的 Node.js 版本与 yarn 版本是否不符合要求,或者过于新。官方要求 Node.js 版本 14.3 或更高。


《Umami V1 升级到 V2》

🔲 ⭐

Umami 构建 2.3.0 版本时 '✗ Command failed: prisma migrate deploy Error: P3009'

自从升级到了 V2 版本后一直都是 2.2.0版本的最新版,但是最新版自昨日开始,总是报如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[@formatjs/intl] An id must be provided to format a message. You can either: 1. Configure your build toolchain with babel-plugin-formatjs or @formatjs/ts-transformer OR 2. Configure your eslint config to include eslint-plugin-formatjs to autofix this issue
Error: [@formatjs/intl] An id must be provided to format a message. You can either:

Configure your build toolchain with babel-plugin-formatjs
or @formatjs/ts-transformer OR
Configure your eslint config to include eslint-plugin-formatjs
to autofix this issue
at r (https://analyze.innei.ren/_next/static/chunks/pages/_app-0e67ddf2180faf84.js:1:150)
at m (https://analyze.innei.ren/_next/static/chunks/pages/_app-0e67ddf2180faf84.js:6:546061)
at Y (https://analyze.innei.ren/_next/static/chunks/pages/_app-0e67ddf2180faf84.js:6:555082)
at I (https://analyze.innei.ren/_next/static/chunks/968-104b6020f0922c66.js:1:5015)
at ab (https://analyze.innei.ren/_next/static/chunks/framework-2c79e2a64abdb08b.js:9:60915)
at ud (https://analyze.innei.ren/_next/static/chunks/framework-2c79e2a64abdb08b.js:9:72801)
at i (https://analyze.innei.ren/_next/static/chunks/framework-2c79e2a64abdb08b.js:9:120370)
at oO (https://analyze.innei.ren/_next/static/chunks/framework-2c79e2a64abdb08b.js:9:99112)
at https://analyze.innei.ren/_next/static/chunks/framework-2c79e2a64abdb08b.js:9:98979
at oF (https://analyze.innei.ren/_next/static/chunks/framework-2c79e2a64abdb08b.js:9:98986)

看了下 GitHub,最新版已经解决了上述问题。遂更新至 2.3.0 并遇到了这个问题。


问题如下:再在建 2.3.0 版本时,遇到了 ✗ Command failed: prisma migrate deploy 的问题,并且报错 Error:P3009

img

发生这种错误是因为 MySQL 5.7 的重命名语法略有不同,需要修改一下 sql 文件中的语法,来解决这个错误。

打开 umami/db/mysql/migrations/02_report_schema_session_data 文件夹下的 migration.sql 文件,将 文件中的首行至第6行

1
2
3
4
5
6
-- AlterTable
ALTER TABLE "event_data" RENAME COLUMN "event_data_type" TO "data_type";
ALTER TABLE "event_data" RENAME COLUMN "event_date_value" TO "date_value";
ALTER TABLE "event_data" RENAME COLUMN "event_id" TO "event_data_id";
ALTER TABLE "event_data" RENAME COLUMN "event_numeric_value" TO "number_value";
ALTER TABLE "event_data" RENAME COLUMN "event_string_value" TO "string_value";

替换为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- RenameColumns
ALTER TABLE `event_data` ADD COLUMN data_type INTEGER UNSIGNED AFTER event_data_type;
ALTER TABLE `event_data` ADD COLUMN date_value TIMESTAMP(0) AFTER event_date_value;
ALTER TABLE `event_data` ADD COLUMN event_data_id VARCHAR(36) AFTER event_id;
ALTER TABLE `event_data` ADD COLUMN number_value DECIMAL(19, 4) AFTER event_numeric_value;
ALTER TABLE `event_data` ADD COLUMN string_value VARCHAR(500) AFTER event_string_value;

UPDATE event_data
SET data_type = event_data_type,
date_value = event_date_value,
event_data_id = event_id,
number_value = event_numeric_value,
string_value = event_string_value;

ALTER TABLE `event_data` MODIFY data_type INTEGER UNSIGNED NOT NULL;
ALTER TABLE `event_data` MODIFY event_data_id VARCHAR(36) NOT NULL;

ALTER TABLE `event_data` DROP COLUMN event_data_type;
ALTER TABLE `event_data` DROP COLUMN event_date_value;
ALTER TABLE `event_data` DROP COLUMN event_id;
ALTER TABLE `event_data` DROP COLUMN event_numeric_value;
ALTER TABLE `event_data` DROP COLUMN event_string_value;

ALTER TABLE `event_data` ADD PRIMARY KEY(event_data_id);

保存后,运行下列命令以绕过失败的迁移。

1
npx prisma migrate resolve --rolled-back "02_report_schema_session_data"

img

此时再运行 yarn build 即可构建成功。

🔲 ☆

使用 CDN 加速 Umami 静态资源

如你所见,等你看到这篇文章的时候,我博客的域名已经取消的备案。

至于取消备案的原因,主要还是因为监管逐渐变的更加严格,而且网站已经有了一定的访问量,怕引发一些不必要的麻烦,遂取消了备案。具体的原因会在后续的文章中给出。

而现在博客已经迁移到了 Vercel 上了,最初是要迁移到 CloudFlare Pages 上的,但 CFP 到国内的可用性真的够拉的。迁移到 Vercel 后,许多以前做的优化已经逐渐的不够用,不适用了。为了保证博客的体验,需要做新一轮的优化。所作优化,后续会以流水账的形式以博文的形式更新。

首先要做的就是对外部引用资源的优化,博客现在使用的流量统计方案,以及博客的使用的评论方案,一直以来是托管在腾讯云香港的轻量应用服务器上的,但香港地区的线路越来越差,极其影响体验,遂进行做了一部分优化。


正文

翻了翻 Umami 的文档,官方其实是支持引用的 JS资源 托管到其他地方的,然后将数据发送到 Umami 的服务端上,仅需做出一部分小的改动。

此方法同样适用于那些服务域名被插件屏蔽的同学。

首先,你需要将使用 Umami 版本的 JS资源 保存下来,将其部署到你的 CDN 上。

请注意,不要使用不同 Umami 版本的 JS资源。

资源的名称需要与你服务中设置的名称一致。

原有引入 JS资源,格式如下:

1
2
3
4
<script async defer
src="http://youUmamiserversdomain/umami.js"
data-website-id="94db1cb1-74f4-4a40-ad6c-962362670409"
></script>

其中:

而如果希望将 JS资源 托管在他处,则需要引用的 JS资源 所在的位置,请保证这个地址是可用的,以及指明服务所在位置,需要添加 data-host-url 参数,格式如下:

1
2
3
4
5
<script async defer
src="http://youblogdomain.com/umami.js"
data-website-id="94db1cb1-74f4-4a40-ad6c-962362670409"
data-host-url="http://youUmamiserversdomain"
></script>

其中:

至此 Umami JS资源 加速部署结束。

脚本加速之前属于一来一去,同样差的线路需要体验两次。加速之后,在加载脚本速度上会有质的飞跃,虽然还会向服务所在的域名发送采集到的相应数据,但总体来说速度上还是有明显差距的。

脚本虽小,但加速与否体验差别挺大。

❌