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

GitLab 依赖代理管理

  • Tier: 免费版, 专业版, 旗舰版
  • Offering: GitLab 私有化部署

您可以将 GitLab 用作依赖代理,用于缓存频繁访问的上游制品,包括容器镜像和软件包。

本文是管理文档。要了解如何使用依赖代理,请参阅:

GitLab 依赖代理:

  • 默认启用。
  • 可由管理员禁用。

禁用依赖代理

依赖代理默认启用。如果您是管理员,可以禁用它。要禁用依赖代理,请按照与您的 GitLab 安装类型相对应的说明进行操作。

  1. 编辑 /etc/gitlab/gitlab.rb 并添加以下行:

    gitlab_rails['dependency_proxy_enabled'] = false
  2. 保存文件并重新配置 GitLab以使更改生效。

安装完成后,更新全局 appConfig 以禁用依赖代理:

global:
  appConfig:
    dependencyProxy:
      enabled: false
      bucket: gitlab-dependency-proxy
      connection:
        secret:
        key:

更多信息,请参阅使用全局变量配置 Charts

  1. 安装完成后,在 config/gitlab.yml 中配置 dependency_proxy 部分。将 enabled 设置为 false 以禁用依赖代理:

    dependency_proxy:
      enabled: false
  2. 重启 GitLab以使更改生效。

多节点 GitLab 安装

为每个 Web 节点和 Sidekiq 节点遵循 Linux 包安装的步骤。

启用依赖代理

依赖代理默认启用,但可由管理员禁用。要手动启用它,请遵循禁用依赖代理中的说明。

更改存储路径

默认情况下,依赖代理文件存储在本地,但您可以更改默认的本地位置,甚至使用对象存储。

更改本地存储路径

Linux 包安装的依赖代理文件存储在 /var/opt/gitlab/gitlab-rails/shared/dependency_proxy/ 下,而源码安装则存储在 shared/dependency_proxy/(相对于 Git 主目录)。

  1. 编辑 /etc/gitlab/gitlab.rb 并添加以下行:

    gitlab_rails['dependency_proxy_storage_path'] = "/mnt/dependency_proxy"
  2. 保存文件并重新配置 GitLab以使更改生效。

  1. 编辑 config/gitlab.yml 中的 dependency_proxy 部分:

    dependency_proxy:
      enabled: true
      storage_path: shared/dependency_proxy
  2. 重启 GitLab以使更改生效。

使用对象存储

您可以不依赖本地存储,而是使用统一对象存储设置。 本节介绍早期的配置格式。迁移步骤仍然适用

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

  1. 编辑 /etc/gitlab/gitlab.rb 并添加以下行(必要时取消注释):

    gitlab_rails['dependency_proxy_enabled'] = true
    gitlab_rails['dependency_proxy_storage_path'] = "/var/opt/gitlab/gitlab-rails/shared/dependency_proxy"
    gitlab_rails['dependency_proxy_object_store_enabled'] = true
    gitlab_rails['dependency_proxy_object_store_remote_directory'] = "dependency_proxy" # 存储桶名称。
    gitlab_rails['dependency_proxy_object_store_proxy_download'] = false        # 通过 GitLab 代理所有下载,而不是使用重定向到对象存储。
    gitlab_rails['dependency_proxy_object_store_connection'] = {
      ##
      ## 如果提供商是 AWS S3,请取消注释以下内容
      ##
      #'provider' => 'AWS',
      #'region' => 'eu-west-1',
      #'aws_access_key_id' => 'AWS_ACCESS_KEY_ID',
      #'aws_secret_access_key' => 'AWS_SECRET_ACCESS_KEY',
      ##
      ## 如果提供商不是 AWS(即 S3 兼容的提供商),请取消注释以下内容
      ##
      #'host' => 's3.amazonaws.com',
      #'aws_signature_version' => 4             # 用于创建签名 URL。如果提供商不支持 v4,请设置为 2。
      #'endpoint' => 'https://s3.amazonaws.com' # 适用于 S3 兼容服务,例如 DigitalOcean Spaces。
      #'path_style' => false                    # 如果为 true,则使用 'host/bucket_name/object' 而不是 'bucket_name.host/object'。
    }
  2. 保存文件并重新配置 GitLab以使更改生效。

  1. 编辑 config/gitlab.yml 中的 dependency_proxy 部分(必要时取消注释):

    dependency_proxy:
      enabled: true
      ##
      ## 构建依赖代理的存储位置(默认:shared/dependency_proxy)。
      ##
      # storage_path: shared/dependency_proxy
      object_store:
        enabled: false
        remote_directory: dependency_proxy  # 存储桶名称。
        #  proxy_download: false     # 通过 GitLab 代理所有下载,而不是使用重定向到对象存储。
        connection:
        ##
        ## 如果提供商是 AWS S3,请使用以下配置
        ##
          provider: AWS
          region: us-east-1
          aws_access_key_id: AWS_ACCESS_KEY_ID
          aws_secret_access_key: AWS_SECRET_ACCESS_KEY
          ##
          ## 如果提供商不是 AWS(即 S3 兼容的提供商),请注释掉前 4 行,并改用以下配置:
          ##
          #  host: 's3.amazonaws.com'             # 默认值:s3.amazonaws.com。
          #  aws_signature_version: 4             # 用于创建签名 URL。如果提供商不支持 v4,请设置为 2。
          #  endpoint: 'https://s3.amazonaws.com' # 适用于 S3 兼容服务,例如 DigitalOcean Spaces。
          #  path_style: false                    # 如果为 true,则使用 'host/bucket_name/object' 而不是 'bucket_name.host/object'。
  2. 重启 GitLab以使更改生效。

将本地依赖代理的 blobs 和 manifests 迁移到对象存储

配置对象存储后, 使用以下任务将现有的依赖代理 blobs 和 manifests 从本地存储迁移到远程存储。 该处理由后台工作进程完成,无需停机。

  • 对于 Linux 包安装:

    sudo gitlab-rake "gitlab:dependency_proxy:migrate"
  • 对于自编译安装:

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

您可以选择使用 PostgreSQL 控制台跟踪进度并验证所有依赖代理的 blobs 和 manifests 是否已成功迁移:

  • 对于运行 14.1 及更早版本的 Linux 包安装:sudo gitlab-rails dbconsole
  • 对于运行 14.2 及更高版本的 Linux 包安装:sudo gitlab-rails dbconsole --database main
  • 对于自编译实例:sudo -u git -H psql -d gitlabhq_production

验证 objectstg(其中 file_store = '2')是否包含每个查询中所有依赖代理 blobs 和 manifests 的计数:

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 dependency_proxy_blobs;

total | filesystem | objectstg
------+------------+-----------
 22   |          0 |        22

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 dependency_proxy_manifests;

total | filesystem | objectstg
------+------------+-----------
 10   |          0 |        10

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

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

更改 JWT 过期时间

依赖代理遵循 Docker v2 令牌认证流程, 向客户端颁发一个 JWT 用于拉取请求。令牌过期时间是可配置的,使用应用设置 container_registry_token_expire_delay。 可以通过 rails 控制台进行更改:

# 将 JWT 过期时间更新为 30 分钟
ApplicationSetting.update(container_registry_token_expire_delay: 30)

默认过期时间以及 GitLab.com 上的过期时间为 15 分钟。

在代理后使用依赖代理

  1. 编辑 /etc/gitlab/gitlab.rb 并添加以下行:

    gitlab_workhorse['env'] = {
      "http_proxy" => "http://USERNAME:[email protected]:8080",
      "https_proxy" => "http://USERNAME:[email protected]:8080"
    }
  2. 保存文件并重新配置 GitLab以使更改生效。