Published on

升级在 Docker 上部署的 Umami

Authors
  • avatar
    作者
    老麦

前言

使用 Umami 已经有一段时间了,作为普通的个人站点来,这样的统计外挂程式其实已经足够了。

我是使用 Docker 来安装 Umami 的,当时安装的版本是 1.4,使用期间后台有过版本的升级提示。但我个人比较懒,并且认为既然能稳定在跑就没有必要升级这样子。直到今天,宿主机上另一个容器需要升级,借此机会决定顺便将 Umami 的版本从 V1 升级到 V2。

升级

由于架构不同,因此 V1 中的数据要转换成适配 V2 的数据。官方有提供一个脚本 @umami/migrate-v1-v2 来让我们进行转换。

升级方法以 Docker 部署为例:

  1. 进入正在运行的旧版本的 Umami 容器里;
# 查看正在运行的容器
docker ps -a

# 进入旧版本的 Umami 容器
docker exec -it -u 0 容器ID sh
  1. 在容器内部使用转换脚本;

转换演示:

/app # npx @umami/migrate-v1-v2@latest
Need to install the following packages:
  @umami/migrate-v1-v2@0.15.0
Ok to proceed? (y) y
Running v0.15.0
✓ DATABASE_URL is defined.
✓ Database connection successful.
Preparing v1 tables for migration
✓ Dropped v1 database keys.
✓ Dropped v1 database indexes.
✓ Renamed v1 database tables.
✓ Database v1 tables ready for migration.
Database v2 tables not found.
Adding v2 tables...
✓ Ran sql file /db/postgresql/migrations/01_init/migration.sql.
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "umami", schema "public" at "db:5432"
Migration 01_init marked as applied.

✓ Database is ready for migration.
✓ Starting v2 data migration. Please do no cancel this process, it may take a while.
✓ Ran sql file /db/postgresql/data-migration-v2.sql.
✓ Data migration from V1 to V2 tables completed.
✔ Do you want to delete V1 database tables? (Y/N) … n
✓ Migration successfully completed.
npm notice
npm notice New major version of npm available! 8.19.3 -> 9.8.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.8.1
npm notice Run npm install -g npm@9.8.1 to update!
npm notice
/app # exit
其实这里我感觉我做法有点不太对,主要是在第 23 行那里选择不删除 V1 的数据表。当时我担心升级会出问题,就想保存一下数据,哪怕是升级不成功也可以继续待在 V1 这个版本。显然我是多虑了,直接选择 Y 删除即可。保存数据更好的做法是升级前备份一下绑定的目录。
  1. 停掉正在启动的容器(旧版本的 Umami);
docker compose down
  1. 编辑 docker-compose.yml 文件;
---
version: '3'
services:
  umami:
    image: docker.umami.dev/umami-software/umami:postgresql-latest
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://umami:umami@db:5432/umami
      DATABASE_TYPE: postgresql
      TRACKER_SCRIPT_NAME: laomai.js
      HASH_SALT: replace-me-with-a-random-string
    depends_on:
      - db
    restart: always
  db:
    image: postgres:12-alpine
    environment:
      POSTGRES_DB: umami
      POSTGRES_USER: umami # 数据库用户
      POSTGRES_PASSWORD: umami  # 数据库密码
    volumes:
      - ./sql/schema.postgresql.sql:/docker-entrypoint-initdb.d/schema.postgresql.sql:ro
      - ./umami-db-data:/var/lib/postgresql/data
    restart: always

要修改的地方只有一处,新版本的 TRACKER_SCRIPT_NAME 变量不再自动添加 .js 后缀。至于为什么要自定义跟踪器脚本的名字?原因很简单,Umami 默认的跟踪器脚本已经被大部分的广告插件给屏蔽了,不更改的话就统计不了访问的信息。

  1. 拉取新版本的镜像;
docker compose pull
  1. 启动新版本 Umami;
docker compose up --force-recreate

在后台运行:

docker compose up -d

扩展

如果你和我一样将 Umami 部署在国外的一些免费容器服务上,速度相对不够稳定。这时可以通过以下方法进行配置,将跟踪脚本文件放置在访问速度快且稳定的主机或者 CDN 上(实在不行就找朋友帮忙托管一下下)。

接下来就可以按照官方给出的配置进行个性即可,例:

<script async defer
  src="https://sdn.qylao.com/laomai.js"
  data-website-id="85a9edfb-5859-4f66-8a28-f7f8548a80b3"
  data-host-url="https://umami.laomai.org"
  data-domains="laomai.org"
></script>

更多配置可查阅官方文档, https://umami.is/docs/tracker-configuration

最后

其实要不是正好宿主机上有别的容器要升级,我也不会主动去升级这个 Umami,毕竟就我个人而言,升级前升级后的体验是一样的。我明确知道自己使用 Umami 的目的是什么,旧版本其实就已经满足我的使用需求了。

当然啦,还是回到那个根本原因里,因为我懒。新版本肯定是好的啊,重构后带来的提升还是很大的。

最后希望大家,折腾得快乐,快乐地折腾。