메인 콘텐츠로 건너뛰기
단일 AgentEye 배포는 완전히 격리된 여러 조직(테넌트)을 지원하므로, 하나의 인스턴스에서 서로 다른 팀, 사업부, 또는 고객을 호스팅하면서 각 테넌트의 데이터가 다른 테넌트에 노출되지 않도록 합니다. 모든 데이터 행(이벤트, 평가, 세션, 대시보드, 저장된 쿼리, 알림, API 키, 멤버)은 정확히 하나의 조직에 속합니다. 기본 격리는 애플리케이션 코드에서 강제됩니다. 모든 요청은 명시적인 org_id 조건으로 해당 조직에 범위가 지정됩니다. 대용량 이벤트와 평가가 저장되는 ClickHouse에서는 엔진 수준의 강력한 격리가 적용됩니다. 각 조직은 조직별 행 정책이 있는 전용 읽기 전용 ClickHouse 사용자를 가지므로, 신뢰할 수 없는 분석 SQL도 다른 테넌트의 행을 읽을 수 없습니다. PostgreSQL에서는 읽기 전용 쿼리 경로(/queries/run)에 행 수준 보안이 추가적인 방어 계층을 제공하여, 애플리케이션 수준 필터가 누락되더라도 해당 경로에서 볼 수 있는 데이터를 제한합니다. 서버의 쓰기 연결은 테이블 소유자로 실행되므로 동일한 앱 수준 org_id 범위 지정을 통해 작동합니다. 테넌트 생명 주기는 운영자가 관리하며, 멤버가 일상적으로 수행하는 모든 작업은 대시보드에서 셀프 서비스로 처리됩니다. 조직과 그 멤버십은 서버 이미지 내에 포함되어 기존 서버 파드 내부에서 실행되는 agenteye-orgctl CLI로 생성 및 관리됩니다. 테넌트 생성 및 삭제는 의도적으로 대시보드와 HTTP API에서 제외됩니다. 테넌트 생명 주기를 위한 HTTP API나 대시보드 버튼은 존재하지 않으며, 애플리케이션 표면이 아닌 클러스터/파드 셸 접근을 통해서만 수행할 수 있습니다. 조직 내에서 멤버는 대시보드와 API를 통해 모든 작업을 수행합니다. 로그인, 소속 조직 간 전환, 자신의 API 키 관리, 대시보드 및 저장된 쿼리 구성, 조직의 알림 설정 등이 가능합니다. 역할 구분이 명확합니다. 운영자는 CLI를 통해 테넌트와 멤버를 프로비저닝하고 해제하며, 멤버는 UI를 통해 테넌트 내의 모든 작업을 수행합니다.
단일 테넌트 배포에서는 이 내용이 필요하지 않습니다. 단일 테넌트 설치는 별도의 운영자 작업 없이 실행됩니다. 모든 데이터, 사용자, 키는 자동으로 프로비저닝되는 기본 default 조직에 저장됩니다. 두 번째 조직을 추가하려는 경우에만 이 가이드가 필요합니다.

사전 요구 사항

두 번째 조직을 생성하기 전에(기본 내장 default 조직은 별도 작업 불필요):
  • PostgreSQL 15+. 조직-멤버십 스키마는 PostgreSQL 15+에서 필요한 컬럼 목록 ON DELETE SET NULL 외래 키를 사용합니다. 두 번째 조직을 프로비저닝하기 전에 PostgreSQL을 업그레이드하세요.
  • 강력하고 안정적인 ORG_CH_SECRET. 각 조직의 ClickHouse 비밀번호는 HMAC(ORG_CH_SECRET, org_id)로 파생되므로, 공개적으로 알려진 기본 개발 값을 사용하면 조직별 자격 증명이 외부에 노출될 수 있습니다. agenteye-orgctl org createORG_CH_SECRET가 설정되지 않았거나 기본 개발 값으로 남아 있는 경우 실행을 거부합니다. 먼저 고유한 값을 설정하세요(배포 → 환경 변수 및 Kubernetes의 경우 Kubernetes 가이드 §2.6 참고). 모든 서버 레플리카에서 동일한 값을 유지하고 임의로 변경하지 마세요. 변경하면 다음 시작 시 재프로비저닝될 때까지 모든 조직의 ClickHouse 사용자가 고아 상태가 됩니다.

CLI 실행

agenteye-orgctl서버와 동일한 이미지에 포함됩니다(agenteye-server와 함께). 별도의 파드, Job, 또는 Deployment를 배포할 필요가 없으며, 이미 실행 중인 서버 파드 내부에서 exec으로 실행합니다. 따라서 서버가 사용하는 것과 동일한 DATABASE_URL, CLICKHOUSE_URL, ORG_CH_SECRET을 읽습니다. Kubernetes:
Docker Compose:
아래 예시는 간결함을 위해 agenteye-orgctl <args> 형태로 표시합니다. 실제 사용 시 배포 환경에 맞게 위의 두 줄 중 하나를 앞에 붙이세요.

명령어 참조

조직

명령어설명
org create --slug <slug> --name <name>새 조직을 생성합니다. ORG_CH_SECRET이 설정되지 않았거나 기본 개발 값으로 남아 있는 경우 실행을 거부합니다(먼저 고유한 값을 설정하세요, 사전 요구 사항 참고). 조직의 읽기 전용 ClickHouse 사용자와 행 정책을 프로비저닝합니다.
org list모든 조직(slug, 이름, 생명 주기 상태)을 나열합니다.
org rename --slug <slug> --name <new name>조직의 표시 이름을 변경합니다. URL과 키에 사용되는 slug는 변경되지 않습니다.
org delete --slug <slug>조직을 소프트 삭제하고 ClickHouse 사용자를 삭제합니다. 데이터는 보존됩니다. 접근 권한을 취소하고 조직별 ClickHouse 자격 증명을 해제하지만, 이벤트를 삭제하지는 않습니다. 운영자가 되돌릴 수 있으며, 삭제 전 안전한 첫 번째 단계입니다.
org purge --slug <slug>되돌릴 수 없는 데이터 삭제. 조직이 이미 delete 상태여야 합니다. 기본 내장 default 조직에는 절대 허용되지 않습니다. 테넌트의 데이터를 완전히 삭제해야 할 때만 사용하세요.

멤버

명령어설명
member add --org <slug> --email <email> [--set <permission-set>] [--add perm1,perm2] [--remove perm3] [--protected]조직에 멤버를 추가합니다. 선택적으로 기본 제공 권한 세트에서 시작하여 개별 권한을 추가/제거할 수 있습니다. --protected는 대시보드에서 멤버를 제거하거나 권한을 낮출 수 없도록 고정합니다(아래 참고). 새 멤버는 첫 번째 대시보드 로그인 시 OTP를 받습니다.
member list --org <slug>조직의 멤버를 나열합니다. 출력 컬럼은 EMAIL, SET(멤버가 시작한 기본 제공 세트, 또는 -), PROT(멤버의 보호 여부), PERMISSIONS(유효 권한)입니다. 이메일 뒤에 *가 표시된 경우 인스턴스 관리자로 모든 조직에 접근할 수 있습니다.
member update --org <slug> --email <email> [--set ...] [--add ...] [--remove ...] [--protected | --unprotect]멤버의 권한 및/또는 보호 플래그를 변경합니다. --set은 기본 제공 세트로 대체하고, --add / --remove는 개별 권한을 조정하며, --protected / --unprotect는 보호를 전환합니다. --protected/--unprotect만 전달하면(권한 플래그 없이) 보호만 변경되고 기존 권한은 그대로 유지됩니다.
member remove --org <slug> --email <email>조직에서 멤버를 제거합니다. 멤버가 보호 상태인 경우 거부됩니다. 먼저 --unprotect를 적용하세요. (한 사람이 여러 조직의 멤버일 수 있으며, 이 명령은 지정된 조직에만 영향을 줍니다.)
한 사람이 서로 다른 권한으로 여러 조직의 멤버가 될 수 있습니다. 예를 들어 한 조직에서는 관리자이고 다른 조직에서는 읽기 전용일 수 있습니다. 각 멤버십은 조직별로 독립적으로 관리됩니다. 한 조직에서 권한을 부여하거나 변경해도 다른 조직의 멤버십에는 영향을 주지 않습니다.

보호된 멤버 (제거 불가능한 조직 관리자)

보호 기능은 조직이 실수로 자기 관리 권한을 잃지 않도록 보장합니다. 기본적으로 조직의 관리자는 대시보드의 셀프 서비스 사용자 페이지에서 서로를 추가하고 제거할 수 있으므로, 마지막 관리자를 제거하여 관리할 수 있는 사람이 없는 조직이 될 수 있습니다. 사용자 페이지: 각 대시보드 사용자의 이메일, 부여된 권한, 편집/비활성화 컨트롤이 있는 카드 이를 방지하려면 멤버 하나를 보호 상태로 표시하세요:
보호된 멤버는 대시보드를 통해 제거하거나 권한을 낮출 수 없으며, 해당 작업을 시도하면 오류가 반환됩니다. 운영자만 변경할 수 있고, 오직 이 CLI를 통해서만 가능합니다. 먼저 member update --org acme --email owner@acme.example --unprotect를 실행한 후 제거하거나 권한을 낮추세요. 이를 통해 모든 조직에 조직 멤버가 잠글 수 없는 최소 하나의 관리자가 유지되면서, 테넌트 제어는 운영자 전용으로 유지됩니다. 보호는 조직별로 적용되며, 한 조직에서 누군가를 보호해도 다른 조직의 멤버십에는 영향을 주지 않습니다.

기본 제공 권한 세트

--set은 조직별로 적용되는 세 가지 기본 제공 세트 중 하나를 허용합니다:
세트대상
admin조직 내 전체 접근 권한. 조직의 API 키와 사용자 관리를 포함합니다.
standard일상적인 사용: 쿼리 읽기 및 실행, 대시보드 구성, 인시던트 확인.
read-only조직의 데이터와 대시보드에 대한 보기 전용 접근.
--set으로 세트를 선택한 후, API Keys에 나열된 개별 권한 토큰을 사용하여 --add / --remove로 세부 조정하세요. 권한 토큰은 API 키에 사용되는 것과 동일합니다.

실습 예시

acme 테넌트를 프로비저닝하고, 첫 번째 관리자를 추가하고, 키를 발급한 후 조직을 해제합니다. 1. 조직 생성 (ORG_CH_SECRET이 설정되지 않았거나 기본 개발 값이 아닌 강력하고 안정적인 값으로 미리 설정되어야 합니다):
2. 첫 번째 멤버를 조직 관리자로 추가:
Alice는 처음 대시보드에 로그인할 때 OTP를 받습니다. 이후에는 조직의 URL 접두사(예: /acme/sessions) 아래에서 UI를 통해 모든 작업을 수행합니다. 3. 조직별 API 키 발급 (대시보드에서): 운영자는 CLI에서 조직별 데이터 키를 발급하지 않습니다. Alice(또는 keys:create 권한이 있는 조직 멤버)가 대시보드의 Keys 페이지에서 acme 조직의 수집기/대시보드 키를 생성합니다. 그녀가 생성하는 모든 키는 자동으로 해당 조직으로 스탬프가 찍히며, acme의 데이터만 읽거나 쓸 수 있습니다. API Keys를 참고하세요. 4. 나중에 멤버 조정:
5. 조직 소프트 삭제 (접근 취소 + ClickHouse 사용자 삭제; 데이터 보존):
6. 조직 퍼지 (되돌릴 수 없음; 소프트 삭제 이후에만; default 조직 불가):
Docker Compose를 사용하는 경우 각 kubectl -n agenteye exec deploy/server -- 접두사를 docker compose exec server로 대체하세요.

책임 분담

조직 멤버가 일상적으로 필요한 모든 것은 대시보드와 API에서 셀프 서비스로 제공되며, 현재 조직으로 자동 범위가 지정됩니다:
  • 조직별 API 키는 대시보드에서 조직 멤버가 생성하고 관리합니다(또는 keys:create를 가진 키를 사용하여 키 API를 통해). CLI는 데이터 키를 발급하지 않습니다. API Keys를 참고하세요.
  • 조직 전환은 대시보드에 내장되어 있으며, 멤버는 조직 전환기에서 소속 조직 간에 전환할 수 있고, 조직 범위의 페이지는 /<org-slug>/… 아래에 있습니다.
  • 대시보드, 저장된 쿼리, 알림, 모든 데이터 사용은 UI와 API에서 전적으로 이루어지며, 멤버의 현재 조직으로 범위가 지정됩니다.
agenteye-orgctl을 사용하는 운영자는 조직 + 멤버 생명 주기만 소유합니다. 조직 생성/이름 변경/삭제/퍼지, 멤버 추가/나열/업데이트/제거가 해당됩니다.

참고 항목

  • 배포: ORG_CH_SECRET 및 기타 서버 환경 설정.
  • Kubernetes 배포: §2.6에서 첫 번째 멀티 테넌트 조직 전에 agenteye-org-ch-secret Secret을 생성합니다.
  • API Keys: 조직별 키 모델과 --add / --remove에 사용되는 권한 토큰.
  • 문제 해결: 멀티 테넌트 프로비저닝 및 ClickHouse 격리 문제.