文章

如何跨版本升级毛象

如何跨版本升级毛象

小站自从 3.5 版本后就几年没有更新了,最近一口气更新到了 4.7,尤其之前的操作系统还是很老的 Ubuntu 18.04,过程还是挺麻烦的,所以这里记录一下更新过程。

升级前的准备

备份

‼️最重要的事情就是升级之前一定要备份‼️这样后面搞砸了可以回滚,我就搞砸了两次。我的服务器供应商是 Hetzner,那里可以创建 Backup,搞砸之后从 Backup 里 Rebuild 就好了。

去掉个性化改动

我的站点做了很多个性化的改动,但是新版本的毛象发生了非常多的变化,不管是 rebase 还是 merge 都会特别麻烦, 所以我决定暂时去掉这些改动,先升级,成功之后再陆续加上。

升级

新版本的毛象对系统版本也有要求,所以系统也要更新。为了保险起见,我这里是先更新到 Ubuntu 20.04,然后把毛象 4.2 跑起来,确认没事之后再更新到 Ubuntu 24.04,接着继续更新毛象。

升级 Ubuntu 系统

Ubuntu 不能跨版本升级,只能一个个往上升。过程是这样的

1
2
3
sudo apt update && sudo apt dist-upgrade -y
sudo apt autoremove -y
sudo do-release-upgrade

接着 reboot 就可以升级到下一个版本了。后续的升级重复以上步骤就可以了。

升级长毛象

官方的升级指南在列出升级步骤的同时也会强调这是从上一个小版本的升级步骤,如果跨版本的话那么也要参照之前的升级指南。为了保险起见我是一个版本一个版本更新的,具体的过程是这样:

假设现在的版本是 4.2.x,接下来要更新到 4.3,那么就去查看 4.4 的 release notes,上面写着

The following instructions are for updating from 4.3.9.

所以我们的下一个更新目标就是 4.3.9。接下来查看从 4.3.0 到 4.3.9 所有的 release notes,看里面是否提到标准升级过程以外的东西。如果有的话,就先 checkout 那个版本,然后按照提示来。如果没有的话,直接 checkout 目标版本(比如 4.3.9),然后执行标准升级过程。确认跑起来之后,再重复以上步骤更新到下一个大版本。

标准升级过程

更新 ruby。这个在升级前做一次就可以了。

1
2
3
4
5
su - mastodon
cd ~/.rbenv
git pull
cd ~/.rbenv/plugins/ruby-build
git pull

然后就是更新到特定版本的毛象1

1
2
3
4
5
6
7
cd ~/live
git fetch && git checkout v4.3.9 # 举例,改成自己要更新到的版本
```RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install
bundle install && yarn install --immutable
RAILS_ENV=production bundle exec rails assets:precompile
SKIP_POST_DEPLOYMENT_MIGRATIONS=true RAILS_ENV=production bundle exec rails db:migrate
exit

接下来以 root 身份

1
2
systemctl restart mastodon-sidekiq
systemctl reload mastodon-web

然后继续

1
2
3
su - mastodon
cd ~/live
RAILS_ENV=production bundle exec rails db:migrate

如果站点开启全文搜索的话,可能还需要重新设置一遍 Elasticsearch,这里官方也有教程。

遇到的问题

我在更新过程中踩了两个大坑

  • 升级 PostgreSQL 的时候不小心删库了

    升级 Ubuntu 系统的时候我一口气把 PostgreSQL 从 10 升级到了 18,看见数据库跑起来我以为万事大吉,就把旧版本删了,结果原来的数据库直接没了。正确的升级方式是这样的2(假设从 PostgreSQL 10 更新到 12):

    首先在 terminal 跑

    1
    
    pg_lsclusters
    

    然后看 Ver 12 的 Status 是否是 online3,如果是的话,需要手动关闭:

    1
    
    pg_dropcluster 12 main --stop
    

    再跑一下 pg_lsclusters, 确认只有版本 10 是 online 状态,然后就可以开始迁移了

    1
    
    pg_upgradecluster -m link 10 main
    

    这个过程非常快,我自己的小站是几秒钟就好了,然后再检查一下 pg_lsclusters 的状态,看到 Ver 12 现在显示的是 online 状态,并且 Port 是 5432(毛象 .env.production 里默认的 Port)。

    接下来可以直接重启毛象进程,也可以 sudo -u postgres psql 然后 \du 看看名为 mastodon 的用户是否还在。检查完没什么问题之后,就可以删掉旧版本了:

    1
    2
    
    pg_dropcluster 10 main
    apt remove postgresql-10 postgresql-client-10
    
  • 原来的默认主题找不到了

    我的小站添加了很多个性化主题。因为新版本的前端发生了很大的变化,所以我直接把主题全删掉了,准备之后再加上,结果升级完毕后小站显示小象敲键盘,看日志是 Webpack 在抱怨找不到 flora.css。这是因为小站的默认主题是 flora,但是现在被我删掉了,网站打不开我也没法更改默认,所以我直接复制了一份毛象默认主题的 .css 文件,然后重命名为 flora.css。这样小站就跑起来了,我再把默认主题改成毛象自带的。

  1. 如果没有确定的版本号,只是想更新到最新版本,那也可以 git fetch --tags && git rebase $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1) ↩︎

  2. 参考 Upgrading Mastodon from PostgreSQL 15 to PostgreSQL 17 ↩︎

  3. 升级 Ubuntu 的时候系统会提示有新版本的 PostgreSQL,如果你选择现在创建新的 cluster,那么新版本就会是 online 状态,如果选否,那就不会是 online 状态。选哪个都行。 ↩︎

本文由作者按照 CC BY 4.0 进行授权