精品軟體與實用教程
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 v18.x
透過NodeSource提供的官方套件安裝自備最新npm
Node.js目前有三個版本,Node.js 18.x 、Node.js 20.x、Node.js 21.x
以下是Node.js 18.x的安裝,一行程式碼搞定。 &&\ 的意思是前面的指令執行無誤後,再執行後面程式碼
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&\ sudo apt-get install -y nodejs
使用root身分安裝
curl -fsSL https://deb.nodesource.com/setup_18.x | bash - &&\ apt-get install -y nodejs
安裝完畢後,看看版本是否安裝成功
node -v
如果安裝其它版本,只需將上面命令中的setup_20.x換成所需安裝的版本即可。
注意:Ubuntu22.4使用Node.js 20.x、Node.js 21.x安裝後,umami開啟後一片空白,無法存取。會造成404錯誤!
Umami安裝之後打開一片空白的解決方法
這也是一個巨大的坑,使用Node.js 20.x、Node.js 21.x進行編譯後,會發生錯誤,打開瀏覽器會出現一片空白,並不是沒有內容,F12後發現,所有的js檔案均無法訪問,使用Node.js 20.x、Node.js 21.x開啟一切都會遇到這樣的問題,使用Node.js 20.x、Node.js 21.x開啟一切都會遇到這樣的問題,Nodexjs 18.
注意:請使用Node.js 18.x進行編譯,請使用Node.js 18.x進行編譯,請使用Node.js 18.x進行編譯,重要的事情說三遍。不要自己給自己挖坑!
以下關於Node.js的內容僅供參考,實際應用程式中,請忽略下方Node的相關內容。
----------------------------------------------------------------------------------------
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 # install n -g # 下載已穩定版本s # 切換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/installTPsh.0/installTPsh.和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@127.0.0.1:3306/umami_db APP_SECRET=bu4orqfdlG+Dh3Otau4oWSBbI9kGWSkGfYc/WiH/ DISABLE_RACLEtau4oWSBbI9kGWSkGfYc/WiH/ DISABLE_RACLEtau4oWSBbI9kGWSkGfYc/WiH/ DISABLE_RACLEMET
DATABASE_URL
DATABASE_URL=mysql://umamiuser:umamipass@127.0.0.1:3306/umami_db
解釋:這是Umami 的資料庫連線URL,指向一個MySQL 資料庫umami_db,資料庫使用者是umamiuser,密碼是umamipass,資料庫伺服器運行在127.0.0.1:3306。
確保有效性:
確認資料庫已正確創建,且資料庫使用者和密碼配置無誤。
確保MySQL 資料庫允許透過127.0.0.1 位址進行連線。
確保Umami 服務可以存取該MySQL 資料庫。
APP_SECRET
APP_SECRET=bu4orqfdlG+Dh3Otau4oWSBbI9kGWSkGfYc/WiH/
解釋:這是一個用於加密和簽署的應用程式金鑰。 Umami 使用它來確保JWT(JSON Web Tokens)和其他敏感資訊的安全。
確保有效性:
保持該密鑰的安全,不要公開或洩露。
可以產生更複雜的金鑰,例如使用openssl rand -base64 32 產生新的金鑰。
DISABLE_TELEMETRY
DISABLE_TELEMETRY=1
解釋:停用遙測功能,意味著不會向Umami 的伺服器發送任何統計數據或使用資料。
確保有效性:此配置是有效的,並且已經停用了遙測,適用於更嚴格的隱私權要求。
TRACKER_SCRIPT_NAME
TRACKER_SCRIPT_NAME=custom
解釋:此設定指定了Umami 追蹤腳本的名稱,預設名稱是umami.js,但你可以將其變更為custom.js 或其他任何名字。
確保有效性:如果你希望使用自訂名稱,請確保你在網頁程式碼中引用了正確的JavaScript 追蹤腳本。
其他可能的配置項
根據你使用的Umami 版本和需求,可能還需要以下設定:
NEXT_PUBLIC_BASE_URL
用於指定Umami 實例的基礎URL。例如,如果你的Umami 安裝在 https://umami.example.com,可以設定:
NEXT_PUBLIC_BASE_URL=https://umami.example.com
DISABLE_AUTH
如果你希望停用Umami 的身份驗證功能,可以設定:
DISABLE_AUTH=true
警告:停用身份驗證將使得任何人都能存取管理面板,建議僅在開發環境中使用。
UMAMI_VERSION
如果你想要使用特定版本的Umami,可以指定:
UMAMI_VERSION=v1.35.0
PORT
配置Umami 監聽的連接埠(如果預設連接埠不適用):
PORT=3000
SMTP 設定(用於電子郵件通知)
如果需要啟用電子郵件通知或其他郵件功能,可以設定SMTP 配置,例如:
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=user@example.com
SMTP_PASSWORD=yourpassword
UMAMI_LOG_LEVEL
配置日誌級別,可根據需要設定:
UMAMI_LOG_LEVEL=info
設定檔範例:
將所有這些配置項整合到.env 檔案中:
DATABASE_URL=mysql://umamiuser:umamipass@localhost:3306/umami_db APP_SECRET=bu4orqfdlG+Dh3Otau4oWSBbI9kGWSkGfYc/WiH/ DISABLE_TELEMETRYRIP1 TRACKER_SCT_NNfYc/WiH/ DISABLE_TELEMETRYRIP1 TRACKER_SCT_NNAMEABLE_TE NEXT_PUBLIC_BASE_URL=https://umami.example.com DISABLE_AUTH=true PORT=3000
這些配置項目應該是有效的,確保你已經驗證了MySQL 資料庫連接,並且根據需要添加了其他相關配置(如SMTP 或身份驗證設定)。
兩種資料庫的連結方式範例
postgresql://username:mypassword@localhost:5432/mydb mysql://username:mypassword@localhost:3306/mydb
安裝更新
執行以下指令更新Prisma 相關依賴:
yarn add --dev prisma@latest yarn add @prisma/client@latest
編譯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_TELEMETRYRIP1 TRACKER_SCT_NAMEABLE_TELEMETRY=1 TRACKER_SCT_NAMEABLE_TELEMETRY=1 TRACKER_SCT_NAMEABLE_TELEMETRYRIP1 TRACKER_SCT_NAMEABLE_TELEMETRYRIP1 TRACKER_SCT_NAMEABLE_TELEMETRY=1 TRACKER_SCT_NAMEABLE_TELEMETRY=1 TRACKER_SCT_NAMEABLE_TELEMETRY=1 TRACKER_SCT_NAMEABLE_TELEMETRY=1 TRACKER_SCT_NAMEABLE_TELEMETRYRIP1 TRACKER_SCT_NAMEABLE_TE
安裝過程中遇到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
3000埠被佔用
如果3000埠被佔用,啟動會失敗,需要關閉佔用3000埠的nghttpx
nghttpx佔用了3000端口,如果沒有nghttpx上沒有服務要跑的話,關閉nghttpx即可。
systemctl stop nghttpx systemctl disable nghttpx reboot
安裝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 Object.(/usr/share/nodejs/npm/lib/utils/unsupported.js:2:16)
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 new Promise ()
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的執行語句。
-- Alter? '-', HEX(SUBSTR(MD5(RAND()), 1, 2)), '-4', SUBSTR(HEX(SUBSTR(MD5(RAND()), 1, 2)), 2, 3), '-', CONCAT(HEX(FLOOR(ASCIISUBSTRSTR(ASCII) STR( 64)+8),SUBSTR(HEX(SUBSTR(MD5(RAND()), 1, 2)), 2, 3)), '-', HEX(SUBSTR SMD5(RAND()), 1, 6)) )) AS id FROM ( '%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, '1TP34-1301000135000m0002002020202:00 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 CRE INDEX website_event_visit_ate_ate_ 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/