你可以使用极狐GitLab 备份和恢复来迁移实例到一个新服务器。本节概述了极狐GitLab 部署在单一服务器上的典型程序。如果你正在运行极狐GitLab Geo,可以考虑使用Geo 灾难恢复计划故障切换。在选择 Geo 进行迁移之前,必须确保所有站点都满足 Geo 要求

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

避免新旧服务器之间不协调的数据处理,其中多个服务器可能同时连接并处理相同的数据。例如,当使用接收邮件时,如果两个极狐GitLab 实例同时处理邮件,则两个实例会丢失一些数据。这类问题也可能发生在其他服务中,例如非软件包数据库、非软件包 Redis 实例或非软件包 Sidekiq。

{{< /alert >}}

前提条件:

  • 在迁移之前的某个时间,考虑通过广播消息横幅通知用户即将进行的计划维护。
  • 确保备份是完整且最新的。创建一个完整的系统级备份,或者对迁移中涉及的所有服务器拍摄快照,以防误执行破坏性命令(如 rm)。

准备新服务器

要准备新服务器:

  1. 从旧服务器复制SSH 主机密钥,以避免中间人攻击警告。查看手动复制主站点的 SSH 主机密钥以获取示例步骤。
  2. 安装和配置极狐GitLab,除了接收邮件
    1. 安装极狐GitLab。
    2. 通过从旧服务器复制 /etc/gitlab 文件到新服务器,并根据需要更新进行配置。阅读Linux 软件包安装备份和恢复说明以获取更多详细信息。
    3. 如果适用,禁用接收邮件
    4. 在备份和恢复后初始启动时,阻止新的 CI/CD 作业启动。编辑 /etc/gitlab/gitlab.rb 并设置以下内容:

      nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n    deny all;\n    return 503;\n  }\n"
      
    5. 重新配置极狐GitLab:

      sudo gitlab-ctl reconfigure
      
  3. 停止极狐GitLab 以避免任何潜在的无用和无意的数据处理:

    sudo gitlab-ctl stop
    
  4. 配置新服务器以允许接收 Redis 数据库和极狐GitLab 备份文件:

    sudo rm -f /var/opt/gitlab/redis/dump.rdb
    sudo chown <your-linux-username> /var/opt/gitlab/redis /var/opt/gitlab/backups
    

准备并传输旧服务器的内容

  1. 确保你有旧服务器的最新系统级备份或快照。
  2. 启用维护模式,如果你的极狐GitLab 版本支持。
  3. 阻止新的 CI/CD 作业启动:
    1. 编辑 /etc/gitlab/gitlab.rb,并设置以下内容:

      nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n    deny all;\n    return 503;\n  }\n"
      
    2. 重新配置极狐GitLab:

      sudo gitlab-ctl reconfigure
      
  4. 禁用定期后台作业:
    1. 在左侧边栏底部,选择 管理员
    2. 在左侧边栏,选择 监控 > 后台作业
    3. 在 Sidekiq 仪表板下,选择 Cron 标签,然后选择 禁用所有
  5. 等待正在运行的 CI/CD 作业完成,或接受未完成的作业可能会丢失。在左侧边栏,选择 概览 > 作业,然后选择 正在运行
  6. 等待 Sidekiq 作业完成:
    1. 在左侧边栏,选择 监控 > 后台作业
    2. 在 Sidekiq 仪表板下,选择 队列 然后选择 实时轮询。等待 忙碌排队 降至 0。这些队列包含用户提交的工作;在作业完成之前关闭可能会导致工作丢失。记录迁移后验证时在 Sidekiq 仪表板中显示的数字。
  7. 将 Redis 数据库刷新到磁盘,并停止除迁移所需服务外的其他极狐GitLab 服务:

    sudo /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket save && sudo gitlab-ctl stop && sudo gitlab-ctl start postgresql && sudo gitlab-ctl start gitaly
    
  8. 创建极狐GitLab 备份:

    sudo gitlab-backup create
    
  9. 禁用以下极狐GitLab 服务,并通过在 /etc/gitlab/gitlab.rb 底部添加以下内容来防止无意的重启:

    alertmanager['enable'] = false
    gitlab_exporter['enable'] = false
    gitlab_pages['enable'] = false
    gitlab_workhorse['enable'] = false
    grafana['enable'] = false
    logrotate['enable'] = false
    gitlab_rails['incoming_email_enabled'] = false
    nginx['enable'] = false
    node_exporter['enable'] = false
    postgres_exporter['enable'] = false
    postgresql['enable'] = false
    prometheus['enable'] = false
    puma['enable'] = false
    redis['enable'] = false
    redis_exporter['enable'] = false
    registry['enable'] = false
    sidekiq['enable'] = false
    
  10. 重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    
  11. 验证所有内容已停止,并确认没有服务在运行:

    sudo gitlab-ctl status
    
  12. 新服务器上停止 Redis 以便传输 Redis 数据库备份:

    sudo gitlab-ctl stop redis
    
  13. 将 Redis 数据库和极狐GitLab 备份传输到新服务器:

    sudo scp /var/opt/gitlab/redis/dump.rdb <your-linux-username>@new-server:/var/opt/gitlab/redis
    sudo scp /var/opt/gitlab/backups/your-backup.tar <your-linux-username>@new-server:/var/opt/gitlab/backups
    

对于具有大量 Git 和对象数据的实例

如果你的极狐GitLab 实例在本地卷上有大量数据,例如超过 1 TB,备份可能需要很长时间。在这种情况下,你可能会发现将数据传输到新实例的相应卷上更容易。

你可能需要手动迁移的主要卷是:

  • /var/opt/gitlab/git-data 目录,其中包含所有 Git 数据。请务必阅读移动存储库文档部分,以消除 Git 数据损坏的可能性。
  • /var/opt/gitlab/gitlab-rails/shared 目录,其中包含对象数据,如产物。
  • 如果你使用的是包含在 Linux 软件包中的捆绑 PostgreSQL,你还需要迁移 /var/opt/gitlab/postgresql/data 下的 PostgreSQL 数据目录

在停止所有极狐GitLab 服务后,你可以使用 rsync 或挂载卷快照等工具将数据移动到新环境。

在新服务器上恢复数据

  1. 恢复适当的文件系统权限:

    sudo chown gitlab-redis /var/opt/gitlab/redis
    sudo chown gitlab-redis:gitlab-redis /var/opt/gitlab/redis/dump.rdb
    sudo chown git:root /var/opt/gitlab/backups
    sudo chown git:git /var/opt/gitlab/backups/your-backup.tar
    
  2. 启动 Redis:

    sudo gitlab-ctl start redis
    

    Redis 会自动拾取并恢复 dump.rdb

  3. 恢复极狐GitLab 备份
  4. 验证 Redis 数据库是否正确恢复:
    1. 在左侧边栏底部,选择 管理员
    2. 在左侧边栏,选择 监控 > 后台作业
    3. 在 Sidekiq 仪表板下,验证数字是否与旧服务器上显示的数字匹配。
    4. 仍在 Sidekiq 仪表板下,选择 Cron 然后选择 启用所有 以重新启用定期后台作业。
  5. 测试极狐GitLab 实例上的只读操作是否按预期工作。例如,浏览项目存储库文件、合并请求和议题。
  6. 如果之前启用了维护模式,请禁用它。
  7. 测试极狐GitLab 实例是否按预期工作。
  8. 如果适用,重新启用接收邮件并测试其是否按预期工作。
  9. 更新 DNS 或负载均衡器以指向新服务器。
  10. 通过移除之前添加的自定义 NGINX 配置解除对新 CI/CD 作业启动的阻止:

    # The following line must be removed
    nginx['custom_gitlab_server_config'] = "location = /api/v4/jobs/request {\n    deny all;\n    return 503;\n  }\n"
    
  11. 重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    
  12. 移除计划维护广播消息横幅