Docker 自建 Umami 网站流量统计工具
本文最后更新于 141 天前,其中的信息可能已经有所发展或是发生改变。

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

Plausible内存占用

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

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

当初我使用过一段时间的 Umami 因为出现了某些问题,在官方社区询问无果后换到了 Plausible

搭建过程

这里以 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
注意!
这里的 MariaDB 参数仅供参考,请根据自己需求进行调整(通过 env 变量更改密码需要删除当前目录下的 MariaDB 文件夹,请提前做好备份)

启动 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;
本文标题:Docker 自建 Umami 网站流量统计工具
本文链接:https://blog.wuw.moe/archives/12.html
本文作者:籽夏
如文章未另说明,则许可协议均采用CC BY-NC-SA 4.0署名-非商业性使用-相同方式共享 4.0 国际
暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇