멀티테넌시 설정

개요

|Fess|의 멀티테넌시 기능을 사용하면 단일 |Fess| 인스턴스에서 여러 테넌트(조직, 부서, 고객 등)를 분리하여 운영할 수 있습니다.

가상 호스트 기능을 사용하여 각 테넌트에 대해:

  • 독립된 검색 UI

  • 분리된 콘텐츠

  • 커스터마이즈된 디자인

을 제공할 수 있습니다.

가상 호스트 기능

가상 호스트는 HTTP 요청의 호스트명에 따라 다른 검색 환경을 제공하는 기능입니다.

구조

  1. 사용자가 ``tenant1.example.com``에 접속

  2. |Fess|가 호스트명 식별

  3. 해당하는 가상 호스트 설정 적용

  4. 테넌트 고유의 콘텐츠와 UI 표시

가상 호스트 헤더 설정

가상 호스트 기능을 활성화하려면 virtual.host.headers 속성을 설정합니다. 이 속성은 ``fess_config.properties``에서 정의합니다.

설정 형식

각 줄에 헤더명:헤더값=가상호스트키 형식으로 지정합니다:

# fess_config.properties
virtual.host.headers=Host:tenant1.example.com=tenant1\n\
Host:tenant2.example.com=tenant2

여러 가상 호스트를 설정하는 경우 줄바꿈으로 구분합니다.

가상 호스트 키 제약

가상 호스트 키에는 다음 제약이 있습니다:

  • 사용 가능한 문자는 영숫자와 밑줄(a-zA-Z0-9_)뿐입니다. 그 외 문자는 자동으로 제거됩니다.

  • 다음 키 이름은 예약어이므로 사용할 수 없습니다: admin, common, error, login, profile

관리 화면에서 설정

크롤 설정

웹 크롤 설정에서 가상 호스트를 지정하여 콘텐츠를 분리할 수 있습니다:

  1. 관리 화면에 로그인

  2. “크롤러” -> “웹”에서 크롤 설정 생성

  3. “가상 호스트” 필드에서 ``virtual.host.headers``에서 정의한 가상 호스트 키를 선택

  4. 이 설정으로 크롤된 콘텐츠는 지정한 가상 호스트에서만 검색 가능

접근 제어

가상 호스트와 역할의 조합

가상 호스트와 역할 기반 접근 제어를 조합하여 더 세밀한 접근 제어가 가능합니다:

크롤 설정에서 가상 호스트와 퍼미션을 함께 설정합니다:

# 크롤 설정의 가상 호스트
tenant1

# 크롤 설정의 퍼미션
{role}tenant1_user

역할 기반 검색

자세한 내용은 :doc:`security-role`를 참조하세요.

UI 커스터마이즈

각 가상 호스트에 대해 UI를 커스터마이즈할 수 있습니다.

테마 적용

가상 호스트별로 다른 테마 적용:

  1. “시스템” -> “디자인”에서 테마 설정

  2. 가상 호스트 설정에서 테마 지정

커스텀 CSS

가상 호스트별로 커스텀 CSS를 적용하려면 관리 화면의 “시스템” -> “디자인”에서 CSS 파일을 편집합니다. 가상 호스트 키에 해당하는 뷰 디렉토리에 커스텀 템플릿을 배치할 수도 있습니다.

라벨 설정

가상 호스트별로 표시할 라벨 제한:

  1. 라벨 유형 설정에서 가상 호스트 지정

  2. 지정한 가상 호스트에서만 라벨이 표시됨

API 인증

가상 호스트별로 API 접근 제어:

액세스 토큰

가상 호스트에 연결된 액세스 토큰 발급:

  1. “시스템” -> “액세스 토큰”에서 토큰 생성

  2. 토큰에 가상 호스트 연결

API 요청

curl -H "Authorization: Bearer TENANT_TOKEN" \
     "https://tenant1.example.com/api/v1/search?q=keyword"

DNS 설정

멀티테넌시를 구현하기 위한 DNS 설정 예:

동일 서버로의 서브도메인

# DNS 설정
tenant1.example.com    A    192.168.1.100
tenant2.example.com    A    192.168.1.100

# 또는 와일드카드
*.example.com          A    192.168.1.100

리버스 프록시 설정

Nginx를 사용한 리버스 프록시 설정 예:

server {
    server_name tenant1.example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    server_name tenant2.example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

데이터 분리

완전한 데이터 분리가 필요한 경우 다음 접근 방식을 검토:

인덱스 레벨 분리

각 테넌트에 별도의 Fess 인스턴스와 인덱스를 사용:

# 테넌트1용 Fess 인스턴스 (fess_config.properties)
index.document.search.index=fess_tenant1.search

# 테넌트2용 Fess 인스턴스 (fess_config.properties)
index.document.search.index=fess_tenant2.search

참고

``index.document.search.index``는 인스턴스당 하나의 값만 설정할 수 있습니다. 인덱스 레벨의 완전한 분리를 위해서는 테넌트별로 별도의 Fess 인스턴스를 실행하거나 커스텀 구현이 필요합니다. 일반적인 멀티테넌시에서는 가상 호스트 기능에 의한 논리적 분리로 충분합니다.

모범 사례

  1. 명확한 명명 규칙: 가상 호스트와 역할에 일관된 명명 규칙 사용

  2. 테스트: 각 테넌트에서의 동작을 충분히 테스트

  3. 모니터링: 테넌트별 리소스 사용량 모니터링

  4. 문서화: 테넌트 설정 문서화

제한 사항

  • 관리 화면은 모든 테넌트에서 공유됩니다

  • 시스템 설정은 모든 테넌트에 영향을 미칩니다

  • 일부 기능은 가상 호스트에 대응하지 않을 수 있습니다

참고 정보