Docker 自建 Umami 网站流量统计工具

1682 字
8 分钟
Docker 自建 Umami 网站流量统计工具

最近给网站做一些调整,本来是要跑一个项目的,发现服务器内存占用太大了,尤其是我使用的统计程序 Plausible 内存占用比较多

Plausible内存占用
Plausible内存占用

上面图中这我通过限制内存临时的解决了这个问题,但这并不是长久之计

这时我在 Github 上没有找到合适的替代品(基本都跑了 ClickHouse),这下我还是准备换回了 Umami 这种还可以跑在SaaS平台上面

[hidden type=“background”]当初我使用过一段时间的 Umami 因为出现了某些问题,在官方社区询问无果后换到了 Plausible[/hidden]

搭建过程#

这里以 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

[admonition title=“注意!” color=“red”]这里的 MariaDB 参数仅供参考,请根据自己需求进行调整(通过 env 变量更改密码需要删除当前目录下的 MariaDB 文件夹,请提前做好备份)[/admonition]

启动 Umami#

之后运行

docker compose up

如果能正常访问服务器 IP:3000那么可以在上方的命令后面加上 -d 参数来保持后台运行(记得与 up 之间有空格)

登入 Umami#

现在可以访问服务器 IP:3000会跳转登入界面

默认的账号(Username)为 admin
密码(Password)为umami

我们可以在右上角的地球图标选择语言(手机端为右上角中的Language )

[admonition title=“注意!” color=“red”]这里建议最好修改账号和密码,在设置-用户修改账号和密码[/admonition]

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;

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Docker 自建 Umami 网站流量统计工具
https://blog.nwn.moe/posts/12/
作者
籽夏
发布于
2024-07-23
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
籽夏
谎言的代价是什么?
公告
欢迎来到我的博客!
分类
标签
站点统计
文章
15
分类
3
标签
12
总字数
34,084
运行时长
0
最后活动
0 天前
站点信息
文章许可
CC BY-NC-SA 4.0
构建时间
2026年8月29日 00:03:12