Repository storage

Introduced in GitLab 8.10.

GitLab stores repositories on repository storage. Repository storage is either:

  • A gitaly_address, which points to a Gitaly node.
  • A path, which points directly a directory where the repository is stored.

GitLab allows you to define multiple repository storages to distribute the storage load between several mount points. For example:

  • When using Gitaly (Omnibus GitLab-style configuration):

     git_data_dirs({
       'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
       'storage1' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
     })
    
  • When using direct repository storage (source install-style configuration):

    default:
      path: /mnt/git-storage-1
    storage2:
      path: /mnt/git-storage-2
    

For more information on

  • Configuring Gitaly, see Configure Gitaly.
  • Configuring direct repository access, see the following section below.

Configure repository storage paths

To configure repository storage paths:

  1. Edit the necessary configuration files:
    • /etc/gitlab/gitlab.rb, for Omnibus GitLab installations.
    • gitlab.yml, for installations from source.
  2. Add the required repository storage paths.

For repository storage paths:

  • You must have at least one storage path called default.
  • The paths are defined in key-value pairs. Apart from default, the key can be any name you choose to name the file path.
  • The target directories and any of its sub paths must not be a symlink.
  • No target directory may be a sub-directory of another. That is, no nesting. For example, the following configuration is invalid:

    default:
      path: /mnt/git-storage-1
    storage2:
      path: /mnt/git-storage-1/git-storage-2 # <- NOT OK because of nesting
    

Configure for backups

For backups to work correctly:

  • The repository storage path cannot be a mount point.
  • The GitLab user must have correct permissions for the parent directory of the path.

Omnibus GitLab takes care of these issues for you, but for source installations you should be extra careful.

While restoring a backup, the current contents of /home/git/repositories are moved to /home/git/repositories.old. If /home/git/repositories is a mount point, then mv would be moving things between mount points, and problems can occur.

Ideally, /home/git is the mount point, so things remain inside the same mount point. Omnibus GitLab installations guarantee this because they don’t specify the full repository path but instead the parent path, but source installations do not.

Example configuration

In the examples below, we add two additional repository storage paths configured to two additional mount points.

For compatibility reasons gitlab.yml has a different structure than Omnibus GitLab configuration:

  • In gitlab.yml, you indicate the path for the repositories, for example /home/git/repositories
  • In Omnibus GitLab configuration you indicate git_data_dirs, which could be /home/git for example. Then Omnibus GitLab creates a repositories directory under that path to use with gitlab.yml.
noteThis example uses NFS. We do not recommend using EFS for storage as it may impact GitLab performance. Read the relevant documentation for more details.

For installations from source

  1. Edit gitlab.yml and add the storage paths:

    repositories:
      # Paths where repositories can be stored. Give the canonicalized absolute pathname.
      # NOTE: REPOS PATHS MUST NOT CONTAIN ANY SYMLINK!!!
      storages: # You must have at least a 'default' repository storage path.
        default:
          path: /home/git/repositories
        nfs_1:
          path: /mnt/nfs1/repositories
        nfs_2:
          path: /mnt/nfs2/repositories
    
  2. Restart GitLab for the changes to take effect.

For Omnibus installations

Edit /etc/gitlab/gitlab.rb by appending the rest of the paths to the default one:

git_data_dirs({
 "default" => { "path" => "/var/opt/gitlab/git-data" },
 "nfs_1" => { "path" => "/mnt/nfs1/git-data" },
 "nfs_2" => { "path" => "/mnt/nfs2/git-data" }
})
noteOmnibus stores the repositories in a repositories subdirectory of the git-data directory.

Configure where new repositories are stored

After you configure multiple repository storage paths, you can choose where new repositories are stored:

  1. Go to the Admin Area ().
  2. Go to Settings > Repository and expand the Repository storage section.
  3. Enter values in the Storage nodes for new repositories fields.
  4. Select Save changes.

Each repository storage path can be assigned a weight from 0-100. When a new project is created, these weights are used to determine the storage location the repository is created on. The higher the weight of a given repository storage path relative to other repository storages paths, the more often it is chosen. That is, (storage weight) / (sum of all weights) * 100 = chance %.

Choose repository storage path in Admin Area

Move repositories

To move a repository to a different repository path, use the Project repository storage moves API. Use the same process as migrating existing repositories to Gitaly Cluster.