Deckhouse Code работает на GitLab и принимает данные инстанса GitLab Community Edition (CE) той же версии GitLab: репозитории, пользователей, группы, задачи, запросы на слияние, настройки и историю CI/CD. Инстанс переносится целиком. Отдельные проекты между инстансами переносятся по инструкции «Импорт проекта».
Порядок миграции зависит от того, где работает Deckhouse Code:
- на том же сервере или с теми же томами Docker, что и GitLab CE: пакет или образ Deckhouse Code заменяет GitLab CE, данные остаются на месте, как описано в разделе «Миграция на месте»;
- на другом сервере, в установке из Helm-чарта или в модуле Deckhouse Kubernetes Platform: данные переносятся в архиве резервной копии, как описано в разделе «Миграция через архив резервной копии».
Перед началом
Проверьте условия на инстансе GitLab CE:
- Версия GitLab на инстансе совпадает с версией GitLab устанавливаемого выпуска Deckhouse Code. Архив резервной копии восстанавливается только в ту версию, в которой он создан. Если на инстансе более старая версия, сначала обновите его по пути обновления GitLab.
- Все фоновые миграции завершены: откройте «Admin» → «Мониторинг» → «Фоновые миграции» и проверьте, что вкладки «В очереди», «Завершаются» и «Неудачные» пусты.
- На диске достаточно свободного места для архива резервной копии.
Проверьте версию GitLab на инстансе:
- Пакет для ОС Linux
- Omnibus Docker
sudo cat /opt/gitlab/embedded/service/gitlab-rails/VERSIONВ командах на этой странице контейнер GitLab CE называется gitlab; замените имя на своё.
docker exec gitlab cat /opt/gitlab/embedded/service/gitlab-rails/VERSIONМиграция на месте
Пакет Deckhouse Code заменяет пакет gitlab-ce, а образ Deckhouse Code запускается на томах контейнера GitLab CE. Конфигурация в /etc/gitlab/gitlab.rb, секреты в /etc/gitlab/gitlab-secrets.json и данные в /var/opt/gitlab сохраняются. Запуск настройки применяет миграции базы данных, которые создают таблицы Deckhouse Code.
Во время установки сервисы перезапускаются, и инстанс недоступен до окончания настройки и миграций.
- Пакет для ОС Linux
- Omnibus Docker
Создайте резервную копию и скопируйте её за пределы сервера вместе с файлами
/etc/gitlab/gitlab.rb,/etc/gitlab/gitlab-secrets.jsonи директорией/etc/gitlab/ssl/:sudo gitlab-backup createУстановите пакет Deckhouse Code. Менеджер пакетов удалит пакет
gitlab-ce:# РЕД ОС. sudo dnf install -y ./deckhouse-code-<VERSION>.el8.x86_64.rpm # AlmaLinux. sudo dnf install -y ./deckhouse-code-<VERSION>.el9.x86_64.rpm # Ubuntu. sudo apt install -y ./deckhouse-code_<VERSION>_amd64.debЗапустите настройку:
sudo gitlab-ctl reconfigureПроверьте, что не осталось неприменённых миграций, что зашифрованные данные в базе читаются секретами инстанса и что инстанс проходит самопроверку:
sudo gitlab-rake db:migrate:status | grep -w down sudo gitlab-rake gitlab:fe:secret:verify sudo gitlab-rake gitlab:check SANITIZE=trueПервая команда ничего не выводит, когда все миграции применены. Если она выводит миграции, примените их и повторите проверки:
sudo gitlab-rake db:migrate
В командах ниже <GITLAB_HOME> — директория на хосте с томами config, logs и data контейнера GitLab CE.
Создайте резервную копию и скопируйте её за пределы хоста вместе с директорией
<GITLAB_HOME>/config:docker exec -t gitlab gitlab-backup createОстановите и удалите контейнер GitLab CE. Тома — это директории на хосте, они остаются на месте:
docker stop gitlab docker rm gitlabСоздайте контейнер Deckhouse Code на тех же томах, с портами и переменными окружения контейнера GitLab CE:
docker run -d --name code \ --shm-size 256m \ -p 80:80 -p 443:443 -p 22:22 \ -e GITLAB_OMNIBUS_CONFIG="external_url 'https://<HOSTNAME>'" \ -v <GITLAB_HOME>/config:/etc/gitlab \ -v <GITLAB_HOME>/logs:/var/log/gitlab \ -v <GITLAB_HOME>/data:/var/opt/gitlab \ <REGISTRY>/<FLAVOR>:<VERSION>Следите за запуском. Миграции базы данных выполняются во время настройки, и до её окончания инстанс отвечает кодом 502:
docker logs -f codeПроверьте, что не осталось неприменённых миграций, что зашифрованные данные в базе читаются секретами инстанса и что инстанс проходит самопроверку:
docker exec code gitlab-rake db:migrate:status | grep -w down docker exec code gitlab-rake gitlab:fe:secret:verify docker exec code gitlab-rake gitlab:check SANITIZE=trueПервая команда ничего не выводит, когда все миграции применены. Если она выводит миграции, примените их и повторите проверки:
docker exec code gitlab-rake db:migrate
Миграция через архив резервной копии
Данные переносятся в архиве резервной копии, а файлы, которых нет в архиве, копируются отдельно. Deckhouse Code устанавливается заранее, с версией GitLab исходного инстанса и тем же внешним адресом.
Сбор данных GitLab CE
Соберите файлы с инстанса GitLab CE и храните их с той же степенью защиты, что и пароли:
- архив резервной копии;
gitlab-secrets.json— ключи шифрования базы данных; без них теряются настройки двухфакторной аутентификации, токены и зашифрованные переменные CI/CD;gitlab.rb— конфигурация инстанса;- сертификаты и ключи из директории
/etc/gitlab/ssl/; - SSH-ключи хоста: с ними Git-клиенты подключаются к Deckhouse Code по SSH без предупреждения о смене ключа хоста.
- Пакет для ОС Linux
- Omnibus Docker
Создайте резервную копию:
sudo gitlab-backup createАрхив
<BACKUP_NAME>_gitlab_backup.tarзаписывается в/var/opt/gitlab/backups/.Скопируйте за пределы сервера архив, файлы
/etc/gitlab/gitlab.rbи/etc/gitlab/gitlab-secrets.json, директорию/etc/gitlab/ssl/и файлы/etc/ssh/ssh_host_*.
Создайте резервную копию:
docker exec -t gitlab gitlab-backup createАрхив
<BACKUP_NAME>_gitlab_backup.tarзаписывается в<GITLAB_HOME>/data/backups/на хосте.Скопируйте за пределы хоста архив, файлы
gitlab.rbиgitlab-secrets.json, директориюssl/и файлыssh_host_*из<GITLAB_HOME>/config.
Если GitLab CE хранит загруженные файлы, артефакты CI/CD, объекты LFS или пакеты в объектном хранилище, архив их не содержит. Подключите Deckhouse Code к тем же бакетам или скопируйте бакеты в хранилище Deckhouse Code, например командой rclone sync.
<BACKUP_NAME> — имя файла архива без суффикса _gitlab_backup.tar: для архива 1784800000_2026_07_23_19.4.1_gitlab_backup.tar это 1784800000_2026_07_23_19.4.1.
Восстановление в Deckhouse Code
После восстановления в базе данных схема GitLab CE. Команда gitlab-rake db:migrate добавляет в неё таблицы Deckhouse Code.
- Пакет для ОС Linux
- Omnibus Docker
- Helm-чарт
- Модуль Deckhouse Kubernetes Platform
Установите Deckhouse Code, как описано в разделе «Быстрый старт».
Замените
/etc/gitlab/gitlab.rbи/etc/gitlab/gitlab-secrets.jsonфайлами GitLab CE, скопируйте сертификаты и ключи в/etc/gitlab/ssl/и запустите настройку:sudo gitlab-ctl reconfigureСкопируйте SSH-ключи хоста в
/etc/ssh/и перезапустите SSH-сервер:sudo cp ssh_host_* /etc/ssh/ # РЕД ОС, AlmaLinux. sudo systemctl restart sshd # Ubuntu. sudo systemctl restart sshСкопируйте архив в директорию резервных копий и передайте файл пользователю
git:sudo cp <BACKUP_NAME>_gitlab_backup.tar /var/opt/gitlab/backups/ sudo chown git:git /var/opt/gitlab/backups/<BACKUP_NAME>_gitlab_backup.tarОстановите сервисы, которые пишут в базу данных:
sudo gitlab-ctl stop puma sudo gitlab-ctl stop sidekiqВосстановите данные. Команда дважды запрашивает подтверждение: перед пересозданием файла
authorized_keysи перед удалением текущих таблиц базы данных; оба раза ответьтеyes:sudo gitlab-backup restore BACKUP=<BACKUP_NAME>Примените миграции базы данных Deckhouse Code:
sudo gitlab-rake db:migrateПерезапустите инстанс и проверьте его:
sudo gitlab-ctl restart sudo gitlab-rake gitlab:fe:secret:verify sudo gitlab-rake gitlab:check SANITIZE=true
Контейнер читает конфигурацию, секреты и SSH-ключи хоста с тома конфигурации и создаёт ключи хоста, только когда их на томе нет, поэтому файлы помещаются на том до первого запуска.
Поместите файлы GitLab CE в директорию конфигурации на хосте:
gitlab.rb,gitlab-secrets.jsonи файлыssh_host_*— в/srv/code/config/, сертификаты и ключи — в/srv/code/config/ssl/.Создайте контейнер, как описано в разделе «Быстрый старт», и дождитесь окончания первого запуска:
docker logs -f codeСкопируйте архив в директорию резервных копий на томе данных и назначьте ему владельца, от имени которого работает инстанс:
sudo cp <BACKUP_NAME>_gitlab_backup.tar /srv/code/data/backups/ docker exec code chown git:git /var/opt/gitlab/backups/<BACKUP_NAME>_gitlab_backup.tarОстановите сервисы, которые пишут в базу данных:
docker exec code gitlab-ctl stop puma docker exec code gitlab-ctl stop sidekiqВосстановите данные. Команда дважды запрашивает подтверждение: перед пересозданием файла
authorized_keysи перед удалением текущих таблиц базы данных; оба раза ответьтеyes:docker exec -it code gitlab-backup restore BACKUP=<BACKUP_NAME>Примените миграции базы данных Deckhouse Code:
docker exec code gitlab-rake db:migrateПерезапустите контейнер и проверьте инстанс:
docker restart code docker exec code gitlab-rake gitlab:fe:secret:verify docker exec code gitlab-rake gitlab:check SANITIZE=true
Установите Deckhouse Code, как описано в разделе «Быстрый старт»: релиз code в неймспейсе code с настроенным объектным хранилищем для резервных копий.
Преобразуйте раздел
gitlab_railsфайлаgitlab-secrets.jsonв файл секретов Rails и замените им объект Secret релиза:yq -p json -o yaml '{"production": .gitlab_rails}' gitlab-secrets.json > secrets.yml d8 k -n code create secret generic code-rails-secret --from-file=secrets.yml \ --dry-run=client -o yaml | d8 k apply -f -Замените объект Secret с SSH-ключами хоста:
d8 k -n code create secret generic code-gitlab-shell-host-keys --from-file=. \ --dry-run=client -o yaml | d8 k apply -f -Выполните команду в директории, где лежат только файлы
ssh_host_*.Перезапустите поды, чтобы они прочитали новые объекты Secret:
d8 k -n code delete pods -l app=webservice d8 k -n code delete pods -l app=sidekiq d8 k -n code delete pods -l app=gitlab-shellЗагрузите архив в бакет резервных копий — значение
global.appConfig.backups.bucket.Восстановите данные в поде toolbox:
d8 k -n code exec -it deploy/code-toolbox -- backup-utility --restore -t <BACKUP_NAME>Примените миграции базы данных Deckhouse Code:
d8 k -n code exec -it deploy/code-toolbox -- gitlab-rake db:migrateПерезапустите поды и проверьте инстанс:
d8 k -n code delete pods -l app=webservice d8 k -n code delete pods -l app=sidekiq d8 k -n code exec -it deploy/code-toolbox -- gitlab-rake gitlab:fe:secret:verify d8 k -n code exec -it deploy/code-toolbox -- gitlab-rake gitlab:check SANITIZE=true
d8-code. Порядок действий описан в разделе «Миграция» документации модуля; установка GitLab из пакета для ОС Linux, о которой там идёт речь, — это инстанс GitLab CE.После миграции
Если Deckhouse Code работает на другом сервере, направьте DNS-имя инстанса на него, затем проверьте инстанс и завершите перенос:
- Войдите в веб-интерфейс под учётной записью GitLab CE и клонируйте репозиторий по HTTPS и по SSH.
- Установите лицензионный ключ, как описано в разделе «Лицензия». Без ключа инстанс работает в пробном режиме.
- Если внешний адрес изменился, обновите параметр
urlкаждого GitLab Runner в/etc/gitlab-runner/config.tomlи перезапустите раннер командойgitlab-runner restart.
Конвейер сохраняет CI_SERVER_URL, CI_PROJECT_URL и другие переменные CI_* на момент своего создания. Если адрес изменился, повторно запущенное задание конвейера, созданного до миграции, использует старый адрес; запустите новый конвейер.