迁移到新服务器

您可以使用极狐 GitLab 备份和还原来将您的实例迁移到新服务器。本节概述了在单一服务器上运行极狐 GitLab 部署的典型流程。如果您正在运行极狐 GitLab Geo,另一种选择是Geo 灾难恢复以进行计划的故障转移。在选择 Geo 进行迁移之前,必须确保所有站点都符合 Geo 要求

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

先决条件:

  • 在迁移之前的某个时间,考虑通过广播消息横幅通知您的用户即将到来的计划维护。
  • 确保您的备份完整且最新。创建完整的系统级备份,或者对迁移中涉及的所有服务器进行快照,以防止执行错误的破坏性命令(如 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 仪表板下,选择 定时 标签,然后选择 禁用所有
  5. 等待正在运行的 CI/CD 作业完成,或者接受未完成的作业可能会丢失。在左侧边栏,选择 概览 > 作业,然后选择 运行
  6. 等待 Sidekiq 作业完成:
    1. 在左侧边栏,选择 监控 > 后台作业
    2. 在 Sidekiq 仪表板下,选择 队列 然后选择 Live Poll。等待 BusyEnqueued 下降到 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,备份可能需要很长时间。在这种情况下,您可能会发现将数据传输到新实例上的适当卷更容易。

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

  • 包含所有 Git 数据的 /var/opt/gitlab/git-data 目录。请务必阅读移动仓库文档部分以消除 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 仪表板下,选择 定时 然后选择 启用所有 以重新启用周期性后台作业。
  5. 测试极狐 GitLab 实例上的只读操作是否按预期工作。例如,浏览项目存储库文件、合并请求和议题。
  6. 禁用维护模式,如果之前启用。
  7. 测试极狐 GitLab 实例是否按预期工作。
  8. 如适用,重新启用接收电子邮件并测试其是否按预期工作。
  9. 更新您的 DNS 或负载均衡器以指向新服务器。
  10. 通过删除之前添加的自定义 NGINX 配置来解除对新 CI/CD 作业的阻止:

    # 必须删除以下行
    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. 移除计划维护的广播消息横幅