Mastodon
  • 什么是 Mastodon?
  • 使用 Mastodon
    • 注册帐户
    • 设置你的个人资料
    • 在你的账户发布内容
    • 使用网络功能
    • 处理不想看到的内容
    • 推广你和他人
    • 进行偏好设置
    • 更多设置
    • 在站点外使用 Mastodon
    • 迁移或离开账户
    • 运行你自己的站点
  • 运营 Mastodon
    • 准备你的服务器
    • 从源代码安装
    • 配置你的环境
    • 安装可选功能
      • 对象存储
      • 洋葱服务
      • 验证码
      • 单点登录
    • 配置全文搜索
    • 设置你的新实例
    • 使用管理 CLI
    • 升级到新版本
    • 备份你的服务器
    • 迁移到新机器
    • 扩大你的站点规模
    • 审核操作
    • 故障排除
      • 数据库索引损坏
    • 用户组
  • 开发 Mastodon 应用
    • API 入门指南
    • 使用公开数据
    • 获取客户端应用访问权限
    • 使用帐户登录
    • 库与实现
  • 向 Mastodon 项目做贡献
    • 技术概览
    • 设置开发环境
    • 代码结构
    • 路由
    • 漏洞赏金与责任披露
  • 遵循的标准
    • ActivityPub
    • WebFinger
    • 安全性
    • Microformats
    • OAuth
    • Bearcaps
  • REST API
    • Datetime 格式
    • 指南与最佳实践
    • OAuth 令牌
    • OAuth 作用域
    • 速率限制
  • API 方法
    • apps
      • oauth
      • emails
    • accounts
      • bookmarks
      • favourites
      • mutes
      • blocks
      • domain_blocks
      • filters
      • reports
      • follow_requests
      • endorsements
      • featured_tags
      • preferences
      • followed_tags
      • suggestions
      • tags
    • profile
    • statuses
      • media
      • polls
      • scheduled_statuses
    • timelines
      • conversations
      • lists
      • markers
      • streaming
    • grouped notifications
    • notifications
      • push
    • search
    • instance
      • trends
      • directory
      • custom_emojis
      • announcements
    • admin
      • accounts
      • canonical_email_blocks
      • dimensions
      • domain_allows
      • domain_blocks
      • email_domain_blocks
      • ip_blocks
      • measures
      • reports
      • retention
      • trends
    • proofs
    • oembed
  • API 实体
    • Account
    • AccountWarning
    • Admin::Account
    • Admin::CanonicalEmailBlock
    • Admin::Cohort
    • Admin::Dimension
    • Admin::DomainAllow
    • Admin::DomainBlock
    • Admin::EmailDomainBlock
    • Admin::Ip
    • Admin::IpBlock
    • Admin::Measure
    • Admin::Report
    • Announcement
    • Appeal
    • Application
    • Context
    • Conversation
    • CustomEmoji
    • DomainBlock
    • Error
    • ExtendedDescription
    • FamiliarFollowers
    • FeaturedTag
    • Filter
    • FilterKeyword
    • FilterResult
    • FilterStatus
    • IdentityProof
    • Instance
    • List
    • Marker
    • MediaAttachment
    • Notification
    • NotificationPolicy
    • NotificationRequest
    • Poll
    • Preferences
    • PreviewCard
    • PreviewCardAuthor
    • PrivacyPolicy
    • Reaction
    • Relationship
    • RelationshipSeveranceEvent
    • Report
    • Role
    • Rule
    • ScheduledStatus
    • Search
    • Status
    • StatusEdit
    • StatusSource
    • Suggestion
    • Tag
    • TermsOfService
    • Token
    • Translation
    • V1::Filter
    • V1::Instance
    • V1::NotificationPolicy
    • WebPushSubscription

迁移到新机器

将你的 Mastodon 站点无损复制到新服务器。

    • 基本步骤
    • 详细步骤
      • 停止 Mastodon 服务
      • 需要迁移哪些数据
      • 导出与导入 PostgreSQL
      • 复制文件
      • 迁移期间
      • 迁移后

出于各种原因,你可能希望将 Mastodon 实例从一台服务器迁移到另一台。幸运的是,这个过程并不太困难,尽管可能会导致一些停机时间。

本指南主要针对 Ubuntu Server 编写;对于其他配置环境,你的实际体验可能有所不同。

基本步骤

  1. 使用生产环境配置指南设置新的 Mastodon 服务器(但不要运行mastodon:setup,只保持PostgreSQL服务运行)。
  2. 停止旧服务器上的 Mastodon 服务(例如systemctl stop 'mastodon-*.service')。
  3. 使用下面的说明导出和加载 PostgreSQL 数据库。
  4. 使用下面的说明复制 system/ 文件。(注意:如果你使用 S3,可以跳过此步骤。)
  5. 复制 .env.production 文件。
  6. 保存 Redis 数据库,停止新旧机器上的 Redis 服务,并将 Redis 数据库从 /var/lib/redis/ 复制到新服务器。
  7. 运行 RAILS_ENV=production bundle exec rails assets:precompile 编译 Mastodon。
  8. 在新服务器上启动 Mastodon 和 Redis。
  9. 运行 RAILS_ENV=production ./bin/tootctl feeds build 为每个用户重建主时间线。
  10. 运行 RAILS_ENV=production ./bin/tootctl search deploy 重建 Elasticsearch 索引(注意:如果你不使用 Elasticsearch,可以跳过此步骤。)
  11. 更新 DNS 设置,指向新服务器。
  12. 更新或复制 Nginx 配置,并根据需要重新运行 LetsEncrypt。
  13. 享受你的新服务器!

详细步骤

停止 Mastodon 服务

systemctl stop 'mastodon-*.service'

需要迁移哪些数据

总体而言,你需要复制以下内容:

  • ~/live/public/system 目录,该目录包含用户上传的图片和视频(如果使用 S3,则不需要)
  • PostgreSQL 数据库(使用 pg_dump)
  • ~/live/.env.production 文件,其中包含服务器配置和密钥
  • /var/lib/redis/ 目录中的 Redis 数据库,其中包含未处理的 Sidekiq 任务。

以下内容不太重要,但为方便起见,你可能仍然想要复制:

  • nginx 配置(位于 /etc/nginx/sites-available/mastodon)
  • 域名的 SSL 证书(若使用 LetsEncrypt,应位于 /etc/letsencrypt/live/)
  • systemd 配置文件(/etc/systemd/system/mastodon-*.service),其中可能包含你的服务器调整和自定义
  • /etc/pgbouncer 下的 PgBouncer 配置(如果你使用它)

导出与导入 PostgreSQL

我们不运行 mastodon:setup,而是使用 template0 数据库创建一个空的 PostgreSQL 数据库(这在还原 PostgreSQL 转储文件时很有用,如 pg_dump 文档所述)。

如果你的 PostgreSQL 用户使用密码,为方便起见,你可能希望在新系统上配置 mastodon 用户使用与旧系统相同的密码:

sudo -u postgres psql  
ALTER USER mastodon WITH PASSWORD 'YOUR_PASSWORD';  
\q

在旧系统上以 mastodon 用户身份运行:

pg_dump -Fc mastodon_production -f backup.dump

使用 rsync 或 scp 复制 backup.dump 文件。然后在新系统上,以 mastodon 用户身份创建一个空数据库:

createdb -T template0 mastodon_production

然后导入它(将 -j# 中的 # 替换为系统中的 CPU 数量以提高还原性能):

pg_restore -Fc -j# -U mastodon -n public --no-owner --role=mastodon \
  -d mastodon_production backup.dump

(请注意,如果新服务器上的用户名不是 mastodon,你应该更改上面的 -U 和 --role 值。两个服务器之间可以使用不同的用户名。)

复制文件

这可能需要一些时间,为避免不必要的重复复制,建议使用 rsync。在旧机器上,以 mastodon 用户身份运行:

rsync -avz ~/live/public/system/ mastodon@example.com:~/live/public/system/

如果旧服务器上的任何文件发生更改,你需要重新运行此命令。

你还应该复制 .env.production 文件,其中包含密钥。

在新机器上,确保 Redis 未运行,否则它可能会覆盖你尝试还原的转储文件。以 root 用户身份运行:

systemctl stop redis-server.service

现在复制你的 Redis 数据库(根据需要调整 Redis 数据库的位置)。在旧机器上,以 root 用户身份运行:

redis-cli SAVE
systemctl stop redis-server.service
rsync -avz /var/lib/redis/ root@example.com:/var/lib/redis

作为可选操作,你可以复制 nginx、systemd 和 PgBouncer 配置文件,或者从头重写它们。

迁移期间

你可以编辑旧机器上的 ~/live/public/500.html 页面,以显示一条友好的错误消息,让现有用户知道迁移正在进行中。

你可能还想在提前一天将 DNS TTL 设置为较小的值(30-60分钟),这样一旦你将其指向新 IP 地址,DNS 就可以快速传播。

迁移后

以mastodon用户身份运行以下命令:

RAILS_ENV=production bundle exec rails assets:precompile  

现在以 root 用户身份运行以下命令:

systemctl daemon-reload
systemctl start redis-server  
systemctl enable --now mastodon-web mastodon-sidekiq mastodon-streaming  
systemctl restart nginx

一旦服务器重新上线,你可以为用户重建主页时间线(这可能需要很长时间,取决于用户数量。)

RAILS_ENV=production ./bin/tootctl feeds build

如果你使用 Elasticsearch,请运行以下命令重建索引(这可能需要很长时间,取决于你拥有的状态数量。)

RAILS_ENV=production ./bin/tootctl search deploy

你可以查看 whatsmydns.net 以了解 DNS 传播的进度。要加速这个过程,你可以编辑自己的 /etc/hosts 文件,指向新服务器,这样你就可以提前开始使用它。

翻译状态: 本文是英文页面 Migrating to a new machine 的翻译,最后翻译时间:2025-04-21,点击这里可以查看翻译后页面的改动。

最后更新于 April 21, 2025 · 改进此页面
也可在此找到: English

赞助商

Dotcom-Monitor LoadView Stephen Tures Swayable SponsorMotion

加入Mastodon · 博客 ·

查看源代码 · CC BY-SA 4.0 · 版权信息