애플리케이션 제한은 개발을 제한합니다.

이 문서는 GitLab에 애플리케이션 제한을 추가하는 기여자를 위한 개발 가이드를 제공합니다.

문서

우선, 서로 다른 GitLab 티어에 대해 설정된 다양한 제한을 수집하고 결정해야 합니다. 문서화를 위해 다른 사람들과 협조하고 이러한 제한 사항을 전달하세요.

애플리케이션 제한 도입에 관한 가이드가 있습니다.

계획 제한 구현

데이터베이스 계획 제한 추가

plan_limits 테이블에서 새 열을 만들고 제한 값을 삽입하세요. 두 개의 별도 마이그레이션 스크립트 파일을 만드는 것이 좋습니다.

  1. 원하는 제한을 나타내는 기본값으로 새 열을 plan_limits 테이블에 추가하세요. 예:

    add_column(:plan_limits, :project_hooks, :integer, default: 100, null: false)
    

    제한이 0로 설정된 plan_limits 항목은 제한이 활성화되지 않음을 의미합니다. 이 설정은 특별하고 문서화된 상황에서만 사용해야 합니다.

  2. (선택 사항) 각 수준을 원하는 제한으로 미세 조정하는 데이터베이스 마이그레이션을 만드세요. create_or_update_plan_limit 마이그레이션 헬퍼를 사용하세요. 예:

    class InsertProjectHooksPlanLimits < Gitlab::Database::Migration[2.1]
      def up
        create_or_update_plan_limit('project_hooks', 'default', 0)
        create_or_update_plan_limit('project_hooks', 'free', 10)
        create_or_update_plan_limit('project_hooks', 'bronze', 20)
        create_or_update_plan_limit('project_hooks', 'silver', 30)
        create_or_update_plan_limit('project_hooks', 'premium', 30)
        create_or_update_plan_limit('project_hooks', 'premium_trial', 30)
        create_or_update_plan_limit('project_hooks', 'gold', 100)
        create_or_update_plan_limit('project_hooks', 'ultimate', 100)
        create_or_update_plan_limit('project_hooks', 'ultimate_trial', 100)
      end
         
      def down
        create_or_update_plan_limit('project_hooks', 'default', 0)
        create_or_update_plan_limit('project_hooks', 'free', 0)
        create_or_update_plan_limit('project_hooks', 'bronze', 0)
        create_or_update_plan_limit('project_hooks', 'silver', 0)
        create_or_update_plan_limit('project_hooks', 'premium', 0)
        create_or_update_plan_limit('project_hooks', 'premium_trial', 0)
        create_or_update_plan_limit('project_hooks', 'gold', 0)
        create_or_update_plan_limit('project_hooks', 'ultimate', 0)
        create_or_update_plan_limit('project_hooks', 'ultimate_trial', 0)
      end
    end
    

    일부 계획은 GitLab.com에서만 존재합니다. 존재하지 않는 계획에 대해서는 작동하지 않습니다.

계획 제한 유효성 검사

현재 제한 가져오기

프로젝트나 네임스페이스를 통해 현재 제한에 액세스할 수 있습니다. 예:

project.actual_limits.project_hooks

현재 제한 확인

현재 제한이 초과되었는지 확인하기 위해 PlanLimits#exceeded? 메서드가 있습니다. ActiveRecord 객체나 Integer를 사용할 수 있습니다.

레코드의 수가 정의된 제한을 초과하지 않도록 보장합니다. 예:

project.actual_limits.exceeded?(:project_hooks, ProjectHook.where(project: project))

숫자가 정의된 제한을 초과하지 않도록 보장합니다. 예:

project.actual_limits.exceeded?(:project_hooks, 10)

Limitable 관련

Limitable concern를 사용하여 모델이 제한을 초과하지 않도록 유효성을 검사할 수 있습니다. 현재 모델의 레코드 수가 정의된 제한을 초과하지 않도록 보장합니다.

유효성을 검사할 객체의 제한 범위와 복수화된 모델 이름이 다른 경우 해당 이름을 지정해야 합니다.

class ProjectHook
  include Limitable
  
  self.limit_name = 'project_hooks' # 선택 사항으로 ProjectHook은 project_hooks와 일치합니다.
  self.limit_scope = :project
end

모델을 테스트하려면 공통 예제를 포함할 수 있습니다.

it_behaves_like 'includes Limitable concern' do
  subject { build(:project_hook, project: create(:project)) }
end

인스턴스 전체 제한 테스트

인스턴스 전체 기능은 항상 default 계획을 사용하므로 라이선스가 할당되지 않습니다.

class InstanceVariable
  include Limitable
  
  self.limit_name = 'instance_variables' # 선택 사항으로 InstanceVariable은 instance_variables와 일치합니다.
  self.limit_scope = Limitable::GLOBAL_SCOPE
end

구독 계획

Self-Managed형:

  • default: 모든 사람.

GitLab.com:

  • default: 시스템 전체 기능.
  • free: 무료 구독이 있는 네임스페이스 및 프로젝트.
  • bronze: 브론즈 구독이 있는 네임스페이스 및 프로젝트. 이 티어는 더 이상 구매할 수 없습니다.
  • silver: Premium 구독이 있는 네임스페이스 및 프로젝트.
  • premium: Premium 구독이 있는 네임스페이스 및 프로젝트.
  • premium_trial: Premium 체험 구독이 있는 네임스페이스 및 프로젝트.
  • gold: Ultimate 구독이 있는 네임스페이스 및 프로젝트.
  • ultimate: Ultimate 구독이 있는 네임스페이스 및 프로젝트.
  • ultimate_trial: Ultimate 체험 구독이 있는 네임스페이스 및 프로젝트.
  • opensource: GitLab 오픈 소스 프로그램의 구성원인 네임스페이스 및 프로젝트.

test 환경에는 계획이 없습니다.

Rack::Attack 사용하여 요금 제한 구현

우리는 Rack::Attack 미들웨어를 사용하여 Rack 요청을 제한합니다. 이는 Rails 컨트롤러, Grape 엔드포인트 및 기타 Rack 요청에 적용됩니다.

새로운 스로틀을 추가하는 절차는 대략 다음과 같습니다.

  1. ApplicationSetting 모델의 rate_limits JSONB 열에 새 필드를 추가합니다.
  2. rate_limits 열의 JSON 스키마 유효성 검증기를 업데이트합니다.
  3. 새로운 요금 제한을 구성하고 원하는 요청에 적용하기 위해 Gitlab::RackAttackGitlab::RackAttack::Request를 확장합니다.
  4. app/views/admin/application_settings/_ip_limits.html.haml에서 새 설정을 추가합니다.
  5. 사용자 및 IP 요금 제한애플리케이션 설정 API에서 새로운 설정을 문서화합니다.
  6. GitLab.com의 요금 제한을 구성하고 GitLab.com별 요금 제한에서 문서화합니다.

구현 세부 정보는 다음 이슈를 참조하세요.

Gitlab::ApplicationRateLimiter 사용하여 요금 제한 구현

이 모듈은 특정 액션을 제한하는데 사용할 수 있는 사용자 정의 요금 제한기를 구현합니다. 미들웨어 수준에서 작동하는 Rack::AttackRack::Throttle와 달리 컨트롤러나 API 수준에서 직접 호출할 수 있습니다.

컨트롤러에서 사용하는 방법에 대한 CheckRateLimit concern를 참조하세요. 코드의 다른 부분에서 Gitlab::ApplicationRateLimiter 모듈을 직접 호출할 수 있습니다.

다음 속도 제한 아키텍처

2022년 5월, 우리는 애플리케이션 제한 프레임워크의 다음 버전에 대한 작업을 시작했습니다. 전방을 바라보는 속도 제한 아키텍처를 사용하여.

저희는 새로운 요구 사항을 정의하고 다음 아키텍처를 설계하는 작업 중이므로, 새로운 제한을 추가하는 대신에 속도 제한 아키텍처 워킹 그룹에 기여하는 것을 고려해 주세요.

다음 속도 제한 아키텍처에 구축할 수 있는 기능 예시:

  1. 네임스페이스 / 플랜 단위로 제한을 정의하고 재정의할 수 있도록 만들기.
  2. 구현된 제한과 기본값에 대한 자동 문서화 생성.
  3. 찾아볼 수 있는 한 곳에 제한 정의.
  4. 제한에 접근할 때 사용자에게 알림을 지원하는 소프트 및 하드 제한.