멀티 사이트, 멀티 인스턴스, 멀티테넌시

이 페이지는 여러 Wagtail 사이트를 (동일한 소스 코드로) 실행하는 방법에 대한 배경 정보를 제공합니다.

멀티 사이트

멀티 사이트는 콘텐츠 제작자가 단일 관리자 인터페이스에 들어가 여러 웹사이트의 콘텐츠를 관리하는 Wagtail 프로젝트 구성입니다. 특정 콘텐츠를 관리하고 다른 콘텐츠에 대한 접근을 제한하는 권한은 어느 정도 가능합니다.

멀티 사이트 구성은 단일 서버에서 단일 데이터베이스에 연결되는 단일 코드 베이스입니다. 미디어는 단일 미디어 루트 디렉터리에 저장됩니다. 사이트 간에 콘텐츠를 공유할 수 있습니다.

Wagtail은 멀티 사이트를 기본적으로 지원합니다: Wagtail에는 사이트 모델이 함께 제공됩니다. 사이트 모델에는 호스트 이름, 포트, 루트 페이지 필드가 포함됩니다. URL이 요청되면 요청이 들어오고, 요청 객체에서 도메인 이름과 포트를 가져와 올바른 사이트 객체를 찾습니다. 루트 페이지는 URL을 해석하고 올바른 페이지를 제공하기 위한 시작점으로 사용됩니다.

Wagtail에는 사이트 설정도 함께 제공됩니다. _사이트 설정_은 사이트에 추가 정보를 저장할 수 있게 해주는 ‘싱글톤’입니다. 예를 들어, 소셜 미디어 설정, 로고를 업로드하는 필드 또는 테마를 선택하는 선택 필드 등이 있습니다.

모델 객체는 사이트 객체를 가리키는 외래 키 필드를 모델에 배치하여 사이트에 연결할 수 있습니다. 요청 객체를 사용하여 현재 사이트를 조회할 수 있습니다. 이런 방식으로 특정 사이트에 속한 콘텐츠를 제공할 수 있습니다.

사용자, 그룹, 권한을 구성하여 콘텐츠 제작자가 특정 사이트의 페이지, 이미지, 문서만 관리하도록 할 수 있습니다. Wagtail은 여러 개의 _사이트 객체_와 여러 개의 _페이지 트리_를 가질 수 있습니다. 권한은 특정 페이지 트리 또는 그 하위 섹션에 연결될 수 있습니다. 컬렉션은 이미지와 문서를 분류하는 데 사용됩니다. 컬렉션은 특정 그룹에 속한 사용자에게만 접근이 제한될 수 있습니다.

일부 프로젝트에서는 콘텐츠 편집자가 특정 사이트에 대한 권한을 갖고 다른 사이트에 대한 접근을 제한해야 합니다. 사이트별로 모든 콘텐츠를 분리하고 콘텐츠가 ‘유출’되지 않도록 보장하는 것은 멀티 사이트 프로젝트에서 실현하기 어렵습니다. 콘텐츠의 완전한 분리가 필요하다면 멀티 인스턴스가 더 적합할 수 있습니다…

멀티 인스턴스

멀티 인스턴스는 단일 프로젝트 파일 세트를 여러 웹사이트에서 사용하는 Wagtail 프로젝트 구성입니다. 각 웹사이트는 자체 설정 파일과 전용 데이터베이스 및 미디어 디렉터리를 가집니다. 각 웹사이트는 자체 서버 프로세스에서 실행됩니다. 이는 _모든 콘텐츠_의 _완전한 분리_를 보장합니다.

a.com과 b.com 도메인이 있다고 가정해 봅시다. 설정 파일은 base.py, acom.py, bcom.py 가 될 수 있습니다. 기본 설정에는 평소와 같이 모든 설정이 포함됩니다. 사이트별 설정의 내용은 기본 설정을 덮어씁니다:

# settings/acom.py

from base import * # noqa

ALLOWED_HOSTS = ['a.com']
DATABASES["NAME"] = "acom"
DATABASES["PASSWORD"] = "password-for-acom"
MEDIA_DIR = BASE_DIR / "acom-media"

각 사이트는 자체 설정 파일로 시작할 수 있습니다. 개발 환경에서는 ./manage.py runserver --settings settings.acom 명령어를 사용합니다. 프로덕션 환경에서는 예를 들어 uWSGI를 사용할 때 env = DJANGO_SETTINGS_MODULE=settings.acom 으로 올바른 설정을 지정합니다.

각 사이트가 자체 데이터베이스와 미디어 폴더를 가지고 있기 때문에 다른 사이트로 아무것도 ‘유출’될 수 없습니다. 하지만 이는 멀티 사이트 옵션을 사용할 때처럼 사이트 간에 콘텐츠를 공유할 수 없다는 의미이기도 합니다.

이 구성에서는 여러 사이트가 동일한 단일 프로젝트 파일 세트를 공유합니다. 배포 시에는 단일 프로젝트 파일 세트를 업데이트하고 각 인스턴스를 다시 로드하게 됩니다.

이 멀티 인스턴스 구성은 프로젝트 코드를 여러 번 배포하는 것과 크게 다르지 않습니다. 하지만 단일 프로젝트 파일 세트를 가지고 설정 파일로만 구분하는 것이 Wagtail이 진정한 멀티테넌시에 가장 가깝게 다가갈 수 있는 방법입니다. 모든 사이트는 동일하며, 사용자 관리를 포함한 콘텐츠가 분리됩니다. ‘새 테넌트 추가’는 새 설정 파일을 추가하고 새 인스턴스를 실행하는 것입니다.

멀티 인스턴스 구성에서는 각 인스턴스가 일정량의 서버 리소스(CPU 및 메모리)를 필요로 합니다. 이는 사이트를 추가하면 서버 부하가 증가한다는 것을 의미합니다. 이는 특정 지점까지만 확장 가능합니다.

멀티테넌시

멀티테넌시는 단일 소프트웨어 인스턴스가 여러 테넌트에게 서비스를 제공하는 프로젝트 구성입니다. 테넌트는 단일 사이트에 대한 접근 및 권한을 가진 사용자 그룹입니다. 멀티테넌트 소프트웨어는 모든 테넌트에게 자체 구성, 데이터, 사용자 관리를 제공하도록 설계되었습니다.

Wagtail은 사용자 관리와 콘텐츠가 공유되는 _멀티 사이트_를 지원합니다. Wagtail은 여러 인스턴스를 실행하는 비용으로 콘텐츠가 완전히 분리되는 _멀티 인스턴스_를 실행할 수 있습니다. 멀티테넌시는 두 세계의 장점을 결합합니다: 단일 인스턴스와 사이트별 콘텐츠 및 사용자 관리의 완전한 분리입니다.

Wagtail은 현재 완전한 멀티테넌시를 지원하지 않습니다. 하지만 저희의 계획에 있으며, 기존 멀티 사이트 옵션을 계속 지원하면서 멀티테넌시를 추가하기 위해 Wagtail을 개선하고자 합니다. 아이디어가 있거나 기여하고 싶다면, Slack의 multi-tenancy 채널에 참여해 주세요.

Wagtail은 현재 멀티테넌시를 지원하기 위해 다음과 같은 기능을 갖추고 있습니다:

  • 호스트 이름을 루트 페이지에 매핑하는 사이트 모델

  • 사용자 그룹이 다음을 관리할 수 있도록 하는 권한:

    • 페이지 트리의 임의 섹션

    • 컬렉션 트리의 섹션 (곧 제공 예정)

    • 하나 이상의 문서 및 이미지 컬렉션

  • 페이지 API는 요청에 사용된 호스트에 자동으로 범위가 지정됩니다

하지만 몇 가지 기능은 현재 멀티테넌시를 지원하지 않습니다:

  • 스니펫은 전역적인 콘텐츠 조각이므로 멀티테넌시에 적합하지 않지만, 스니펫으로 등록할 수 있는 모든 모델은 Wagtail 모델 어드민을 통해 관리할 수도 있습니다. 모델에 site_id를 추가한 다음 모델 어드민의 get_queryset 메서드를 사용하여 각 객체를 관리할 수 있는 사이트를 결정할 수 있습니다. 내장된 스니펫 선택기는 쿼리셋을 필터링하여 어떤 사이트가 어떤 객체를 표시할 수 있는지 제한할 수 있는 modelchooser로 대체할 수 있습니다.

  • 사이트, 사이트 설정, 사용자 및 그룹 관리. 현재로서는 슈퍼유저만 이러한 객체를 관리하도록 허용하는 것이 최선입니다.

  • 워크플로 및 워크플로 작업

  • 사이트 기록

  • 리디렉션

사이트, 사이트 설정, 사용자와 같은 내장 모델에 대한 권한 구성은 사이트별로 지정되지 않으므로, 단일 항목을 편집할 권한이 있는 모든 사용자는 모든 항목을 편집할 수 있습니다. 이 제한은 슈퍼유저만 이러한 모델을 관리하도록 허용함으로써 대부분 해결할 수 있습니다.

Python, Django, Wagtail은 기능을 재정의(override), 확장, 사용자 정의할 수 있도록 지원합니다. 사이트를 위한 멀티테넌시 솔루션을 만드는 데 도움이 될 수 있는 몇 가지 아이디어는 다음과 같습니다:

  • Django는 템플릿 재정의를 허용하며, 이는 Wagtail 어드민에서도 작동합니다.

  • 사용자 정의 사용자 모델을 사용하여 사용자를 특정 사이트에 연결할 수 있습니다.

  • 사용자 정의 어드민 뷰를 통해 더 제한적인 사용자 관리를 제공할 수 있습니다.

Wagtail 커뮤니티의 관심 있는 분들이 코드와 아이디어를 기여해 주시기를 환영합니다.