Предварительная версия. Функциональность может измениться, но основные возможности сохранятся. Совместимость с будущими версиями может потребовать ручных действий по миграции.

Миграция из Omnibus в Code

  1. Если GitLab использует локальное файловое хранилище для Docker Registry, необходимо перенести данные в S3-бакет, который подключается к Code, согласно этой инструкции:

    aws --endpoint-url <https://your-object-storage-backend.com> s3 sync registry s3://mybucket
    
    • В случае использования утилиты s3cmd, то выполните команду s3cmd --configure для настройки конфигурации подключения к s3. И далее команды для переноса данных в S3-бакет, который подключается к Code:
    s3cmd sync registry s3://mybucket
    

    где registry — путь к папке хранилища Docker Registry в файловой системе.

  2. Blob-объекты, которые используют S3 Object Storage для хранения данных, рекомендуется перенести в S3-бакеты, подключенные к Code Operator, согласно данной инструкции:

    • Настройте в rclone два подключения: old и new, где:
      • old — подключение к S3 Storage, подключенному к GitLab.
      • new — подключение к S3 Storage бакету в Code Operator.
    • Выполните команду:
      rclone sync -P old:BUCKET_NAME new:BUCKET_NAME
      
  3. Создайте архив с бэкапом согласно инструкции. Добавьте опцию SKIP для объектов, перенесенных в пункте 2. Если Object Storage не используется, опцию SKIP можно не указывать.

  4. Загрузите созданный архив с бэкапом на компьютер администратора, а затем загрузите его в S3-хранилище для бэкапов, указанное в ModuleConfig Code, поле bucketName:

    backup:
      enabled: true
      restoreFromBackupMode: true
      s3:
        bucketName: d8-code-backup
    

    В S3-бакете d8-code-backup должен храниться архив с бэкапом, например: 1742909494_2025_03_25_17.8.1_gitlab_backup.tar.

  5. Создайте секреты в пространстве имен d8-code:

    Поместите в них значения из соответствующих пунктов.

  6. Сгенерируйте манифест ModuleConfig и настройте блок backup:

    backup:
      enabled: true
      restoreFromBackupMode: true
      s3:
        bucketName: code-backup
        external:
          accessKey: S3AccessKey
          provider: YCloud | Generic | AWS | AzureRM
          secretKey: S3SecretKey
        mode: External
    
  7. Подключитесь к pod toolbox на мастер-хосте кластера Deckhouse. Пример:

    /opt/deckhouse/bin/kubectl -n d8-code exec -it -c toolbox toolbox-64d4fb84cf-b7dwb -- bash
    
  8. Внутри toolbox выполните:

    backup-utility --restore -t <backup_timestamp>
    

    Например:

    backup-utility --restore -t 1742909494_2025_03_25_17.8.1
    
  9. Отключите режим восстановления внутри конфигурации ModuleConfig Code:

    • Выполните команду:
      /opt/deckhouse/bin/kubectl edit mc code
      
    • Измените значение restoreFromBackupMode на false.
  10. Дождитесь завершения перезапуска подов оператором.


Миграция из Code в Omnibus

  1. Переведите Code в backup mode, установив параметр backup.restoreFromBackupMode в значение true в ModuleConfig. Это позволит временно “выключить” все компоненты-потребители Code на время процесса восстановления.

  2. Используйте pod toolbox и встроенную в него утилиту backup-utility для создания архива с бэкапом:

    kubectl -n d8-code exec <Toolbox pod name> -it -- backup-utility --restore -t <timestamp|URL>
    

    Например:

    /opt/deckhouse/bin/kubectl -n d8-code exec -it -c toolbox toolbox-64d4fb84cf-b7dwb -- backup-utility
    
  3. Дождитесь завершения процесса создания бэкапа. По завершении бэкап будет сохранен в S3-хранилище, указанное в ModuleConfig в секции backup:

    backup:
      enabled: true
      restoreFromBackupMode: true
      s3:
        bucketName: code-backup
        external:
          accessKey: S3AccessKey
          provider: YCloud | Generic | AWS | AzureRM
          secretKey: S3SecretKey
        mode: External
    

    Имя созданного архива будет соответствовать формату <timestamp>_gitlab_backup.tar. Пример:

    1742909494_2025_03_25_17.8.1_gitlab_backup.tar.

  4. Остановите службы puma и sidekiq:

    gitlab-ctl stop puma
    gitlab-ctl stop sidekiq
    

    Если GitLab развёрнут в Docker, выполните эти команды внутри контейнера.

  5. Скачайте и перенесите архив с бэкапом в директорию, где хранятся бэкапы GitLab:

    • По умолчанию это /var/opt/gitlab/backups.
    • Если используется другая директория, переместите бэкап туда.
    • Если используется S3 Object Storage для хранения бэкапов, загрузите архив туда.
  6. Восстановите файл gitlab-secrets.json:

    • Создайте копию текущего файла gitlab-secrets.json своей Linux/Docker установки. Для этого скопируйте файл /etc/gitlab/gitlab-secrets.json на хост администратора.

    • Получите rails-secrets.json из Code. Для этого выполните следующую команду на хосте, где выполняется команда kubectl для кластера Deckhouse:

      kubectl -n d8-code get secret rails-secret-v1 -ojsonpath='{.data.secrets\.yml}' | yq '@base64d | from_yaml | .production' -o json > rails-secrets.json
      
    • Перенесите созданный файл rails-secrets.json в ту же директорию, куда поместили файл gitlab-secrets.json, и выполните команду:

      yq eval-all 'select(filename == "gitlab-secrets.json").gitlab_rails = select(filename == "rails-secrets.json") | select(filename == "gitlab-secrets.json")' -ojson gitlab-secrets.json rails-secrets.json > gitlab-secrets-updated.json
      
    • Замените текущий файл gitlab-secrets.json на полученный файл gitlab-secrets-updated.json. Для этого скопируйте gitlab-secrets-updated.json на хост/контейнер, где запущен GitLab, в папку /etc/gitlab/gitlab-secrets.json:

      cp gitlab-secrets-updated.json /etc/gitlab/gitlab-secrets.json
      
  7. Восстановите SSH-ключи хоста:

    • На хосте, где выполняется команда kubectl для кластера Deckhouse, выполните следующие команды:

      kubectl -n d8-code get secrets shell-host-keys -ojsonpath='{.data.ssh_host_ecdsa_key}' | base64 -d > ssh_host_ecdsa_key
      kubectl -n d8-code get secrets shell-host-keys -ojsonpath='{.data.ssh_host_ecdsa_key.pub}' | base64 -d > ssh_host_ecdsa_key.pub
      kubectl -n d8-code get secrets shell-host-keys -ojsonpath='{.data.ssh_host_ed25519_key}' | base64 -d > ssh_host_ed25519_key
      kubectl -n d8-code get secrets shell-host-keys -ojsonpath='{.data.ssh_host_ed25519_key.pub}' | base64 -d > ssh_host_ed25519_key.pub
      kubectl -n d8-code get secrets shell-host-keys -ojsonpath='{.data.ssh_host_rsa_key}' | base64 -d > ssh_host_rsa_key
      kubectl -n d8-code get secrets shell-host-keys -ojsonpath='{.data.ssh_host_rsa_key.pub}' | base64 -d > ssh_host_rsa_key.pub
      
    • Скопируйте полученные файлы на хост с вашей Linux/Docker установкой в директорию /etc/gitlab:

      cp ssh_host_* /etc/gitlab/
      
  8. После замены файла gitlab-secrets.json выполните команду:

    gitlab-ctl reconfigure
    
  9. По завершении выполнения команды запустите восстановление:

    gitlab-backup restore BACKUP=<timestamp>
    

    Например:

    gitlab-backup restore BACKUP=1742909494_2025_03_25_17.8.1
    
  10. После восстановления перезапустите GitLab и проверьте его состояние:

    gitlab-ctl restart
    gitlab-rake gitlab:check SANITIZE=true