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/找到
要求:
- 具有 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
更新系统
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的空数据库
或者在服务器上直接创建:
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
耐心等待,安装完毕后,需要配置.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 existPlease check the query number 2 from the migration file.
✗ Command failed: prisma migrate deploy
Error: P3018A 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 existPlease 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地址+端口来访问,查看页面是否能打开,初次访问,页面打开比较缓慢,等待一下就好。
如果没显示什么错误即安装成功,测试本机http://127.0.0.1:3000打开是否正常。
curl http://127.0.0.1:3000
查看一下有没有数据输出。
查看3000端口当前状态,如果3000端口没有占用,那么umami应该是没有启动起来。
lsof -i:3000
使用你的服务器IP+端口,在浏览器中打开Umami
使用系统默认的用户名和密码进行登录
- 用户名:admin
- 密码:umami
页面很简洁大方,快去设置你的网站统计吧!添加网站后获取代码就可以进行统计了!
记得在个人资料里更改密码,密码设置复杂一些!
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
然后创建一个资源集,类型选择 Proxy, URI设置为 /
注意:网络服务器选择之前创建的tongji,其它设置填写最大。
重写规则, 因为 前后端域名不一样, 所以要用 伪静态规则把域名也传递到后端, 否则后端会拒绝连接, 前端直接返回403或者500错误。
RewriteRule ^/(.*)$ http://tongji/$1 [P,E=Proxy-Host:xxx.com]
配置中文
我们登陆后台后,可能默认是英文,该面板自带简体中文。打开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/