Rakeタスクのマイグレーションのアップロード

異なるストレージタイプ間でアップロードをマイグレーションするためのRakeタスクがあります。

オブジェクトストレージへのマイグレーション

GitLabへのアップロード用にオブジェクトストレージを設定した後、このタスクを使って既存のアップロードをローカルストレージからリモートストレージにマイグレーションします。

すべての処理はバックグラウンドワーカーで行われ、ダウンタイムは必要ありません。

GitLabでのオブジェクトストレージの使用について、詳しくはこちらをご覧ください。

オールインワンRakeタスク

GitLabは、アップロードされたすべてのファイル(例えばアバター、ロゴ、添付ファイル、ファビコンなど)をオブジェクトストレージにワンステップでマイグレーションするラッパーRakeタスクを提供します。ラッパータスクは個々のRakeタスクを呼び出して、これらのカテゴリに該当するファイルを一つずつマイグレーションします。

これらの個別のRakeタスクについては、次のセクションで説明します。

すべてのアップロードをローカルストレージからオブジェクトストレージにマイグレーションするには、以下を実行します:

  • Linux パッケージのインストール:

     gitlab-rake "gitlab:uploads:migrate:all"
    
  • セルフコンパイルによるインストール:

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

オプションで、PostgreSQLコンソールを使用して進捗を追跡し、すべてのアップロードが正常にマイグレーションされたことを確認することができます:

  • sudo gitlab-rails dbconsole GitLab 14.1以前を実行しているLinuxパッケージインストールの場合。
  • sudo gitlab-rails dbconsole --database main GitLab 14.2 以降を実行している Linux パッケージインストール用。
  • 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タスクは、マイグレーションするアップロードを見つけるために3つのパラメータを使用します:

パラメータ種類説明
uploader_class文字列です。マイグレーション元のアップローダーのタイプ。
model_class文字列です。マイグレーションするモデルの型。
mount_point文字列/記号アップローダがマウントされているモデルのカラムの名前。
note
これらのパラメータは主に GitLab の内部構造に関するものなので、代わりに以下のタスクリストを参照するとよいでしょう。これらの個々のタスクを実行した後、リストされたタイプに含まれていないアップロードをマイグレーションするために、オールインワンの Rake タスクを実行することをお勧めします。

このタスクは、デフォルトのバッチサイズを上書きするための環境変数も受け付けます:

変数種類説明
BATCH整数。バッチのサイズを指定します。デフォルトは 200。

以下は、個々のタイプのアップロードに対してgitlab:uploads:migrate を実行する方法を示しています。

Linux package (Omnibus)
# gitlab-rake gitlab:uploads:migrate[uploader_class, model_class, mount_point]

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

# Attachments
gitlab-rake "gitlab:uploads:migrate[AttachmentUploader, Note, :attachment]"
gitlab-rake "gitlab:uploads:migrate[AttachmentUploader, Appearance, :logo]"
gitlab-rake "gitlab:uploads:migrate[AttachmentUploader, Appearance, :header_logo]"

# Favicon
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 design thumbnails
gitlab-rake "gitlab:uploads:migrate[DesignManagement::DesignV432x230Uploader, DesignManagement::Action, :image_v432x230]"
Self-compiled (source)

すべてのタスクにRAILS_ENV=production を使用してください。

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

# Avatars
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]"

# Attachments
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[AttachmentUploader, Note, :attachment]"
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]"

# Favicon
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 design thumbnails
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[DesignManagement::DesignV432x230Uploader, DesignManagement::Action]"

ローカルストレージへのマイグレーション

何らかの理由でオブジェクトストレージを無効にする必要がある場合は、まずデータをオブジェクトストレージからローカルストレージにマイグレーションする必要があります。

caution
マイグレーション中にオブジェクトストレージに新しいファイルが作成されないように、長時間のダウンタイムが必要です。構成変更のための短時間のダウンタイムだけでオブジェクトストレージからローカルファイルへのマイグレーションを可能にする構成設定は、このイシューで追跡されています。

オールインワンRakeタスク

GitLabは、アップロードされたすべてのファイル(例えば、アバター、ロゴ、添付ファイル、ファビコンなど)をワンステップでローカルストレージにマイグレーションするラッパーRakeタスクを提供します。ラッパータスクは個々のRakeタスクを呼び出して、これらのカテゴリに該当するファイルを一つずつマイグレーションします。

これらのRakeタスクの詳細については、個別のRakeタスクを参照してください。この場合のタスク名はgitlab:uploads:migrate_to_localです。

アップロードをオブジェクトストレージからローカルストレージにマイグレーションするには、以下のRakeタスクを実行します:

  • Linux パッケージのインストール:

     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タスクを実行した後、オブジェクトストレージを設定する手順で説明した変更を元に戻すことで、オブジェクトストレージを無効にすることができます。