Help us learn about your current experience with the documentation. Take the survey.

上传文件迁移 Rake 任务

  • 版本:Free, Premium, Ultimate
  • 产品:GitLab Self-Managed

有一个 Rake 任务可用于在不同存储类型之间迁移上传文件。

迁移到对象存储

在为 GitLab 的上传文件配置对象存储后,使用此任务将现有的上传文件从本地存储迁移到远程存储。

所有处理都在后台工作进程中完成,无需停机

了解更多关于在 GitLab 中使用对象存储 的信息。

一体化 Rake 任务

GitLab 提供了一个包装 Rake 任务,可一步将所有已上传的文件(例如头像、徽标、附件和网站图标)迁移到对象存储。该包装任务会调用独立的 Rake 任务,逐一迁移每个类别的文件。

这些独立的 Rake 任务将在下一节中介绍。

要将所有上传文件从本地存储迁移到对象存储,请运行:

gitlab-rake "gitlab:uploads:migrate:all"
sudo RAILS_ENV=production -u git -H bundle exec rake gitlab:uploads:migrate:all

您可以选择使用 PostgreSQL 控制台来跟踪进度并验证所有上传文件是否已成功迁移:

  • 对于 Linux 包安装,使用 sudo gitlab-rails dbconsole --database main
  • 对于自编译安装,使用 sudo -u git -H psql -d gitlabhq_production

请验证下方的 objectstg(其中 store=2)的计数是否为所有制品的总数:

gitlabhq_production=# SELECT count(*) AS total, sum(case when store = '1' then 1 else 0 end) AS filesystem, sum(case when store = '2' then 1 else 0 end) AS objectstg FROM uploads;

total | filesystem | objectstg
------+------------+-----------
   2409 |          0 |      2409

验证 uploads 文件夹中没有磁盘文件:

sudo find /var/opt/gitlab/gitlab-rails/uploads -type f | grep -v tmp | wc -l

独立的 Rake 任务

如果您已经运行过一体化 Rake 任务,则无需再运行这些独立的任务。

该 Rake 任务使用三个参数来查找要迁移的上传文件:

参数 类型 描述
uploader_class string 要从中迁移的上传器类型。
model_class string 要从中迁移的模型类型。
mount_point string/symbol 上传器所挂载的模型列的名称。

这些参数主要与 GitLab 的内部结构相关,您可能更希望参考下方的任务列表。运行这些独立任务后,我们建议您运行一体化 Rake 任务,以迁移未包含在所列类型中的任何上传文件。

此任务还接受一个环境变量,您可以用它来覆盖默认的批次大小:

变量 类型 描述
BATCH integer 指定批次的大小。默认为 200。

以下展示了如何为不同类型的上传文件运行 gitlab:uploads:migrate

# gitlab-rake gitlab:uploads:migrate[uploader_class, model_class, mount_point]

# 头像
gitlab-rake "gitlab:uploads:migrate[AvatarUploader, Project, :avatar]"
gitlab-rake "gitlab:uploads:migrate[AvatarUploader, Group, :avatar]"
gitlab-rake "gitlab:uploads:migrate[AvatarUploader, User, :avatar]"

# 附件
gitlab-rake "gitlab:uploads:migrate[AttachmentUploader, Appearance, :logo]"
gitlab-rake "gitlab:uploads:migrate[AttachmentUploader, Appearance, :header_logo]"

# 网站图标
gitlab-rake "gitlab:uploads:migrate[FaviconUploader, Appearance, :favicon]"

# Markdown
gitlab-rake "gitlab:uploads:migrate[FileUploader, Project]"
gitlab-rake "gitlab:uploads:migrate[PersonalFileUploader, Snippet]"
gitlab-rake "gitlab:uploads:migrate[NamespaceFileUploader, Snippet]"
gitlab-rake "gitlab:uploads:migrate[FileUploader, MergeRequest]"

# Design Management 设计缩略图
gitlab-rake "gitlab:uploads:migrate[DesignManagement::DesignV432x230Uploader, DesignManagement::Action, :image_v432x230]"

为每个任务使用 RAILS_ENV=production

# sudo -u git -H bundle exec rake gitlab:uploads:migrate

# 头像
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[AvatarUploader, Project, :avatar]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[AvatarUploader, Group, :avatar]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[AvatarUploader, User, :avatar]"

# 附件
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[AttachmentUploader, Appearance, :logo]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[AttachmentUploader, Appearance, :header_logo]"

# 网站图标
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[FaviconUploader, Appearance, :favicon]"

# Markdown
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[FileUploader, Project]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[PersonalFileUploader, Snippet]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[NamespaceFileUploader, Snippet]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[FileUploader, MergeRequest]"

# Design Management 设计缩略图
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[DesignManagement::DesignV432x230Uploader, DesignManagement::Action]"

迁移到本地存储

如果出于任何原因需要禁用对象存储,您必须先将数据从对象存储迁移回本地存储。

需要较长的停机时间,以确保在迁移过程中对象存储中不会创建新文件。一个允许仅通过短暂的配置更改停机时间即可从对象存储迁移到本地文件的配置设置,正在此议题中进行跟踪。

一体化 Rake 任务

GitLab 提供了一个包装 Rake 任务,可一步将所有已上传的文件(例如头像、徽标、附件和网站图标)迁移到本地存储。该包装任务会调用独立的 Rake 任务,逐一迁移每个类别的文件。

有关这些 Rake 任务的详细信息,请参阅独立的 Rake 任务。请注意,此情况下的任务名称是 gitlab:uploads:migrate_to_local

要将上传文件从对象存储迁移到本地存储:

gitlab-rake "gitlab:uploads:migrate_to_local:all"
sudo RAILS_ENV=production -u git -H bundle exec rake gitlab:uploads:migrate_to_local:all

运行 Rake 任务后,您可以通过撤销配置对象存储说明中描述的更改来禁用对象存储。