{{< details >}}

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

{{< /details >}}

以下指南提供了简明的说明,告诉您如何使用两个 Linux 软件包实例部署极狐GitLab Geo,以进行两个单节点站点安装,而无需设置外部服务。

前提条件:

  • 您至少有两个独立工作的极狐GitLab 站点。要创建站点,请参阅极狐GitLab 参考架构文档
    • 一个极狐GitLab 站点作为 Geo 主站点。您可以为每个 Geo 站点使用不同的参考架构大小。如果您已经有一个正在工作的极狐GitLab 实例,您可以将其用作主站点。
    • 第二个极狐GitLab 站点作为 Geo 次级站点。Geo 支持多个次级站点。
  • Geo 主站点至少有一个极狐GitLab 专业版许可证。您只需要一个许可证即可用于所有站点。
  • 确认所有站点符合运行 Geo 的要求

设置 Geo 的 Linux 软件包 (Omnibus)

前提条件:

  • 您使用 PostgreSQL 12 或更高版本,其中包括 pg_basebackup 工具。

配置主站点

  1. SSH 到您的极狐GitLab 主站点并以 root 身份登录:

    sudo -i
    
  2. 将一个唯一的 Geo 站点名称添加到 /etc/gitlab/gitlab.rb

    ##
    ## Geo 站点的唯一标识符。请参阅
    ## https://gitlab.cn/docs/ee/administration/geo_sites.html#common-settings
    ##
    gitlab_rails['geo_node_name'] = '<site_name_here>'
    
  3. 要应用更改,请重新配置主站点:

    gitlab-ctl reconfigure
    
  4. 将站点定义为您的主 Geo 站点:

    gitlab-ctl set-geo-primary-node
    

    此命令使用在 /etc/gitlab/gitlab.rb 中定义的 external_url

  5. gitlab 数据库用户创建一个密码,并更新 Rail 使用新密码。

    {{< alert type=”note” >}}

    gitlab_rails['db_password']postgresql['sql_user_password'] 设置配置的值需要匹配。然而,只有 postgresql['sql_user_password'] 值应该是 MD5 加密密码。

    {{< /alert >}}

    1. 生成所需密码的 MD5 哈希:

      gitlab-ctl pg-password-md5 gitlab
      # 输入密码:<your_db_password_here>
      # 确认密码:<your_db_password_here>
      # fca0b89a972d69f00eb3ec98a5838484
      
    2. 编辑 /etc/gitlab/gitlab.rb

      # 用 `gitlab-ctl pg-password-md5 gitlab` 生成的哈希填充
      postgresql['sql_user_password'] = '<md5_hash_of_your_db_password>'
      
      # 每个运行 Puma 或 Sidekiq 的节点都需要指定如下的数据库密码。如果您有一个高可用性设置,这必须存在于所有应用程序节点中。
      gitlab_rails['db_password'] = '<your_db_password_here>'
      
  6. 为数据库复制用户定义密码。使用在 /etc/gitlab/gitlab.rbpostgresql['sql_replication_user'] 设置下定义的用户名。默认值是 gitlab_replicator

    1. 生成所需密码的 MD5 哈希:

      gitlab-ctl pg-password-md5 gitlab_replicator
      
      # 输入密码:<your_replication_password_here>
      # 确认密码:<your_replication_password_here>
      # 950233c0dfc2f39c64cf30457c3b7f1e
      
    2. 编辑 /etc/gitlab/gitlab.rb

      # 用 `gitlab-ctl pg-password-md5 gitlab_replicator` 生成的哈希填充
      postgresql['sql_replication_password'] = '<md5_hash_of_your_replication_password>'
      
    3. 可选项。如果您使用的外部数据库不是由 Linux 软件包管理,您必须手动创建 gitlab_replicator 用户并为该用户定义密码:

      --- 创建一个新的用户 'replicator'
      CREATE USER gitlab_replicator;
      
      --- 设置/更改密码并授予复制权限
      ALTER USER gitlab_replicator WITH REPLICATION ENCRYPTED PASSWORD '<replication_password>';
      
  7. /etc/gitlab/gitlab.rb 中,将角色设置为 geo_primary_role

    ## Geo 主角色
    roles(['geo_primary_role'])
    
  8. 配置 PostgreSQL 以监听网络接口:

    1. 要查找 Geo 站点的地址,SSH 到 Geo 站点并执行:

      ##
      ## 私有地址
      ##
      ip route get 255.255.255.255 | awk '{print "Private address:", $NF; exit}'
      
      ##
      ## 公共地址
      ##
      echo "External address: $(curl --silent "ipinfo.io/ip")"
      

      在大多数情况下,以下地址用于配置极狐GitLab Geo:

      配置 地址
      postgresql['listen_address'] 主站点公共或 VPC 私有地址。
      postgresql['md5_auth_cidr_addresses'] 主站点和次级站点公共或 VPC 私有地址。

      如果您使用 Google Cloud Platform、SoftLayer 或任何其他提供虚拟私有云 (VPC) 的供应商,您可以使用主站点和次级站点私有地址(对应于 Google Cloud Platform 的“内部地址”)作为 postgresql['md5_auth_cidr_addresses']postgresql['listen_address']

      {{< alert type=”note” >}}

      如果您需要使用 0.0.0.0* 作为 listen_address,您还必须将 127.0.0.1/32 添加到 postgresql['md5_auth_cidr_addresses'] 设置中,以允许 Rails 通过 127.0.0.1 连接。

      {{< /alert >}}

      根据您的网络配置,建议的地址可能不正确。如果您的主站点和次级站点通过局域网或连接可用性区域的虚拟网络连接,您应该使用次级站点私有地址作为 postgresql['md5_auth_cidr_addresses']

    2. 将以下行添加到 /etc/gitlab/gitlab.rb。确保用适合您网络配置的地址替换 IP 地址:

      ##
      ## 主地址
      ## - 将 '<primary_node_ip>' 替换为您的 Geo 主节点的公共或 VPC 地址
      ##
      postgresql['listen_address'] = '<primary_site_ip>'
      
      ##
      # 允许从主 IP 和次级 IP 的 PostgreSQL 客户端身份验证。这些 IP 可以是 CIDR 格式的公共或 VPC 地址,例如 ['198.51.100.1/32', '198.51.100.2/32']
      ##
      postgresql['md5_auth_cidr_addresses'] = ['<primary_site_ip>/32', '<secondary_site_ip>/32']
      
  9. 暂时禁用自动数据库迁移,直到 PostgreSQL 重新启动并在私有地址上监听。在 /etc/gitlab/gitlab.rb 中,将 gitlab_rails['auto_migrate'] 设置为 false:

    ## 禁用自动数据库迁移
    gitlab_rails['auto_migrate'] = false
    
  10. 要应用这些更改,请重新配置极狐GitLab 并重新启动 PostgreSQL:

    gitlab-ctl reconfigure
    gitlab-ctl restart postgresql
    
  11. 要重新启用迁移,请编辑 /etc/gitlab/gitlab.rb 并将 gitlab_rails['auto_migrate'] 更改为 true

    gitlab_rails['auto_migrate'] = true
    

    保存文件并重新配置极狐GitLab:

    gitlab-ctl reconfigure
    

    PostgreSQL 服务器已设置为接受远程连接。

  12. 运行 netstat -plnt | grep 5432 以确保 PostgreSQL 正在监听端口 5432 到主站点私有地址。

  13. 极狐GitLab 重新配置时自动生成了证书。证书会自动用于保护您的 PostgreSQL 流量免受窃听。为了防止主动的(“中间人”)攻击者,复制证书到次级站点:

    1. 在主站点上制作 server.crt 的副本:

      cat ~gitlab-psql/data/server.crt
      
    2. 保存输出以便您配置次级站点时使用。证书不是敏感数据。

    证书是使用通用的 PostgreSQL 公共名称创建的。为了防止主机名不匹配错误,您必须在复制数据库时使用 verify-ca 模式。

配置次级服务器

  1. SSH 到您的极狐GitLab 次级站点并以 root 身份登录:

    sudo -i
    
  2. 为了防止在站点配置之前运行任何命令,请停止应用服务器和 Sidekiq:

    gitlab-ctl stop puma
    gitlab-ctl stop sidekiq
    
  3. 检查 TCP 连接到主站点 PostgreSQL 服务器:

    gitlab-rake gitlab:tcp_check[<primary_site_ip>,5432]
    

    如果此步骤失败,您可能使用了错误的 IP 地址,或者防火墙可能阻止了访问站点。检查 IP 地址时请特别注意公共地址和私有地址之间的区别。如果存在防火墙,请确保次级站点被允许连接到主站点的端口 5432。

  4. 在次级站点中,创建一个名为 server.crt 的文件,并添加您在配置主站点时制作的证书副本。

    editor server.crt
    
  5. 要在次级站点上设置 PostgreSQL TLS 验证,安装 server.crt

    install \
       -D \
       -o gitlab-psql \
       -g gitlab-psql \
       -m 0400 \
       -T server.crt ~gitlab-psql/.postgresql/root.crt
    

    PostgreSQL 现在只识别此确切证书来验证 TLS 连接。证书可以被访问私钥的人复制,而私钥仅存在于主站点上。

  6. 测试 gitlab-psql 用户是否可以连接到主站点数据库。默认的 Linux 软件包名称是 gitlabhq_production

    sudo \
       -u gitlab-psql /opt/gitlab/embedded/bin/psql \
       --list \
       -U gitlab_replicator \
       -d "dbname=gitlabhq_production sslmode=verify-ca" \
       -W \
       -h <primary_site_ip>
    

    当被提示时,输入您为 gitlab_replicator 用户设置的明文密码。如果一切正常,您应该能看到主站点数据库的列表。

  7. 编辑 /etc/gitlab/gitlab.rb 并将角色设置为 geo_secondary_role

    ##
    ## Geo 次级角色
    ## - 自动配置依赖标志以启用 Geo
    ##
    roles(['geo_secondary_role'])
    

    有关更多信息,请参阅 Geo 角色

  8. 要配置 PostgreSQL,编辑 /etc/gitlab/gitlab.rb 并添加以下内容:

    ##
    ## 次级地址
    ## - 将 '<secondary_site_ip>' 替换为您的 Geo 次级站点的公共或 VPC 地址
    ##
    postgresql['listen_address'] = '<secondary_site_ip>'
    postgresql['md5_auth_cidr_addresses'] = ['<secondary_site_ip>/32']
    
    ##
    ## 数据库凭证密码(在主站点中之前定义)
    ## - 在此处复制主站点中定义的相同值
    ##
    postgresql['sql_replication_password'] = '<md5_hash_of_your_replication_password>'
    postgresql['sql_user_password'] = '<md5_hash_of_your_db_password>'
    gitlab_rails['db_password'] = '<your_db_password_here>'
    

    确保用适合您网络配置的地址替换 IP 地址。

  9. 要应用更改,请重新配置极狐GitLab:

    gitlab-ctl reconfigure
    
  10. 要应用 IP 地址更改,请重新启动 PostgreSQL:

    gitlab-ctl restart postgresql
    

复制数据库

将次级站点上的数据库连接到主站点上的数据库。您可以使用下面的脚本复制数据库并创建流式复制所需的文件。

该脚本使用默认的 Linux 软件包目录。如果您更改了默认值,请将下面脚本中的目录和路径名称替换为您自己的名称。

{{< alert type=”warning” >}}

仅在次级站点上运行复制脚本。脚本在运行 pg_basebackup 之前会删除所有 PostgreSQL 数据,这可能会导致数据丢失。

{{< /alert >}}

要复制数据库:

  1. SSH 到您的极狐GitLab 次级站点并以 root 身份登录:

    sudo -i
    
  2. 为您的次级站点选择一个数据库友好的名称以用作复制槽名称。例如,如果您的域是 secondary.geo.example.com,请使用 secondary_example 作为槽名称。复制槽名称只能包含小写字母、数字和下划线字符。

  3. 执行以下命令以备份和还原数据库,并开始复制。

    {{< alert type=”warning” >}}

    每个 Geo 次级站点必须有自己唯一的复制槽名称。在两个次级站点之间使用相同的槽名称会破坏 PostgreSQL 复制。

    {{< /alert >}}

    gitlab-ctl replicate-geo-database \
       --slot-name=<secondary_site_name> \
       --host=<primary_site_ip> \
       --sslmode=verify-ca
    

    当被提示时,输入您为 gitlab_replicator 设置的明文密码。

复制过程完成。

配置一个新的次级站点

初始复制过程完成后,继续在次级站点上配置以下项目。

快速查找授权 SSH 密钥

按照文档配置授权 SSH 密钥的快速查找

快速查找是 Geo 所需的

{{< alert type=”note” >}}

认证由主站点处理。不要为次级站点设置自定义认证。任何需要访问 管理员 区域的更改都应在主站点进行,因为次级站点是只读副本。

{{< /alert >}}

手动复制秘密极狐GitLab 值

极狐GitLab 在 /etc/gitlab/gitlab-secrets.json 中存储了许多秘密值。此 JSON 文件必须在每个站点节点上保持一致。您必须手动复制秘密文件到所有次级站点。

  1. SSH 到您主站点上的 Rails 节点,并执行以下命令:

    sudo cat /etc/gitlab/gitlab-secrets.json
    

    这将以 JSON 格式显示您必须复制的秘密。

  2. SSH 到您次级 Geo 站点上的每个节点并以 root 身份登录:

    sudo -i
    
  3. 备份任何现有的秘密:

    mv /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json.`date +%F`
    
  4. /etc/gitlab/gitlab-secrets.json 从主站点 Rails 节点复制到每个次级站点节点。您还可以在节点之间复制并粘贴文件内容:

    sudo editor /etc/gitlab/gitlab-secrets.json
    
    # 粘贴您在主站点上运行的 `cat` 命令的输出
    # 保存并退出
    
  5. 确保文件权限正确:

    chown root:root /etc/gitlab/gitlab-secrets.json
    chmod 0600 /etc/gitlab/gitlab-secrets.json
    
  6. 要应用更改,请重新配置每个 Rails、Sidekiq 和 Gitaly 次级站点节点:

    gitlab-ctl reconfigure
    gitlab-ctl restart
    

手动复制主站点 SSH 主机密钥

  1. SSH 到次级站点上的每个节点并以 root 身份登录:

    sudo -i
    
  2. 备份任何现有的 SSH 主机密钥:

    find /etc/ssh -iname 'ssh_host_*' -exec cp {} {}.backup.`date +%F` \;
    
  3. 从主站点复制 OpenSSH 主机密钥。

    • 如果您能以 root 身份访问其中一个提供 SSH 流量的主站点节点(通常是主要的极狐GitLab Rails 应用程序节点):

      # 从次级站点运行此命令,将 `<primary_site_fqdn>` 替换为服务器的 IP 或 FQDN
      scp root@<primary_node_fqdn>:/etc/ssh/ssh_host_*_key* /etc/ssh
      
    • 如果您只能通过具有 sudo 权限的用户访问:

      # 从您主站点上的节点运行此命令:
      sudo tar --transform 's/.*\///g' -zcvf ~/geo-host-key.tar.gz /etc/ssh/ssh_host_*_key*
      
      # 在您次级站点上的每个节点上运行此命令:
      scp <user_with_sudo>@<primary_site_fqdn>:geo-host-key.tar.gz .
      tar zxvf ~/geo-host-key.tar.gz -C /etc/ssh
      
  4. 对次级站点上的每个节点,确保文件权限正确:

    chown root:root /etc/ssh/ssh_host_*_key*
    chmod 0600 /etc/ssh/ssh_host_*_key
    
  5. 要验证密钥指纹是否匹配,请在每个站点上的主节点和次级节点上执行以下命令:

    for file in /etc/ssh/ssh_host_*_key; do ssh-keygen -lf $file; done
    

    您应该得到类似以下的输出:

    1024 SHA256:FEZX2jQa2bcsd/fn/uxBzxhKdx4Imc4raXrHwsbtP0M root@serverhostname (DSA)
    256 SHA256:uw98R35Uf+fYEQ/UnJD9Br4NXUFPv7JAUln5uHlgSeY root@serverhostname (ECDSA)
    256 SHA256:sqOUWcraZQKd89y/QQv/iynPTOGQxcOTIXU/LsoPmnM root@serverhostname (ED25519)
    2048 SHA256:qwa+rgir2Oy86QI+PZi/QVR+MSmrdrpsuH7YyKknC+s root@serverhostname (RSA)
    

    输出应该在两个节点上是相同的。

  6. 验证您有现有私钥的正确公钥:

    # 这将打印私钥的指纹:
    for file in /etc/ssh/ssh_host_*_key; do ssh-keygen -lf $file; done
    
    # 这将打印公钥的指纹:
    for file in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf $file; done
    

    公钥和私钥命令的输出应生成相同的指纹。

  7. 对次级站点上的每个节点,重新启动 sshd

    # Debian 或 Ubuntu 安装
    sudo service ssh reload
    
    # CentOS 安装
    sudo service sshd reload
    
  8. 为了验证 SSH 是否仍然正常工作,从一个新的终端,SSH 到您的极狐GitLab 次级服务器。如果您无法连接,请确保您有正确的权限。

添加次级站点

  1. SSH 到次级站点上的每个 Rails 和 Sidekiq 节点并以 root 身份登录:

    sudo -i
    
  2. 编辑 /etc/gitlab/gitlab.rb 并为您的站点添加一个唯一名称。

    ##
    ## Geo 站点的唯一标识符。请参阅
    ## https://gitlab.cn/docs/ee/administration/geo_sites.html#common-settings
    ##
    gitlab_rails['geo_node_name'] = '<site_name_here>'
    

    保存唯一名称以便后续步骤使用。

  3. 要应用更改,请重新配置次级站点上的每个 Rails 和 Sidekiq 节点。

    gitlab-ctl reconfigure
    
  4. 前往主节点极狐GitLab 实例:
    1. 在左侧边栏底部,选择 管理员
    2. 选择 Geo > 站点
    3. 选择 添加站点

      带有三个输入字段的表单:名称、外部 URL 和内部 URL(可选)。

    4. 名称 中,输入 /etc/gitlab/gitlab.rbgitlab_rails['geo_node_name'] 的值。值必须完全匹配。
    5. 外部 URL 中,输入 /etc/gitlab/gitlab.rbexternal_url 的值。如果一个值以 / 结束而另一个没有,则可以,否则值必须完全匹配。
    6. 可选项。在 内部 URL(可选) 中,输入主站点的内部 URL。
    7. 可选项。选择次级站点应复制哪些群组或存储分片。要复制全部,请将字段留空。请参阅选择性同步
    8. 选择 保存更改
  5. SSH 到次级站点上的每个 Rails 和 Sidekiq 节点并重新启动服务:

    gitlab-ctl restart
    
  6. 通过运行以下命令检查您的 Geo 设置是否有任何常见问题:

    gitlab-rake gitlab:geo:check
    

    如果任何检查失败,请参阅故障排除文档

  7. 为了验证次级站点是否可访问,SSH 到主站点上的 Rails 或 Sidekiq 服务器并以 root 身份登录:

    gitlab-rake gitlab:geo:check
    

    如果任何检查失败,请检查故障排除文档

次级站点被添加到 Geo 管理页面并重新启动后,站点会自动开始从主站点复制缺失的数据,这个过程称为补充。

同时,主站点开始通知每个次级站点任何更改,以便次级站点可以立即对通知采取行动。

确保次级站点正在运行并可访问。您可以使用与主站点相同的凭证登录次级站点。

启用通过 HTTP/HTTPS 和 SSH 的 Git 访问

Geo 通过 HTTP/HTTPS 同步存储库,因此需要启用此克隆方法。默认情况下是启用的。如果您将现有站点转换为 Geo,您应该检查克隆方法是否启用。

在主站点上:

  1. 在左侧边栏底部,选择 管理员
  2. 选择 设置 > 常规
  3. 展开 可见性和访问控制
  4. 如果您使用 Git over SSH:
    1. 确保 启用的 Git 访问协议 设置为 同时支持 SSH 和 HTTP(S)
    2. 在主站点和次级站点上遵循在数据库中快速查找授权 SSH 密钥
  5. 如果您不使用 Git over SSH,将 启用的 Git 访问协议 设置为 仅 HTTP(S)

验证次级站点的正常功能

您可以使用与主站点相同的凭证登录次级站点。

登录后:

  1. 在左侧边栏底部,选择 管理员
  2. 选择 Geo > 站点
  3. 验证站点是否正确识别为次级 Geo 站点,并且 Geo 是否已启用。

初始复制可能需要一些时间。您可以通过浏览器在主站点 Geo 站点 仪表板上监控同步过程。

显示同步状态的 Geo 站点仪表板。

相关主题