引言
愉快地用了一年多自建的 umami,突然发现 Railway 2023 年 8 月 1 日起要取消 developer plan,
尝试降级 hobby plan 但提示余额不足(此前的政策为不需要预存,每月有免费的 $5 额度,
这次额度不变,但账户需要预存 $10取消免费额度,最低套餐也要 $5/月)。
刚好前几天更新 service index 发现 Vercel 也提供了数据库托管服务,怒换之,开始了迁移到 Vercel 的探索之路。
Railway 部署 umami
该部分为部署 umami v1 时的笔记,仅供参考。
使用 umami 取代毒瘤 Google Analytics:
- Running on Railway
Tracker configuration : 遵守 Do Not Track- 搭建 umami 收集个人网站统计数据
- 从零开始搭建一个免费的个人博客数据统计系统(umami + Vercel + Heroku)
部署命令:
# 完全自建才需要,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_TELEMETRY
、TRACKER_SCRIPT_NAME
和 FORCE_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 install
和 yarn build
都正常,但到了运行时,yarn run
就甩出来一个错误,提示缺少 ld-linux-x86-64.so.2
,切到 Devuan 用 apt-file search
一搜,发现是 glibc 的组件,和 musl-libc 无缘。无奈切换到 Devuan,安装 nvm,安装 node LTS,安装 npm,安装 yarn,yarn install
,yarn build
,yarn start
……然后光荣地触发了 Segment fault。如果导出数据库后先不进行 Vercel 相关的操作,尝试用 railway/cli 解决可能会好一点,但那就是另一回事了,何况 Railway 的设置页面做得还没 Vercel 好。
除了 umami,博客当前的评论系统 Cusdis 也同样部署在 Railway,后续也要进行迁移,不过评论数据库要小得多,迁移起来非常方便。