最近给网站做一些调整,本来是要跑一个项目的,发现服务器内存占用太大了,尤其是我使用的统计程序 Plausible
内存占用比较多
上面图中这我通过限制内存临时的解决了这个问题,但这并不是长久之计
这时我在 Github 上没有找到合适的替代品(基本都跑了 ClickHouse),这下我还是准备换回了 Umami
这种还可以跑在SaaS平台上面
搭建过程
这里以 Docker 部署为例,如不使用 Docker 部署,请参考官方文档进行https://umami.is/docs/install
搭建环境
本次搭建主要环境为
- 系统: Debian 12
- 防火墙: Iptables
- 数据库: MariaDB 11.4
Docker 安装
Docker 一般可以通过当前系统自带的包管理器
进行安装,但是在基于 RHEL
的系统中通过 yum 安装 Docker 会给你安装成 Podman 所以这里通过 Docker 官方脚本进行安装
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
上方脚本会自行判断系统,不用担心
没有 sudo
可以手动安装 apt install sudo
部署 Umami
下载并解压 Umami
首先从 Github 下载并解压 Umami 的源代码
wget https://github.com/umami-software/umami/archive/refs/heads/master.tar.gz
tar -zxvf master.tar.gz
cd umami-master/
配置环境
上面进入目录后可以通过
cat docker-compose.yml
查看配置
root@64ed11:~/umami-master# cat docker-compose.yml
---
version: '3'
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://umami:umami@db:5432/umami
DATABASE_TYPE: postgresql
APP_SECRET: replace-me-with-a-random-string
depends_on:
db:
condition: service_healthy
restart: always
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"]
interval: 5s
timeout: 5s
retries: 5
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: umami
volumes:
- umami-db-data:/var/lib/postgresql/data
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
volumes:
umami-db-data:
在上面可以看到默认是用的 postgresql 数据库,而我们需要用 MariaDB
数据库,那么我们就要改成下面的 docker-compose.yml
直接在 umami-master
目录下执行 nano docker-compose.yml
命令
services:
umami:
image: ghcr.io/umami-software/umami:mysql-latest
ports:
- "3000:3000"
env_file:
- umami.env
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
restart: always
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"]
interval: 5s
timeout: 5s
retries: 5
mariadb:
image: mariadb:11.4
hostname: mariadb
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: "Password1"
MYSQL_USER: "umami"
MYSQL_PASSWORD: "umami123456"
MYSQL_DATABASE: "umami"
MYSQL_ROOT_HOST: "%"
volumes:
- ./mariadb:/var/lib/mysql
ports:
#加上 127.0.0.1: 防止公网访问
- "127.0.0.1:3306:3306"
restart: always
写完了配置按下 Ctrl + X
再按 Y
最后回车
即可保存
现在我们创建一个 umami.env
文件,然后写入下面的内容
DATABASE_URL = mysql://root:123456@mariadb/umami
DATABASE_TYPE = mysql
#APP_SECRET 可以随便填写一些字符串
APP_SECRET = B11OHc88n2
启动 Umami
之后运行
docker compose up
如果能正常访问服务器 IP:3000
那么可以在上方的命令后面加上 -d
参数来保持后台运行(记得与 up
之间有空格)
登入 Umami
现在可以访问服务器 IP:3000
会跳转登入界面
默认的账号(Username)为 admin
密码(Password)为umami
我们可以在右上角的地球
图标选择语言(手机端为右上角≡
中的Language
)
设置
–用户
修改账号和密码Nginx 反向代理(建议)
ip+端口访问并不是一个好的方法,所以我们需要使用域名
这里就不提供 Nginx
的部署教程了,因为反向代理的方式很多
下面是 Nginx Umami 的反向代理的配置
location / {
proxy_pass http://Umami的容器 ip:3000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
重写路径(建议)
虽然这些统计不会对访问者产生什么不好的体验,但一些广告过滤器规则仍会屏蔽这类统计的JS文件和API ,所以我们可以通过 所以我们需要Nginx
反向代理来伪装
一下伪装
一下
发现 Umami 可以直接配置环境变量来直接重写路径,直接在之前的 umami.env
文件中添加下面内容
COLLECT_API_ENDPOINT = /x.js
TRACKER_SCRIPT_NAME = api/x
你可以改成其他的路径,这里要说明一下 TRACKER_SCRIPT_NAME
开头不要加上 /
这会导致 Umami
后台复制统计代码时出现两个 /
但 COLLECT_API_ENDPOINT
不会出现这种情况
经过测试,也不会出现说明问题
Error: P3009 报错解决
umami-1 | Error: P3018
umami-1 |
umami-1 | 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
umami-1 |
umami-1 | Migration name: 05_add_visit_id
umami-1 |
umami-1 | Database error code: 1305
umami-1 |
umami-1 | Database error:
umami-1 | FUNCTION umami.BIN_TO_UUID does not exist
umami-1 |
umami-1 | Please check the query number 2 from the migration file.
umami-1 |
umami-1 |
umami-1 | ✗ Command failed: prisma migrate deploy
umami-1 | Error: P3018
umami-1 |
umami-1 | 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
umami-1 |
umami-1 | Migration name: 05_add_visit_id
umami-1 |
umami-1 | Database error code: 1305
umami-1 |
umami-1 | Database error:
umami-1 | FUNCTION umami.BIN_TO_UUID does not exist
umami-1 |
umami-1 | Please check the query number 2 from the migration file.
umami-1 |
umami-1 |
umami-1 |
umami-1 | error Command failed with exit code 1.
umami-1 | info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
umami-1 | ERROR: "check-db" exited with 1.
umami-1 | error Command failed with exit code 1.
umami-1 | info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
从报错内容可以看到是在 05_add_visit_id 步骤中的 sql 语法有用到 BIN_TO_UUID
函数,这个 BIN_TO_UUID
是只在一次报错出现的,在后面的报错内容中就不会再次出现
出现这个原因是 MariaDB 不支持 BIN_TO_UUID
函数导致的,我们可以进入 Umami
数据库中执行下方SQL语法来标记这个步骤已经完成
(只要你不是从 v1 版本升级到 v2 版本的 Umami,大概率不会出现什么问题,直到我现在也没出现过什么问题)
UPDATE _prisma_migrations
SET finished_at = NOW(), logs = NULL, applied_steps_count = 1
WHERE migration_name = '05_add_visit_id';
分别解析上面的 SQL 语法就是下面所说的意思。如果你使用的是 PhpMyAdmin
管理数据库,那么你能很容易的修改
- 第一行代表更新
_prisma_migrations
表 - 第二行代表设置
finished_at
为NOW()
,logs
为空,applied_steps_count
为1
- 第三行代表更新
_prisma_migrations
表中的05_add_visit_id
行
执行完后可以通过docker compose restart
来重启容器
如何通过命令连接数据库
首先执行
docker exec -it umami-master-mariadb-1 /bin/bash
命令进入你的 MariaDB 容器中,其中 umami-master-mariadb-1
为 MariaDB 的容器名,可以通过执行 docker stats
命令来查看
进入容器后然后执行
mariadb -u root -pPassword1
其中 -u
参数填写用户名,这里用的是 root
-p
参数后为密码,注意 -p
后面不要加上空格
通过下方进入 Umami
表
use umami;