Docker下的Mastodon升级

更新记录

2025-12: 4.2到4.5的升级过程,数据库升级过程

起因

(Mastodon的安装参考前文《Docker下的Mastodon安装笔记》)

运维这个事情有个原则就是:能不动就不动。不过因为最近毛毛象爆了一个严重安全漏洞(CVE-2024-23832),不补不行,所以搞了一次升级,为了保险起见,先进行了一次中版本的升级,比3.4.x升级到3.5.x,即使如此,也还是有一些工作要做的。

中版本升级

参考官方文档:V3.5.0 Upgrade notes

  • 首先当然是备份:docker exec mastodon_db pg_dump -Fc -U postgres postgres > name_of_the_backup.dump,不过我这边已经在docker-compose里指定了容器名称,所以没有_1后缀
  • 然后是升级mastodon。因为用了docker,所以不需要考虑ruby和node的版本,只要看看postgresql版本是否大于9.5,redis版本是否大于4,ES版本是否大于7,这些我这边都没问题,不需要更新。
  • 然后是升级以后的操作:
# 运行预部署数据库迁移命令:
docker-compose run --rm -e SKIP_POST_DEPLOYMENT_MIGRATIONS=true web rails db:migrate
# docker方式不需要预编译,直接重启mastodon
docker-compose down
docker-compose up -d
# 清除缓存
docker-compose run --rm web bin/tootctl cache clear
# 完成数据库迁移
docker-compose run --rm web rails db:migrate
# 再次重启mastodon
docker-compose down
docker-compose up -d

大版本升级

大版本升级(3.x升级到4.x)参考官方文档:v4.0.0 Upgrade notes,基本上跟中版本升级是一样的。

  • 老规矩,先备份: docker exec mastodon_db pg_dump -Fc -U postgres postgres > name_of_the_backup.dump
  • 然后升级mastodon。
  • 最后是升级后的操作:
# 数据库迁移
docker-compose run --rm -e SKIP_POST_DEPLOYMENT_MIGRATIONS=true web rails db:migrate
# docker方式不需要预编译,直接重启mastodon
docker-compose down
docker-compose up -d
# 清除缓存
docker-compose run --rm web bin/tootctl cache clear
# 完成数据库迁移
docker-compose run --rm web rails db:migrate
# 再次重启mastodon
docker-compose down
docker-compose up -d

4.x中版本升级到4.2.x

之前的升级方式都差不多,到4.x有一些不同,每个中版本都变化比较大,所以不能跳版本更新,必须按顺序更新。

  • 4.0.x升级到4.1.x参考官方文档:v4.1.0 Upgrade notes
  • 4.1.x升级到4.2.x参考官方文档:v4.2.0 Upgrade notes
  • 虽然文档没说,但先备份准没错: docker exec mastodon_db pg_dump -Fc -U postgres postgres > name_of_the_backup.dump
  • 然后升级mastodon。依赖版本跟之前是一样的。
  • 最后是升级后的操作:
# 4.0.x升级到4.1.x
# 数据库迁移
docker-compose run --rm web rails db:migrate
# docker方式不需要预编译,直接重启mastodon
docker-compose down
docker-compose up -d

# 4.1.x升级到4.2.x
# Postgresql版本需要10及以上,增加对LibreTranslate版本1.3.3及以上和ImageMagick版本6.9.7-7及以上的要求
# 数据库迁移
docker-compose run --rm -e SKIP_POST_DEPLOYMENT_MIGRATIONS=true web bundle exec rails db:migrate
# 重启mastodon
docker-compose down
docker-compose up -d
# 运行部署后数据迁移命令
docker-compose run --rm web bundle exec rails db:migrate
# 如果使用ES,需要更新一下索引
docker-compose run --rm web bin/tootctl search deploy --reset-chewy

4.x中版本升级到4.3.x

这个版本变化太大,必须单独说一下。

  • 4.2.x升级到4.3.x参考官方文档:v4.3.0 Upgrade notes
  • 第一个变化是docker镜像从dockerhub迁移到了ghcr.io,并且分成了两个
  • 第二个变化是启用了Active Record密钥
  • 第三个变化是因为第一个变化所以需要更新一下docker-compose.yml(参见4.3.x的源码)。
  • 另外还有一个注意事项是:此版本在Postgresql 14.0和14.3两个版本上不可用,必须先升级Postgresql到14的最新子版本,再升级Mastodon。
# Postgresql版本需要在12及以上,但不支持14.0和14.3,因为这两个版本有严重bug
# Redis版本需要在6.2及以上
# 官方docker镜像已经分拆为两个:
# ghcr.io/mastodon/mastodon,不再包含流媒体服务器
# ghcr.io/mastodon/mastodon-streaming,仅包含流媒体服务器
# 官方docker-compose已更新,需要同步更新
# 从这个版本开始Active Record需要配置新的环境变量来配置密钥,先生成密钥
docker-compose run --rm web bin/rails db:encryption:init
# 然后将它们复制到 .env.production 文件中(请确保将这些密钥复制到所有 Mastodon 节点,因为它们都需要访问这些密钥)
# 配置到环境变量:ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY、ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT 和 ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY
# 数据库迁移
docker-compose run --rm -e SKIP_POST_DEPLOYMENT_MIGRATIONS=true web bundle exec rails db:migrate
# 重启mastodon
docker-compose down
docker-compose up -d
# 运行部署后的数据库迁移:
docker-compose run --rm web bundle exec rails db:migrate
# 如果使用 Elasticsearch 或 OpenSearch,请重建帐户搜索索引:
docker-compose run --rm web bin/tootctl search deploy --only=accounts

4.x中版本升级到4.5.x

# 4.3.x升级到4.4.x
# Postgresql需要13及以上
# 此版本不再支持redis namespace,如果之前有用到则需要迁移:[https://github.com/mastodon/redis_namespace_migration](Redis namespace migration)
# 由于4.4移除了4.1以前的导入任务实现,所以必须在运行4.2或4.3一段时间(最少几分钟)后再升级到4.4
# 部署前的数据库迁移:
docker-compose run --rm -e SKIP_POST_DEPLOYMENT_MIGRATIONS=true web bundle exec rails db:migrate
# 重启所有 Mastodon 进程
docker-compose down
docker-compose up -d
# 运行部署后的数据库迁移:
docker-compose run --rm web bundle exec rails db:migrate
# 如果您使用 Elasticsearch 或 OpenSearch,请重建帐户搜索索引映射:
docker-compose run --rm web bin/tootctl search deploy --only-mapping --only=accounts

# 4.4.x升级到4.5.x
# Postgresql需要14及以上,Redis需要7及以上
# Sidekiq从7升级到了8,原来的docker-compose里用的健康检查脚本需要更新
运行数据库迁移:docker-compose run --rm web bundle exec rails db:migrate
重启所有 Mastodon 进程。

数据库升级

# 先停mastodon,只启数据库
docker-compose down
docker-compose up -d db
# 备份整个库
docker exec postgresql pg_dumpall -U postgres | gzip > pgoldbak.sql.gz
# 删除旧版
docker-compose down
rm -r /path_to_your_db_data/*
# 更新docker-compose中的数据库镜像版本后启动新版
docker-compose up -d db
# 恢复数据
gunzip -c pgoldbak.sql.gz | docker exec -i postgresql psql -U postgres

推送到[go4pro.org]