自建博客数据统计服务 umami v2

引言

愉快地用了一年多自建的 umami,突然发现 Railway 2023 年 8 月 1 日起要取消 developer plan, 尝试降级 hobby plan 但提示余额不足(此前的政策为不需要预存,每月有免费的 $5 额度, 这次额度不变,但账户需要预存 $10取消免费额度,最低套餐也要 $5/月)。 刚好前几天更新 service index 发现 Vercel 也提供了数据库托管服务,怒换之,开始了迁移到 Vercel 的探索之路。

Railway 部署 umami

该部分为部署 umami v1 时的笔记,仅供参考。

使用 umami 取代毒瘤 Google Analytics:

部署命令:

# 完全自建才需要,Railway 可以直接在网页 deploy
# 需要安装 Railway CLI 和 pgsql 两个软件依赖
railway run psql -h containers-us-west-15.railway.app -U postgres -d railway -f sql/schema.postgresql.sql

网站嵌入代码:

<script async defer
    data-website-id="xxx"
    src="https://a.domain.com/umami.js"
></script>

从 Railway 迁移到 Vercel

导出数据库

Railway 没有现成的数据库备份方案,只能 自动备份到 AWS S3 或者参考 How to Backup and Restore Your Postgres Database 手动备份。

# 安装 postgresql 客户端
sudo apt install postgresql-client
# 备份数据库,注意替换参数
pg_dump -U PGUSER -h PGHOST -p PGPORT -W -F t PGDATABASE > YOUR_FILENAME_HERE
# 官方示例
pg_dump -U postgres -h containers-us-west-15.railway.app -p 5802 -W -F t railway > umami-v2-$(date +'%Y%m%d').db

Migrating V1 to V2

参考 umami 文档 迁移数据库,如果是自建服务器迁移按照下面这样几步就解决了,但在 Railway / Vercel 这种平台操作就麻烦许多,而且我在迁移前就将导出的数据库导入了 Vercel,折腾了一个多小时也没解决,最后只是保留了 v1 数据库,没有迁移。

# 安装 Yarn
npm i -g yarn
# 安装编译迁移脚本
git clone https://github.com/umami-software/migrate-v1-v2.git
cd migrate-v1-v2
yarn install
yarn build
# 复制环境配置
cp ../umami/.env ./
# 启动
yarn start

新建 Vercel 数据库

在 umami 项目的 Storage 菜单里选择 postgres,注意创建时需要在 Advanced Options 里修改 prefix 为 DATABASE

这里我又犯了一个错误,由于上面的失误,删除了 Vercel 的 postgres 数据库后新建了一个,但没有在项目设置中删除缓存,部署后 Vercel 还是报错:

Error: Migration engine error:
db error: ERROR: prepared statement "s0" already exists

清除缓存重新部署,然后……这个错误还在 ( ╯-_-)╯~┴—┴。搜了 GitHub 发现是 Vercel 默认的环境变量有问题,少了 ?pgbouncer=true 这个参数,取消数据库关联,然后在本地创建 .env 文件部署即可(也可以直接在 Vercel 项目页面添加带参数的环境变量)。

导入数据库

虽然有 #Migrating V1 to V2 的失误,但 Railway 导出的数据库在 Vercel 确实是可以成功恢复的。

# 恢复数据库
pg_restore -U <username> -h <host> -p <port> -W -F t -d <db_name> <dump_file_name>
# 官方示例
pg_restore -U postgres -h containers-us-west-15.railway.app -p 6473 -W -F t -d railway mydatabasebackup

Vercel 部署 Umami

参考 Running on Vercel 一键部署即可,还通过 vercel.json 转发请求,避免访问 umami.is 这里的表述纯属误解,我本以为是转发(原本会访问 umami.is 的)请求到自建的示例,实际效果恰恰相反,该配置的意思是将访问 <vercel分配或自定义域名>/stats/script.js 的请求转发到 https://stat.vinfall.com/script.js ,因此自建示例要将官方模板中的域名 analytics.umami.is 修改为自己的域名。我说怎么迁移一个月了一点流量都没有,错怪了 Vercel,合着是我自己的问题。还以为封禁了 GPTBot 影响这么大。

{
  "rewrites": [
    {
      "source": "/stats/:match*",
      "destination": "https://stat.vinfall.com/:match*"
    }
  ]
}

配置 Umami

进入后台,参考 文档 完成初次配置,注意默认的用户名也可以更改,注意 v2 的脚本应该使用 stats/script.js 而不是 umami.js,部分文档可能没有更新。同理,根据 Environment variables.env 中修改环境变量,重要的就是 DISABLE_TELEMETRYTRACKER_SCRIPT_NAMEFORCE_SSL,其他就看文档吧。

.env

DATABASE_URL=
DISABLE_TELEMETRY=1
TRACKER_SCRIPT_NAME=
FORCE_SSL=1
PRIVATE_MODE=1

网站嵌入代码:

<script async defer
    src="https://stat.vinfall.com/stats/script.js"
    data-website-id="xxx"
></script>

感想

不要靠近 JavaScript,会变得不幸。#Migrating V1 to V2 之所以耗时最长,99% 是因为前端混乱的框架和五花八门的包管理器。

最开始尝试在 Vercel 网页直接修改编译参数进行迁移,几次报错之后终于能够运行了,但迁移脚本需要手动输入,只能换成本地编译后运行的方式。在最常用的 Void Linux (musl) 里安装了 yarn, yarn installyarn build 都正常,但到了运行时,yarn run 就甩出来一个错误,提示缺少 ld-linux-x86-64.so.2,切到 Devuan 用 apt-file search 一搜,发现是 glibc 的组件,和 musl-libc 无缘。无奈切换到 Devuan,安装 nvm,安装 node LTS,安装 npm,安装 yarn,yarn installyarn buildyarn start……然后光荣地触发了 Segment fault。如果导出数据库后先不进行 Vercel 相关的操作,尝试用 railway/cli 解决可能会好一点,但那就是另一回事了,何况 Railway 的设置页面做得还没 Vercel 好。

除了 umami,博客当前的评论系统 Cusdis 也同样部署在 Railway,后续也要进行迁移,不过评论数据库要小得多,迁移起来非常方便。

Vinfall's Geekademy

Sine īrā et studiō