GitLab package registry administration All tiers Self-managed

To use GitLab as a private repository for a variety of common package managers, use the package registry. You can build and publish packages, which can be consumed as dependencies in downstream projects.

Supported formats

The package registry supports the following formats:

Package type GitLab version
Composer 13.2+
Conan 12.6+
Go 13.1+
Maven 11.3+
npm 11.7+
NuGet 12.8+
PyPI 12.10+
Generic packages 13.5+
Helm Charts 14.1+

Accepting contributions

The below table lists formats that are not supported, but are accepting Community contributions for. Consider contributing to GitLab. This development documentation guides you through the process.

Format Status
Chef #36889
CocoaPods #36890
Conda #36891
CRAN #36892
Debian Draft: Merge Request
Opkg #36894
P2 #36895
Puppet #36897
RPM #5932
RubyGems #803
SBT #36898
Terraform Draft: Merge Request
Vagrant #36899

Rate limits

When downloading packages as dependencies in downstream projects, many requests are made through the Packages API. You may therefore reach enforced user and IP rate limits. To address this issue, you can define specific rate limits for the Packages API. For more details, see package registry rate limits.

Enable or disable the package registry

The package registry is enabled by default. To disable it:

  1. Edit /etc/gitlab/gitlab.rb:

    # Change to true to enable packages - enabled by default if not defined
    gitlab_rails['packages_enabled'] = false
    
  2. Save the file and reconfigure GitLab:

    sudo gitlab-ctl reconfigure
    

Change the storage path

By default, the packages are stored locally, but you can change the default local location or even use object storage.

Change the local storage path

By default, the packages are stored in a local path, relative to the GitLab installation:

  • Linux package (Omnibus): /var/opt/gitlab/gitlab-rails/shared/packages/
  • Self-compiled (source): /home/git/gitlab/shared/packages/

To change the local storage path:

  1. Edit /etc/gitlab/gitlab.rb and add the following line:

    gitlab_rails['packages_storage_path'] = "/mnt/packages"
    
  2. Save the file and reconfigure GitLab:

    sudo gitlab-ctl reconfigure
    

If you already had packages stored in the old storage path, move everything from the old to the new location to ensure existing packages stay accessible:

mv /var/opt/gitlab/gitlab-rails/shared/packages/* /mnt/packages/

Docker and Kubernetes do not use local storage.

  • For the Helm chart (Kubernetes): Use object storage instead.
  • For Docker: The /var/opt/gitlab/ directory is already mounted in a directory on the host. There’s no need to change the local storage path inside the container.

Use object storage

Instead of relying on the local storage, you can use an object storage to store packages.

For more information, see how to use the consolidated object storage settings.

Migrate local packages to object storage

After configuring the object storage, use the following task to migrate existing packages from the local storage to the remote storage. The processing is done in a background worker and requires no downtime.

  1. Migrate the packages.

    sudo gitlab-rake "gitlab:packages:migrate"
    
  2. Track the progress and verify that all packages migrated successfully using the PostgreSQL console.

    sudo gitlab-rails dbconsole
    
  3. Verify that all packages migrated to object storage with the following SQL query. The number of objectstg should be the same as total:

    gitlabhq_production=# SELECT count(*) AS total, sum(case when file_store = '1' then 1 else 0 end) AS filesystem, sum(case when file_store = '2' then 1 else 0 end) AS objectstg FROM packages_package_files;
    
    total | filesystem | objectstg
    ------+------------+-----------
     34   |          0 |        34
    
  4. Finally, verify that there are no files on disk in the packages directory:

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