업로드 마이그레이션 Rake 작업

Tier: Free, Premium, Ultimate Offering: Self-managed

다른 리포지터리 유형 간에 업로드를 마이그레이션하는 Rake 작업이 있습니다.

객체 리포지터리로 마이그레이션

GitLab에 업로드를 위한 객체 리포지터리를 구성한 후, 기존 업로드를 로컬 리포지터리에서 원격 리포지터리로 마이그레이션하려면 이 작업을 사용하세요.

모든 처리는 백그라운드 워커에서 이루어지며 다운타임이 필요하지 않습니다.

GitLab과 함께 객체 리포지터리 사용에 대해 자세히 알아보기.

All-in-one Rake task

GitLab은 한 단계로 모든 업로드 파일(예: 아바타, 로고, 첨부 파일 및 파비콘)을 객체 리포지터리로 마이그레이션하는 래퍼 Rake 작업을 제공합니다. 래퍼 작업은 각 카테고리에 속하는 파일을 하나씩 마이그레이션하기 위해 개별 Rake 작업을 호출합니다.

개별 Rake 작업은 다음 섹션에서 설명합니다.

모든 업로드를 로컬 리포지터리에서 객체 리포지터리로 마이그레이션하려면 다음을 실행하세요.

  • Linux 패키지 설치:

    gitlab-rake "gitlab:uploads:migrate:all"
    
  • 자체 컴파일된 설치:

    sudo RAILS_ENV=production -u git -H bundle exec rake gitlab:uploads:migrate:all
    

선택적으로 진행 상황을 추적하고 모든 업로드가 성공적으로 마이그레이션되었는지 확인하려면 PostgreSQL 콘솔를 사용하세요:

  • GitLab 14.1 및 이전 버전을 실행 중인 Linux 패키지 설치에서:

    sudo gitlab-rails dbconsole

  • GitLab 14.2 이상 버전을 실행 중인 Linux 패키지 설치에서:

    sudo gitlab-rails dbconsole --database main

  • 자체 컴파일된 설치에서:

    sudo -u git -H psql -d gitlabhq_production

아래 objectstg (여기서 store=2)에 모든 아티팩트 수가 있는지 확인하세요:

gitlabhq_production=# SELECT count(*) AS total, sum(case when store = '1' then 1 else 0 end) AS filesystem, sum(case when store = '2' then 1 else 0 end) AS objectstg FROM uploads;

total | filesystem | objectstg
------+------------+-----------
   2409 |          0 |      2409

uploads 폴더에 디스크에 파일이 없는지 확인하세요.

sudo find /var/opt/gitlab/gitlab-rails/uploads -type f | grep -v tmp | wc -l

개별 Rake 작업

이미 all-in-one Rake 작업을 실행한 경우 이러한 개별 작업을 실행할 필요가 없습니다.

이 Rake 작업은 마이그레이션할 업로드를 찾기 위해 세 가지 매개변수를 사용합니다:

매개변수 유형 설명
uploader_class 문자열 마이그레이션할 업로더 유형.
model_class 문자열 마이그레이션할 모델 유형.
mount_point 문자열/심볼 업로더가 장착된 모델의 열 이름.
note
이러한 매개변수는 주로 GitLab의 구조 내부에 있으며 작업 디렉터리을 대신 참조하길 권장합니다. 이러한 개별 작업을 실행한 후에는 all-in-one Rake 작업을 실행하여 디렉터리된 유형에 포함되지 않은 업로드를 마이그레이션할 것을 권장합니다.

이 작업은 기본 배치 크기를 재정의하는 데 사용할 수 있는 환경 변수도 허용합니다:

변수 유형 설명
BATCH 정수 배치의 크기를 지정합니다. 기본값은 200입니다.

다음은 각 유형의 업로드에 대해 gitlab:uploads:migrate를 실행하는 방법입니다.

Linux 패키지 (Omnibus)
# gitlab-rake gitlab:uploads:migrate[uploader_class, model_class, mount_point]

# 아바타
gitlab-rake "gitlab:uploads:migrate[AvatarUploader, Project, :avatar]"
gitlab-rake "gitlab:uploads:migrate[AvatarUploader, Group, :avatar]"
gitlab-rake "gitlab:uploads:migrate[AvatarUploader, User, :avatar]"

# 첨부 파일
gitlab-rake "gitlab:uploads:migrate[AttachmentUploader, Note, :attachment]"
gitlab-rake "gitlab:uploads:migrate[AttachmentUploader, Appearance, :logo]"
gitlab-rake "gitlab:uploads:migrate[AttachmentUploader, Appearance, :header_logo]"

# 파비콘
gitlab-rake "gitlab:uploads:migrate[FaviconUploader, Appearance, :favicon]"

# 마크다운
gitlab-rake "gitlab:uploads:migrate[FileUploader, Project]"
gitlab-rake "gitlab:uploads:migrate[PersonalFileUploader, Snippet]"
gitlab-rake "gitlab:uploads:migrate[NamespaceFileUploader, Snippet]"
gitlab-rake "gitlab:uploads:migrate[FileUploader, MergeRequest]"

# 디자인 관리 디자인 썸네일
gitlab-rake "gitlab:uploads:migrate[DesignManagement::DesignV432x230Uploader, DesignManagement::Action, :image_v432x230]"
자체 컴파일 (소스)

모든 작업에 대해 RAILS_ENV=production 사용합니다.

# sudo -u git -H bundle exec rake gitlab:uploads:migrate

# 아바타
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[AvatarUploader, Project, :avatar]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[AvatarUploader, Group, :avatar]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[AvatarUploader, User, :avatar]"

# 첨부 파일
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[AttachmentUploader, Note, :attachment]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[AttachmentUploader, Appearance, :logo]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[AttachmentUploader, Appearance, :header_logo]"

# 파비콘
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[FaviconUploader, Appearance, :favicon]"

# 마크다운
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[FileUploader, Project]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[PersonalFileUploader, Snippet]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[NamespaceFileUploader, Snippet]"
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[FileUploader, MergeRequest]"

# 디자인 관리 디자인 썸네일
sudo -u git -H bundle exec rake "gitlab:uploads:migrate[DesignManagement::DesignV432x230Uploader, DesignManagement::Action]"

로컬 스토리지로 이전

만약 어떤 이유로든 객체 스토리지를 비활성화해야 한다면, 먼저 데이터를 객체 스토리지에서 로컬 스토리지로 이전해야 합니다.

caution
확장된 다운타임이 필요하여 마이그레이션 중에 객체 스토리지에 새 파일이 생성되지 않습니다. 객체 스토리지에서 로컬 파일로 마이그레이션하면 구성 변경을 위한 짧은 다운타임만 필요한 구성 설정이 이 이슈에서 추적됩니다.

올인원 Rake 작업

GitLab은 모든 업로드된 파일(예: 아바타, 로고, 첨부 파일 및 파비콘)을 한 단계로 로컬 스토리지로 마이그레이션하는 래퍼 Rake 작업을 제공합니다. 래퍼 작업은 여기에 속한 각각의 카테고리에 속하는 파일들을 하나씩 마이그레이션하기 위해 개별 Rake 작업을 호출합니다.

이러한 Rake 작업에 대한 자세한 내용은 개별 Rake 작업을 참조하세요. 이 경우의 작업 이름은 gitlab:uploads:migrate_to_local입니다.

객체 스토리지에서 로컬 스토리지로 업로드를 마이그레이션하려면 다음 Rake 작업을 실행하세요:

  • Linux 패키지 설치:

    gitlab-rake "gitlab:uploads:migrate_to_local:all"
    
  • 자체 컴파일된 설치:

    sudo RAILS_ENV=production -u git -H bundle exec rake gitlab:uploads:migrate_to_local:all
    

Rake 작업을 실행한 후 객체 스토리지 구성을 되돌려 객체 스토리지를 비활성화할 수 있습니다.