Discourse가 스타일이 다른 두 웹사이트의 공유 포럼을 지원할 수 있나요?

디스코urs 커뮤니티 여러분께,

저는 블로그와 포트폴리오라는 두 개의 별도 웹사이트를 위한 공유 포럼을 만드는 가능성을 검토하고 있습니다. 하나의 포럼 데이터베이스가 두 사이트를 모두 서비스하여, 사용자가 두 커뮤니티 간에 공유되고 주제도 함께 활용되도록 하는 개념입니다. 다만, 사용자가 방문하는 사이트에 따라 포럼의 스타일이 달라지도록 하여, 더 큰 공유 공간의 일부이면서도 각 커뮤니티가 고유한 느낌을 갖도록 하기를 원합니다.

저는 웹 개발 배경이 있지만, 최근에는 이 규모의 큰 프로젝트를 다루지 않았습니다. 이 프로젝트를 성공적으로 완수하기 위해 필요한 것을 다시 배울 의향이 있지만, 디스코urs가 이를 실현할 수 있는지 여부에 대한 조언을 구하고 싶습니다.

구체적으로 궁금한 사항은 다음과 같습니다:

  1. 디스코urs가 참조 도메인이나 URL에 따라 다른 테마나 스타일을 지원할 수 있나요?
  2. 사용자 데이터베이스와 주제 풀은 공유하되, 디스코urs를 커스텀 브랜딩(로고, 색상 등)을 표시하도록 구성할 수 있나요?
  3. 이 구현을 더 쉽게 만들어 줄 플러그인이나 확장 기능이 있나요?
  4. 이러한 유형의 설정을 추구할 때 고려해야 할 도전 과제나 제한 사항에 대한 조언이 있을까요?

이 프로젝트는 아직 개념 단계이며, 연말까지 구축을 시작할 계획입니다. 확약하기 전에 디스코urs가 이 비전에 적합한 플랫폼인지 확인하고 싶습니다.

미리 통찰, 제안, 또는 자원을 제공해 주셔서 감사합니다!

감사합니다,
크리스

그러니까 블로그용 포럼과 포트폴리오용 포럼을 각각 하나씩 만들되, 데이터베이스는 공유하는 건가요?

맞습니다.
두 도메인은 하나의 포럼을 공유하며, 하나의 데이터베이스 위에 구축되어 있습니다. 테마만 다른데, 그게 가능할지라도요.

그 부분에 대해 자세히 읽어본 적은 없지만, 어떤 형태의 멀티사이트 구성을 통해 가능할 수도 있습니다.

다만, 멀티사이트 구성에 대한 제 지식과 경험을 가진 사람의 피드백이 필요합니다.

아직도 잘 모르겠습니다.
즉, 도메인 a가 포럼을 가리키고, 도메인 b는 같은 데이터베이스를 사용하는 같은 포럼 또는 다른 포럼을 가리키는 건가요? 그렇다면 같은 데이터베이스를 사용하는 다른 포럼일 수도 있겠네요. 그러면 스타일을 다르게 설정할 수 있을 것 같습니다.

아마 이 가이드가 도움이 될까요?

그러면 두 포럼 모두 그곳을 가리킬 수 있을까요?

여기서 빠르게 검색해 보았지만, 쉽게 가능할지 혹은 실제로 가능할지 확신이 서지 않습니다.

더 쉬운 방법으로는 기본 그룹에 연결된 토글을 사용하고, 그룹 A에서 그룹 B로 전환할 때 테마를 변경하도록 하는 방식이 있을 수 있습니다. 또한 그룹별 Customization > Theme component 커스텀 홈 페이지를 사용하는 것도 방법입니다. 아니면 air 테마에서 사용된 Modern Category+group 박스를 두 번 설치하고, 테마/기본 그룹에 따라 커스터마이징을 적용하는 방식도 고려해 볼 수 있습니다.

저는 직접 알지 못하지만, discourse를 두 개 설치하면 데이터베이스가 손상될 위험이 있는 것 같기도 합니다. 물론 스테이징 사이트를 운영하는 경우가 있지만, 스테이징 사이트는 메인 사이트에서 정기적으로 백업되는 것 같기도 합니다.

즉, 사용자가 사이트 A를 열어서 사이트 A에서 포럼으로 이동하면 테마 A가 적용됩니다.

그런데 같은 사용자가 사이트 B를 열어서 사이트 B에서 포럼으로 이동하면 테마 B를 보게 되나요?

만약 사용자가 테마 A가 적용된 상태에서 사이트 B로 이동한 후 포럼 페이지를 새로고침하면 어떻게 되나요? 테마 B가 적용되나요, 아니면 테마 A가 유지되나요?

내 추측으로는 같은 데이터베이스 위에 여러 엔진(Discourse 설치)을 실행할 수 있을 것 같습니다(따라서 별도의 데이터베이스가 필요합니다). 다만, sidekiq는 1개만 실행하는 것이 좋습니다. 그렇지 않으면 두 개가 작업을 놓고 경쟁하게 될 테니까요. 그 외에는 Discourse가 무상태(stateless) 애플리케이션이라고 생각하므로, 몇 개를 실행하든 문제가 되지 않을 것입니다.

이제 근본적인 질문을 하나 드리겠습니다. 왜 그런 걸까요? 그리고 이것이 SEO 규칙에 위배되지 않나요? Google은 여러 사이트에서 동일한 콘텐츠를 발견하는 것을 좋아하지 않는다고 생각합니다.

사실 몇 가지 기능이 예상대로 작동하지 않을 수 있습니다. 예를 들어 실시간 UI 업데이트(누군가 기사를 업데이트하면 읽는 동안 마법처럼 다시 렌더링되는 경우)가 그렇습니다. 두 사이트가 서로를 알리지 않으므로 사용자에게 브라우저를 새로고침하도록 요청해야 할 것 같습니다. 더 많은 문제가 있을 수 있습니다. 예를 들어 한 사이트에서 사이트 설정을 변경하면 다른 사이트에서는 이를 감지하지 못할 것이며, 다른 사이트를 재시작해야 할 수도 있습니다.

Scaling up and sidekiq 를 참고하면 실제로 해결 가능한 문제인 것 같습니다. Sidekiq이 이를 처리하는 것으로 보이며, 나머지는 Redis를 올바르게 구성하는 문제일 것입니다.

조금 주제에서 벗어난 이야기이지만, 대화를 다른 방향으로 흐르게 하고 싶지는 않아서, 제 간단한 찬사를 덧붙이고 싶습니다.

우리는 이제 SEO나 사용자에 대해 고민해야 하는 인터넷 시대에 살고 있다고 생각합니다.

사용자를 선택하는 사람들이 셀프호스팅된 Discourse를 사용할 것이라고 의심의 여지가 없습니다.

저는 비슷한 대상 독자층을 가진 개인 프로젝트들이 있어 이 기능을 찾고 있었습니다. SSO가 있는 멀티사이트가 가장 근접한 대안이었는데, 느리고 불편해서 결국 아무 데도 도달하지 못했습니다.

OP의 아이디어를 지지하며, 이 주제를 팔로우하기 시작하겠습니다 :+1:

리퍼러에 따라 사용자의 테마를 변경할 수 있을지도 모르겠네요. 플러그인이 필요할 것 같습니다.

저에게 연락하거나 Marketplace 채널에서 질문해 주세요.

여러분, 멀티사이트(Multisite)가 작동하지 않아요.

그리고 이것도 작동하지 않습니다.

Discourse는 무상태(stateless)가 아니며, 모든 정보는 데이터베이스에 저장되어 있습니다. 따라서 단일 데이터베이스 위에 여러 인스턴스를 실행하면 자동으로 동일한 모습으로 보일 것이며, 한 곳에서의 변경 사항은 즉시 다른 곳에도 반영됩니다.

이것은 단순히 테마를 전환하는 문제일 뿐입니다. 아마도 기존 테마 미리보기 로직을 활용하고, URL 파라미터 대신 호스트명을 확인하는 플러그인을 만들면 될 것입니다.

동일한 포럼을 두 개의 URL 아래에서 호스팅하는 것이 여기에서 가장 어려운 부분이 될 수 있으며, 특히 SEO 측면에서 그렇습니다. 이는 다양한 중복 콘텐츠 문제와 canonical URL 문제를 야기할 것입니다.

이 부분을 좀 더 명확히 설명해 주실 수 있을까요? 그것이 어떻게 작동하는지 조금 더 알고 싶습니다. 두 문장이 서로 모순되는 것 같습니다. 모든 것을 반영하는 것이 실제로 OP가 요청한 것인 것 같습니다. 하지만 첫 번째 인스턴스에 의해 이루어진 변경 사항에 대해 다른 인스턴스가 통지를 받지 않는다면 어떻게 가능할까요? 데이터베이스에 저장되기는 하지만, 통지는 없으니까요.

그러면 단순히 db = 상태가 없(stateless)다는 뜻입니다. 요청을 할 때마다 데이터베이스에 다시 물어보는 것이죠 - 메모리 내 상태는 없습니다. 아니면 그런가요?

그렇지 않다면, 플러그인이라는 아이디어를 정말 좋아합니다. 이것이 나아갈 방향이라고 동의하며, 또한 SEO는 선택해서 하는 것이 아니라 청중을 확보하기 위해 어쩔 수 없이 해야 하는 것이라고 여전히 생각합니다. 중복(Duplication)은 실제로 이를 줄이는 방법일 수 있습니다. 사용자의 관점에서도 제가 한 사이트에서 작성한 것을 다른 사이트에서 링크로 보는 것은 의아할 수 있으며, 저는 정말로 불편할 것입니다. 콘텐츠 중복은 일반적으로 저품질 사이트가 사용하는 방법입니다. 그래서 SEO에서 불이익을 받습니다. 하지만 이것은 Community Building(커뮤니티 구축) 카테고리에 더 적합한 주제일 것입니다.

여기서 정의에 대한 혼란이 있는 것 같습니다. Discourse의 서버 측 코드는 (어느 정도*) 무상태(stateless)이지만, Discourse 인스턴스 전체(웹 클라이언트, 서버 측 코드, Redis, 캐시된 파일, 데이터베이스)는 무상태가 아닙니다.

그 메달의 다른 면은 다음과 같습니다. 서버 측 코드가 무상태라는 점을 고려할 때, 이 설정은 OP가 원하는 것을 달성할 수 없습니다. 왜냐하면 어떤 URL과 테마를 서빙해야 하는지에 대한 정보를 저장할 곳이 없기 때문입니다. 여러분이 설명하는 설정은 실제로 여러 웹 컨테이너와 단일 데이터베이스/Redis 인스턴스가 있는 로드 밸런싱 설정에서 발생하는 것과 동일합니다. 이는 단일 사이트입니다.

* 여러 곳에 캐싱 레이어가 많이 있으므로 "어느 정도"라고 말하는 것입니다

아, 그렇군요. 메인 사이트 URL도 데이터베이스에 저장되어 있나요? 그렇다면 로컬 인스턴스 설정의 문제는 아니라는 뜻이네요. 그렇다면 두 인스턴스가 여전히 동일한 내용을 서빙하려고 할 것이라는 점이 명확해집니다.

그리고 두 서버 구성이라 해도 Discourse가 올바른 테마를 선택하도록 하는 데는 전혀 도움이 되지 않는다는 말씀이 맞습니다.

이제 콘텐츠에도 문제가 있을 것 같다는 생각이 듭니다. Discourse에 링크를 붙여넣으면 URL 전체가 게시됩니다. 따라서 다른 사이트에서 작성된 토픽을 읽는 사용자가 링크를 클릭하면 해당 사이트로 이동하게 됩니다. 업로드 파일도 마찬가지입니다. Uploads Path Should Update When URL Changes in app.yml During Container Rebuild 를 참고해 주세요.

또 다른 문제는 이메일일 수 있습니다. 알림 이메일은 어떤 도메인에서 발송될까요? 또 다른 문제로는 소셜 플러그인(Facebook 등)이나 Google 로그인이 잘못된 사이트로 리다이렉트되거나(또는 로그인이 거부될 수 있음) 할 수 있습니다.

전혀 다른 관점에서, 훨씬 더 단순한 해결책은 두 개의 카테고리를 가진 단일 인스턴스를 사용하는 것입니다. 각 부모 사이트별로 하나씩 말이죠. 이렇게 하면 위에서 언급한 모든 문제를 우회할 수 있습니다.

카테고리-카테고리_슬러그(category-category_slug) 클래스를 사용해 간단한 CSS로 해당 카테고리 내의 카테고리와 주제를 스타일링할 수 있는 충분한 유연성이 있습니다.

특정 사용자 그룹을 위해 둘 중 하나를 ‘기본’ 또는 홈으로 설정하려면 Custom Homepage for Groups 도구가 필요합니다.