Docker 自建 Umami 网站流量统计工具
最近给网站做一些调整,本来是要跑一个项目的,发现服务器内存占用太大了,尤其是我使用的统计程序 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.shsudo sh get-docker.sh上方脚本会自行判断系统,不用担心
没有 sudo 可以手动安装 apt install sudo
部署 Umami
下载并解压 Umami
首先从 Github 下载并解压 Umami 的源代码
wget https://github.com/umami-software/umami/archive/refs/heads/master.tar.gztar -zxvf master.tar.gzcd 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: 5volumes: 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/umamiDATABASE_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.jsTRACKER_SCRIPT_NAME = api/x你可以改成其他的路径,这里要说明一下 TRACKER_SCRIPT_NAME 开头不要加上 / 这会导致 Umami 后台复制统计代码时出现两个 /
但 COLLECT_API_ENDPOINT 不会出现这种情况
经过测试,也不会出现说明问题
Error: P3009 报错解决
umami-1 | Error: P3018umami-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-resolveumami-1 |umami-1 | Migration name: 05_add_visit_idumami-1 |umami-1 | Database error code: 1305umami-1 |umami-1 | Database error:umami-1 | FUNCTION umami.BIN_TO_UUID does not existumami-1 |umami-1 | Please check the query number 2 from the migration file.umami-1 |umami-1 |umami-1 | ✗ Command failed: prisma migrate deployumami-1 | Error: P3018umami-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-resolveumami-1 |umami-1 | Migration name: 05_add_visit_idumami-1 |umami-1 | Database error code: 1305umami-1 |umami-1 | Database error:umami-1 | FUNCTION umami.BIN_TO_UUID does not existumami-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_migrationsSET finished_at = NOW(), logs = NULL, applied_steps_count = 1WHERE 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;文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!

