GitLab Git ラージファイルストレージ(LFS) 管理

Git LFS の使い方のドキュメントは、Managing large binary files with Git LFS docにあります。

要件

  • Git LFSはバージョン8.2からGitLabでサポートされています。
  • AWS S3などのオブジェクトストレージのサポートは10.0で導入されました。
  • gitLFSクライアントのバージョン1.0.1以降をインストールする必要があります。

設定

Git LFSオブジェクトはサイズが大きくなる可能性があります。 デフォルトでは、GitLabがインストールされているサーバーに保存されます。

GitLabサーバー管理者に役立つ様々な設定オプションがあります:

  • Git LFS サポートの有効化/無効化
  • LFSオブジェクト・ストレージの場所の変更
  • Fogがサポートするオブジェクトストレージの設定

Omnibus インストールの設定

/etc/gitlab/gitlab.rb

# Change to true to enable lfs - enabled by default if not defined
gitlab_rails['lfs_enabled'] = false

# Optionally, change the storage path location. Defaults to
# `#{gitlab_rails['shared_path']}/lfs-objects`. Which evaluates to
# `/var/opt/gitlab/gitlab-rails/shared/lfs-objects` by default.
gitlab_rails['lfs_storage_path'] = "/mnt/storage/lfs-objects"

ソースからのインストールの設定

config/gitlab.yml

# Change to true to enable lfs
  lfs:
    enabled: false
    storage_path: /mnt/storage/lfs-objects

リモート・オブジェクト・ストレージへのLFSオブジェクトの格納

GitLab Premium10.0で導入され、10.7でGitLab Coreに導入されました。

LFSオブジェクトをリモートオブジェクトストレージに保存することが可能で、ローカルのハードディスクのR/Wオペレーションをオフロードし、ディスクスペースを大幅に解放することができます。 GitLabはFogと密接にインテグレーションされているため、そのドキュメントを参照して、どのストレージサービスがGitLabとインテグレーションできるかを確認することができます。 また、非公開ローカルネットワークで外部のオブジェクトストレージを使用することもできます。 例えば、MinIOはスタンドアロンのオブジェクトストレージサービスで、セットアップが簡単で、GitLabインスタンスとうまく機能します。

GitLabはアップロードの仕組みに “Direct upload “と “Background upload “の2つの異なるオプションを提供しています。

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

オプション1.直接アップロード

  1. ユーザはlfs ファイルを GitLab インスタンスにプッシュします。
  2. GitLab-workhorseはファイルを外部オブジェクトストレージに直接アップロードします。
  3. GitLab-workhorse は GitLab-rails にアップロードが完了したことを通知します。

オプション2.バックグラウンドアップロード

  1. ユーザはlfs ファイルを GitLab インスタンスにプッシュします。
  2. GitLab-railsはローカルファイルストレージにファイルを保存します。
  3. GitLab-railsは次にファイルを外部オブジェクトストレージに非同期にアップロードします。

以下の一般的な設定がサポートされています。

設定 説明 デフォルト
enabled オブジェクトストレージの有効化/無効化 false
remote_directory LFS オブジェクトが保存されるバケット名  
direct_upload trueに設定すると、ローカル共有ストレージを必要とせずにLFSの直接アップロードが可能になります。 オプションは、すべてのファイルに対して単一ストレージのみをサポートすることを決定した時点で削除される可能性があります。 false
background_upload 自動アップロードを無効にするにはfalseに設定します。 S3へのアップロードが完了すると、このオプションは削除されます。 true
proxy_download 送信されたすべてのファイルのプロキシを有効にするには、true を設定します。 このオプションは、すべてのデータをプロキシする代わりに、クライアントがリモートストレージから直接ダウンロードできるようにするため、イグレストラフィックを減らすことができます。 false
connection 以下の様々な接続オプション  

connection の設定はフォグが提供する設定と同じです。

S3を使った設定例です。

設定 説明
provider プロバイダー名 エーダブリュエス
aws_access_key_id AWSクレデンシャル、または互換性のあるもの ABC123DEF456
aws_secret_access_key AWSクレデンシャル、または互換性のあるもの ABC123DEF456ABC123DEF456ABC123DEF456
aws_signature_version AWS署名のバージョンは2または4が有効です。 4
enable_signature_v4_streaming AWS v4 シグネチャでHTTP チャンク転送を有効にするには true に設定します。 Oracle Cloud S3 では false に設定する必要があります。 真の
region AWSリージョン 米東1
host AWSを使用しない場合のS3互換ホスト(例:localhost またはstorage.example.com s3.amazonaws.com
endpoint MinIOなどのS3互換サービスを設定する際に、以下のようなURLを入力することで使用できます。http://127.0.0.1:9000 (オプション)
path_style bucket_name.host/objectの代わりにhost/bucket_name/object 形式のパスを使用する場合は true に設定します。 AWS S3 の場合は false のままにします。 false
use_iam_profile アクセスキーの代わりに IAM プロファイルを使用するには true を設定します。 false

以下はGCSを使った設定例です。

設定 説明
provider プロバイダー名 Google
google_project GCPプロジェクト名 gcp-project-12345
google_client_email サービスアカウントのメールアドレス foo@gcp-project-12345.iam.gserviceaccount.com
google_json_key_location JSONキーパス /path/to/gcp-project-12345-abcde.json
注意:サービスアカウントには、バケツへのアクセス権限が必要です。詳細を見る

以下は、Rackspace Cloud Filesを使用した設定例です。

設定 説明
provider プロバイダー名 Rackspace
rackspace_username コンテナにアクセスできる Rackspace アカウントのユーザー名。 joe.smith
rackspace_api_key コンテナにアクセスできる Rackspace アカウントの API キー。 ABC123DEF456ABC123DEF456ABC123DE
rackspace_region 使用するRackspaceのストレージリージョン。サービスアクセスエンドポイントのリストから3文字のコードを指定します。 iad
rackspace_temp_url_key 一時URL用にRackspace APIに設定した秘密鍵です。 詳しくはこちらをご覧ください。 ABC123DEF456ABC123DEF456ABC123DE
注:コンテナで公開アクセスが有効になっているか無効になっているかに関係なく、Fog は TempURL メソッドを使用して LFS オブジェクトへのアクセスを許可します。temp-url-keyを使用したストレージのインスタンス化を参照するエラーがログに表示された場合は、Rackspace API およびgitlab.rbでキーが適切に設定されていることを確認してください。 Rackspace が設定したキーの値は、サービスアクセスエンドポイントの URL にトークン ヘッダー付きの GET リクエストを送信し、返されたヘッダーの出力を比較することで確認できます。

オブジェクトストレージへの手動アップロード

自動アップロード(上述)と同じことを手動で行うには、2つの方法があります。

オプション1:レーキ作業

gitlab-rake gitlab:lfs:migrate

オプション 2: Rails コンソール

Railsコンソールにログインします:

sudo gitlab-rails console

LFSファイルを手動でアップロード

LfsObject.where(file_store: [nil, 1]).find_each do |lfs_object|
  lfs_object.file.migrate!(ObjectStorage::Store::REMOTE) if lfs_object.file.file.exists?
end

オムニバス用S3

Omnibus のインストールでは、設定の前にlfs_object_store_が付きます:

  1. /etc/gitlab/gitlab.rb を編集し、以下の行を必要な値に置き換えて追加します:

    gitlab_rails['lfs_object_store_enabled'] = true
    gitlab_rails['lfs_object_store_remote_directory'] = "lfs-objects"
    gitlab_rails['lfs_object_store_connection'] = {
      'provider' => 'AWS',
      'region' => 'eu-central-1',
      'aws_access_key_id' => '1ABCD2EFGHI34JKLM567N',
      'aws_secret_access_key' => 'abcdefhijklmnopQRSTUVwxyz0123456789ABCDE',
      # The below options configure an S3 compatible host instead of AWS
      'host' => 'localhost',
      'endpoint' => 'http://127.0.0.1:9000',
      'path_style' => true
    }
    
  2. ファイルを保存し、変更を有効にするために GitLab を再設定します。
  3. 既存のローカルLFSオブジェクトをオブジェクト・ストレージに移行します:

    gitlab-rake gitlab:lfs:migrate
    

    これは、既存の LFS オブジェクトをオブジェクト・ストレージに移行します。新しい LFS オブジェクトは、gitlab_rails['lfs_object_store_background_upload'] が false に設定されていない限り、オブジェクト・ストレージに転送されます。

ソースからのインストール用S3

ソース・インストールの場合、設定はlfs: の下にネストされ、次にobject_store:の下にネストされます:

  1. /home/git/gitlab/config/gitlab.yml を編集し、以下の行を追加または修正してください:

    lfs:
    enabled: true
    object_store:
      enabled: false
      remote_directory: lfs-objects # Bucket name
      connection:
        provider: AWS
        aws_access_key_id: 1ABCD2EFGHI34JKLM567N
        aws_secret_access_key: abcdefhijklmnopQRSTUVwxyz0123456789ABCDE
        region: eu-central-1
        # Use the following options to configure an AWS compatible host such as Minio
        host: 'localhost'
        endpoint: 'http://127.0.0.1:9000'
        path_style: true
    
  2. ファイルを保存し、GitLabを再起動して変更を有効にします。
  3. 既存のローカルLFSオブジェクトをオブジェクト・ストレージに移行します:

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

    これは、既存の LFS オブジェクトをオブジェクト・ストレージに移行します。新しい LFS オブジェクトは、background_upload が false に設定されていない限り、オブジェクト・ストレージに転送されます。

ローカルストレージへの移行

ローカルストレージに戻すには

  1. LFSオブジェクトストレージの設定で、direct_uploadbackground_upload の両方をfalseに設定します。 GitLabを再起動することを忘れないでください。
  2. コンソールでrake gitlab:lfs:migrate_to_local を実行してください。
  3. gitlab.rbの LFS オブジェクトのobject_storage を無効にします。 その後、GitLab を再起動することを忘れないでください。

ストレージ統計

グループやプロジェクトで LFS オブジェクトに使用されているストレージの合計は、管理領域やグループプロジェクトの APIで確認できます。

トラブルシューティングGoogle::Apis::TransmissionError: execution expired

LFSインテグレーションがGoogle Cloud Storageとバックグラウンドアップロード(background_upload: truedirect_upload: false)で設定されている場合、Sidekiqワーカーはこのエラーに遭遇する可能性があります。 これは、非常に大きなファイルでアップロードがタイムアウトするためです。 6GbまでのLFSファイルは余分なステップなしでアップロードできますが、そうでない場合は以下の回避策を使用する必要があります。

Railsコンソールにログインします:

sudo gitlab-rails console

タイムアウトの設定

  • 例えば、Sidekiqワーカーには有効ではありません。
  • 30GBのLFSファイルをアップロードするには、20分(1200秒)で十分です:
::Google::Apis::ClientOptions.default.open_timeout_sec = 1200
::Google::Apis::ClientOptions.default.read_timeout_sec = 1200
::Google::Apis::ClientOptions.default.send_timeout_sec = 1200

LFSファイルを手動でアップロードします(このプロセスではSidekiqは一切使用しません):

LfsObject.where(file_store: [nil, 1]).find_each do |lfs_object|
  lfs_object.file.migrate!(ObjectStorage::Store::REMOTE) if lfs_object.file.file.exists?
end

19581の詳細を見る

既知の制限

  • 参照されていないLFSオブジェクトの削除のサポートが8.14以降で追加されました。
  • SSH経由のLFS認証がGitLab 8.12で追加されました。
  • Git LFS クライアントのバージョン 1.1.0 以降、または 1.0.2 とのみ互換性があります。
  • ストレージ統計は現在、各LFSオブジェクトを、そのオブジェクトにリンクしているプロジェクトごとに複数回カウントしています。