Ubuntu搭建统计网站Umami统计

Umami 是 Google Analytics 的简单、快速、注重隐私的替代方案

官方GitHub地址:https://github.com/umami-software/umami
官方docker镜像地址: https://docker.umami.dev/umami-software/umami:postgresql-latest

UMAMI 基于Node.js 开发,并且支持 MySQL 或 Postgresql 等数据库存储方式,可以将数据掌握在自己手中。并且 UMAMI 还提供了非常详细的流量分析可视化的界面,UI 体验以及统计准确度十分不错。UMAMI目前还可以防止被广告屏蔽插件等等屏蔽,统计精准度大。

官方文档:详细的入门指南可以在https://umami.is/docs/找到

自建统计网站Umami统计-1

功能
  • 网站分析:Umami 可以跟踪和分析网站的访问量、页面浏览量、用户行为等指标,帮助你了解用户如何与你的网站进行交互。
  • 事件跟踪:它支持对特定事件的跟踪,例如按钮点击、表单提交、视频播放等,以便你了解用户在网站上的具体操作。
  • 用户洞察:通过Umami,你可以获取有关用户的信息,如访问频率、新用户与回访用户的比例等,从而深入了解你的用户群体。
  • 来源分析:Umami 可以追踪用户访问网站的来源,包括搜索引擎、社交媒体、直接访问等,帮助你评估营销渠道的效果。
  • 自定义报表:根据你的需求,Umami 允许你创建自定义的报表和图表,以便更好地分析和可视化数据。
  • A/B 测试支持:Umami 可以帮助你进行 A/B 测试,比较不同版本的页面或功能,以优化网站的用户体验。
  • 数据导出:你可以将数据导出为 CSV 或其他格式,以便与其他工具或分析平台进行集成和进一步分析。
特点
  • 简单易用:Umami 具有用户友好的界面和易于设置的特性,即使对于非技术人员也相对容易上手。
  • 开源免费:作为开源项目,Umami 可以免费使用,并且你可以根据自己的需求进行定制和扩展。
  • 数据隐私:Umami 注重用户数据的隐私,不会收集敏感信息或用于广告目的。
  • 轻量级:它的设计相对简洁,不会对网站的性能产生显著影响,适合中小型网站和项目。
  • 灵活定制:由于是开源的,你可以根据自己的需求对 Umami 进行二次开发和定制,以满足特定的分析要求。
  • 实时数据:Umami 提供实时数据的监测和反馈,让你能够及时了解网站的动态和用户行为。

要求:

  • 具有 Node.js 版本 12 或更高版本的服务器
  •  Umami 支持 MySQL 和 Postgresql 数据库。

在 Ubuntu 上安装 Node.js 并将 npm 更新到最新版本

安装Node.js

NodeSource 将继续维护以下架构,并可能在将来添加其他架构。

  • amd64(64 位)
  • armhf(ARM 32 位硬浮点、ARMv7 及更高版本:arm-linux-gnueabihf
  • arm64(ARM 64 位、ARMv8 及更高版本:aarch64-linux-gnu

Node项目网站:https://github.com/nodesource/distributions

自建统计umami统计-1

更新系统

sudo apt update && sudo apt upgrade

安装依赖

sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y

 

Node.js v21.x

通过NodeSource提供的官方包安装 自带最新npm

Node.js目前有三个版本,Node.js 18.x 、Node.js 20.x、Node.js 21.x

以下是 Node.js 20.x的安装,一行代码搞定。&&\ 的意思是前面的命令执行无误后,再执行后面代码

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - &&\
sudo apt-get install -y nodejs

使用root身份安装

curl -fsSL https://deb.nodesource.com/setup_20.x | bash - &&\
apt-get install -y nodejs

如果安装其它版本,只需将上面命令中的setup_20.x换成所需安装的版本即可。

Node官网下载地址:https://nodejs.org/en/download/

还有另外一种方法,直接在ubuntu上使用apt安装Node

注意:使用apt安装,有可能会安装低版本的node,后面安装中会报错:

error @clickhouse/client@0.2.10: The engine “node” is incompatible with this module. Expected version “>=16”. Got “12.22.9”
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

这个错误表明你的当前 Node.js 版本不符合 @clickhouse/client 模块的要求。@clickhouse/client 模块需要 Node.js 版本至少为 16。而你当前的 Node.js 版本是 12.22.9。

要解决这个问题,你可以考虑升级你的 Node.js 版本到符合要求的版本。

 

sudo apt update	
sudo apt install nodejs
#不自带 npm 需要自行安装
sudo apt install npm
#使用 n Node版本管理工具升级到 最新版
sudo npm install n -g
# 下载最新稳定版
sudo n stable
# 下载最新版
sudo n lastest
# 查看已下载的版本
sudo n ls
# 切换 Node 版本
sudo n 18.21.1
# 升级 npm 
sudo npm install npm -g 

卸载nodejs Ubuntu 和 Debian 软件包

apt-get purge nodejs &&\
rm -rf /etc/apt/sources.list.d/nodesource.list &&\
rm -rf /etc/apt/keyrings/nodesource.gpg
#卸载npm
npm uninstall npm -g

如果在安装过程中,无法安装npm,可以使用nvm进行安装

使用 nvm 安装 Node.js 和 npm: 使用 Node Version Manager (nvm) 可以更轻松地管理 Node.js 版本和 npm。你可以按照以下步骤安装 nvm,并使用它来安装 Node.js 和 npm:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
#或者使用wget安装
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
#安装 Node.js 和 npm,npm是包含在Node中的,安装Node会自动安装npm
nvm install node
#使用新安装的Node
nvm use node

 

使用nvm安装多版本node

#查看当前已经安装node
nvm ls
#安装 20x版本node,会默认安装20x的最高版本,例如20.12
nvm install 20
#使用20x版本
nvm use 20
#永久使用20x版本
nvm alias default 20

 

注意:如果以上方法都无法解决问题,你可以尝试使用 yarn 代替 npm。yarn 是一个快速、可靠、安全的包管理器,通常可以作为 npm 的替代品使用。你可以按照以下步骤安装 yarn

安装Yarn

使用 yarn 替代 npm: 因为该项目使用Yarn进行编译,所以我们要安装一下Yarn。

npm install -g yarn

通过 Yarn 官方安装脚本安装: Yarn 官方提供了一个安装脚本,你可以通过以下命令来安装:

curl -o- -L https://yarnpkg.com/install.sh | bash
#或者使用wget方法安装
wget -qO- https://yarnpkg.com/install.sh | bash

新建MySQL数据库

这里我们使用的是MySQL,在数据库中新建一个空数据库

使用phpmyadmin,在服务器上创建一个Umami的空数据库

自建统计网站Umami统计-1

或者在服务器上直接创建:

mysql -u root -p umami < sql/schema.mysql.sql

安装Umami

下载安装Umami

自定义下载到/home/umami目录,你也可以放在其他目录。

cd /home/
#git拉取umami
git clone https://github.com/umami-software/umami.git
#进入umami目录
cd umami
#安装
yarn install

自建统计网站Umami统计-1耐心等待,安装完毕后,需要配置.env 文件

配置 .env 文件

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

使用touch命令新建.env文件,或者直接使用vim命令新建.env文件

vi .env

注意.env文件创建完毕后,在目录下是查看不到的,.env是隐藏文件,可以使用vi直接编辑。

编辑.env文件输入以下配置保存即可:

DATABASE_URL=mysql://umamiuser:umamipass@localhost:3306/umami_db

APP_SECRET=bu4orqfdlG+Dh3Otau4oWSBbI9kGWSkGfYc/WiH/
DISABLE_TELEMETRY=1
TRACKER_SCRIPT_NAME=custom
  • DATABASE_URL:按说明填写我们之前配置的数据库参数即可。
  • HASH_SALT:填写随机字符即可,加密用。
  • TRACKER_SCRIPT_NAME:统计链接的自定义js文件名称,你喜欢什么名字就输入什么,不要用中文,后面也不用加.js。

两种数据库的链接方式示例

postgresql://username:mypassword@localhost:5432/mydb
mysql://username:mypassword@localhost:3306/mydb

编译 Umami

yarn build

等他执行完即可。

如果遇到无法连接数据库的错误

$ node scripts/check-db.js
✓ DATABASE_URL is defined.
✗ Unable to connect to the database.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
ERROR: “check-db” exited with 1.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

将localhost修改为127.0.0.1

DATABASE_URL=mysql://用户名:密码@127.0.0.1:3306/数据库名称
APP_SECRET=bu4orqfdlG+Dh3Otau4oWSBbI9kGWSkGfYc/WiH/
DISABLE_TELEMETRY=1
TRACKER_SCRIPT_NAME=custom

安装过程中遇到P3018错误

Error: P3018

A migration failed to apply. New migrations cannot be applied before the error is recovered from. Read more about how to resolve migration issues in a production database: https://pris.ly/d/migrate-resolve

Migration name: 05_add_visit_id

Database error code: 1305

Database error:
FUNCTION t_umami_hk.BIN_TO_UUID does not exist

Please check the query number 2 from the migration file.

✗ Command failed: prisma migrate deploy
Error: P3018

A migration failed to apply. New migrations cannot be applied before the error is recovered from. Read more about how to resolve migration issues in a production database: https://pris.ly/d/migrate-resolve

Migration name: 05_add_visit_id

Database error code: 1305

Database error:
FUNCTION t_umami_hk.BIN_TO_UUID does not exist

Please check the query number 2 from the migration file.

 

error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
ERROR: “check-db” exited with 1.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

MariaDB 目前还没有实现 BIN_TO_UUID,而它是 MySQL 中的内置函数。使用MariaDB数据库安装会报错p3018错误

umami更新到2.11版本之后,引入了UUID支持,MySQL 需要在迁移脚本中生成随机 UUID,但是你如果使用的是MariaDB的话,那么MariaDB不支持这个功能。你需要手动修改数据库。

p3018错误的解决方法

执行下面的命令,然后重新进行安装,问题解决。

npx prisma migrate resolve --applied "05_add_visit_id"
#重新运行安装命令
yarn build

卸载Umami

如果在安装过程中出现一些不可逆的操作,可以卸载掉Umami再重新安装,删除掉Umami的安装目录即可

rm -rf /home/umami
reboot

启动应用程序

通常使用yarn start就可以直接启动,但是退出ssh之后就直接停止运行了,所以需要用一些工具保证后台运行,官方文档中的推荐是安装PM2管理器。

如果想简单一些,不妨制作一个开机启动的进程守护文件。

vi /etc/systemd/system

进入到system目录中,新建一个 umami.service 的文件。

[Unit]
Description = umami
[Service]
WorkingDirectory=/home/umami
ExecStart = yarn start
Restart = always
Type = simple
User = umami
[Install]
WantedBy = multi-user.target

如果想使用其它端口来访问umami的话,可以修改 ExecStart = yarn start 行,例如使用3100端口:ExecStart = yarn start -p 3100

然后使用相关命令来启动umami

#重新加载 systemd 的配置文件
sudo systemctl daemon-reload
#设置开机启动
systemctl enable umami
#启动
sudo systemctl start umami
#下面是常用的管理命令。
#查看状态
sudo systemctl status umami
#重新启动
sudo systemctl restart umami
#停止服务
sudo systemctl stop umami
#禁止开机启动
sudo systemctl disable umami

安装PM2管理器

PM2管理器是一个守护进程的程序,通过PM2打开Umami

npm install pm2 -g
sudo yarn global add pm2
cd /home/umami
pm2 start npm --name umami -- start 
pm2 startup
pm2 save

使用npm安装PM2时遇到错误1143

node:internal/modules/cjs/loader:1143
const err = new Error(message);
^

Error: Cannot find module ‘semver'
Require stack:
– /usr/share/nodejs/npm/lib/utils/unsupported.js
– /usr/share/nodejs/npm/lib/cli.js
– /usr/share/nodejs/npm/bin/npm-cli.js
at Module._resolveFilename (node:internal/modules/cjs/loader:1143:15)
at Module._load (node:internal/modules/cjs/loader:984:27)
at Module.require (node:internal/modules/cjs/loader:1231:19)
at require (node:internal/modules/helpers:179:18)

at Module._compile (node:internal/modules/cjs/loader:1369:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1427:10)
at Module.load (node:internal/modules/cjs/loader:1206:32)
at Module._load (node:internal/modules/cjs/loader:1022:12)
at Module.require (node:internal/modules/cjs/loader:1231:19) {
code: ‘MODULE_NOT_FOUND',
requireStack: [
‘/usr/share/nodejs/npm/lib/utils/unsupported.js',
‘/usr/share/nodejs/npm/lib/cli.js',
‘/usr/share/nodejs/npm/bin/npm-cli.js'
]
}

Node.js v20.12.2

解决方法:

这个错误是npm安装完成后没有重新启动服务器,变量没有生效,重新启动服务器即可解决问题。

巨大的坑

在安装完毕后,使用 yarn start 命令来打开Umami,如果3000端口被占用,会提示端口占用错误。

root@localhost:~# yarn start
yarn run v1.22.22
error Couldn't find a package.json file in “/root”
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
root@localhost:~# cd /home/umami
root@localhost:/home/umami# yarn start
yarn run v1.22.22
$ next start
⨯ Failed to start server
Error: listen EADDRINUSE: address already in use :::3000
at Server.setupListenHandle [as _listen2] (node:net:1897:16)
at listenInCluster (node:net:1945:12)
at Server.listen (node:net:2037:7)
at /home/umami/node_modules/next/dist/server/lib/start-server.js:279:16

at startServer (/home/umami/node_modules/next/dist/server/lib/start-server.js:190:11)
at nextStart (/home/umami/node_modules/next/dist/cli/next-start.js:50:40)
at /home/umami/node_modules/next/dist/bin/next:155:54
at async main (/home/umami/node_modules/next/dist/bin/next:155:5) {
code: ‘EADDRINUSE',
errno: -98,
syscall: ‘listen',
address: ‘::',
port: 3000
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

使用命令查看是谁占用了3000端口

root@localhost:~# sudo lsof -i :3000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nghttpx 919 root 5u IPv4 34021 0t0 TCP localhost:3000 (LISTEN)
nghttpx 958 root 5u IPv4 34021 0t0 TCP localhost:3000 (LISTEN)

nghttpx占用了3000端口,如果没有nghttpx上没有服务要跑的话,关闭nghttpx即可。

systemctl stop nghttpx
systemctl disable nghttpx
reboot

停止服务,然后禁用开机启动,之后重新启动系统。

注意:巨大的坑来了。

使用 yarn start 命令启动Umami,这时端口没有占用,启动开始正常,然后:

root@localhost:/home/umami# yarn start
yarn run v1.22.22
$ next start
▲ Next.js 14.1.4
– Local: http://localhost:3000

⚠ “next start” does not work with “output: standalone” configuration. Use “node .next/standalone/server.js” instead.
✓ Ready in 2s

启动过程中,抛出了一条警告,大致意思是

“next 启动”不适用于“输出:独立”配置。请使用“node.next/standalone/server.js”
这种警告到底是不是错误,需要不需要解决,在网上查了一圈,是next.js的问题。

最终结果:无需理会此警告,在浏览器中IP地址+端口,如果可以正常访问,就需继续下一步,注意,服务器的防火墙要打开3000端口。否则会拒绝访问。

测试安装是否成功

安装完毕后,你需要通过IP地址+端口来访问,查看页面是否能打开,初次访问,页面打开比较缓慢,等待一下就好。

自建统计网站Umami统计-1

如果没显示什么错误即安装成功,测试本机http://127.0.0.1:3000打开是否正常。

curl http://127.0.0.1:3000

查看一下有没有数据输出。

自建统计网站Umami统计-1查看3000端口当前状态,如果3000端口没有占用,那么umami应该是没有启动起来。

lsof -i:3000

使用你的服务器IP+端口,在浏览器中打开Umami

Ubuntu搭建统计网站Umami统计-1

使用系统默认的用户名和密码进行登录

  • 用户名:admin
  • 密码:umami

Ubuntu搭建统计网站Umami统计-1

页面很简洁大方,快去设置你的吧!添加网站后获取代码就可以进行统计了!

记得在个人资料里更改密码,密码设置复杂一些!

Ubuntu搭建统计网站Umami统计-1

PM2卸载

#禁止开机启动PM2
pm2 unstartup
#杀死守护程序
pm2 kill
#卸载
npm remove pm2 -g
#删除所有保存的配置和日志
rm -rf ~/.pm2

最后,删除完成后,进入 /usr/local/lib/node_modules/ 下面查看是否有pm2文件夹,如果有的话直接删除即可。

OpenLiteSpeed做反向代理服务器

在OpenLiteSpeed中新建一个虚拟主机,然后进入到此主机中新建外部应用程序 , 类型选择 网络服务器, 名称写tongji , 地址就写 127.0.0.1 :3000, 可以写公网IP:3000

Ubuntu搭建统计网站Umami统计-1

Ubuntu搭建统计网站Umami统计-2

Ubuntu搭建统计网站Umami统计-3

然后创建一个资源集,类型选择 Proxy, URI设置为 /

Ubuntu搭建统计网站Umami统计-1

Ubuntu搭建统计网站Umami统计-2

Ubuntu搭建统计网站Umami统计-3

 

注意:网络服务器选择之前创建的tongji,其它设置填写最大。

重写规则, 因为 前后端域名不一样, 所以要用 伪静态规则把域名也传递到后端, 否则后端会拒绝连接, 前端直接返回403或者500错误。

Ubuntu搭建统计网站Umami统计-1

RewriteRule ^/(.*)$ http://tongji/$1 [P,E=Proxy-Host:xxx.com]
注意 其中 tongji 是 第二步里的外部应用程序名称, xxx.com是反向代理的域名。
安装 CyberPanel 面板的,重写规则会提示 Disabled by CyberPanel ,需要在CyberPanel 面板对应的网站里面填写重写规则。
最后,重新启动OpenLiteSpeed就可以正常访问了。

配置中文

我们登陆后台后,可能默认是英文,该面板自带简体中文。打开Settings–>Profile–>Language选择中文即可。

升级更新umami

关于umami有更新,先暂停pm2然后执行以下代码更新后再运行:

pm2 stop umami
#进入umami文件目录
cd /home/umami 
git pull
yarn install
yarn build

在升级umami的过程中遇到了 prisma migrate deploy Error: P3009

这个错误是由于umami更新到2.11版本之后,引入了UUID支持,MySQL 需要在迁移脚本中生成随机 UUID,但是你如果使用的是MariaDB的话,那么MariaDB不支持这个功能。你需要手动修改数据库。

下面是mysql的执行语句。

-- AlterTable
ALTER TABLE website_event ADD COLUMN visit_id VARCHAR(36) NULL;

-- Update with UUIDv4
UPDATE website_event we
JOIN (
SELECT DISTINCT
s.session_id,
s.visit_time,
LOWER(CONCAT(
HEX(SUBSTR(MD5(RAND()), 1, 4)), '-',
HEX(SUBSTR(MD5(RAND()), 1, 2)), '-4',
SUBSTR(HEX(SUBSTR(MD5(RAND()), 1, 2)), 2, 3), '-',
CONCAT(HEX(FLOOR(ASCII(SUBSTR(MD5(RAND()), 1, 1)) / 64)+8),SUBSTR(HEX(SUBSTR(MD5(RAND()), 1, 2)), 2, 3)), '-',
HEX(SUBSTR(MD5(RAND()), 1, 6))
)) AS uuid
FROM (
SELECT DISTINCT session_id,
DATE_FORMAT(created_at, '%Y-%m-%d %H:00:00') visit_time
FROM website_event
) s
) a ON we.session_id = a.session_id AND DATE_FORMAT(we.created_at, '%Y-%m-%d %H:00:00') = a.visit_time
SET we.visit_id = a.uuid
WHERE we.visit_id IS NULL;

-- ModifyColumn
ALTER TABLE website_event MODIFY visit_id VARCHAR(36) NOT NULL;

-- CreateIndex
CREATE INDEX website_event_visit_id_idx ON website_event(visit_id);

-- CreateIndex
CREATE INDEX website_event_website_id_visit_id_created_at_idx ON website_event(website_id, visit_id, created_at);

然后解决 Umami 文件夹中的迁移:

#进入umami文件目录
cd /home/umami
npx prisma migrate resolve --applied "05_add_visit_id"

之后在执行更新命令,别忘记启动PM2

#进入umami文件目录
cd /home/umami
git pull
yarn install
yarn build
pm2 start npm --name umami -- start

 

到这里umami搭建就正式结束了。其余配置都很简单,我们只需要根据umami面板提示的操作进行即可,有不懂的欢迎评论区留言交流。

参考文章:https://www.howtoforge.com/how-to-install-umami-analytics-on-debian-12/

5/5 - (1 vote)

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注