Discourse 우선순위 액션 메일러 플러그인

저장소: Discourse Priority Action Mailer 플러그인

이 플러그인은 무엇을 하나요?

이 플러그인은 표준 Discourse 기본 SMTP 채널 외에도 두 가지 새로운 SMTP "채널"을 추가합니다. 한 채널은 “높은 우선순위” 이메일을 위한 것으로, (주관적으로) 사용자가 이메일로 로그인하길 요청하거나, 가입하거나, 비밀번호 재설정을 요청할 때 발송되는 알림 이메일입니다. 다른 채널은 다이제스트(요약) 이메일을 위한 것입니다. 이 두 가지 새로운 SMTP 채널 중 어느 하나라도 구성되지 않은 경우(나중에 자세히 설명합니다), 새로운 채널들은 표준 Discourse SMTP 채널로 기본 설정됩니다.

왜 이 플러그인에 관심을 가져야 하거나 설치해야 하나요?

이메일 로그인 요청과 같은 사용자에게 보내는 “높은 우선순위” 이메일과 다이제스트(예를 들어)가 동일한 SMTP 채널에 존재하면, 특히 기본 SMTP 채널에 제한이 설정된 경우 잠재적인 “가용성”각주 1 문제가 발생할 수 있습니다.

저희는 레거시 포럼에서 Discourse로 처음 마이그레이션할 때 이 문제를 직접 경험했습니다. 당시 저희는 Google Workspace 계정(구 G Suite)을 사용했습니다. Google이 해당 계정에 제한을 걸었기 때문에, 해당 이메일 계정은 며칠 동안 “잠겨” 있었습니다. 저희는 다른 계정을 생성하고 다이제스트를 끄기 때문에 실제로는 심각한 문제가 아니었지만, 짧은 시간 동안 멤버들이 이메일로 로그인하거나 가입할 수 없었습니다.

사이버 보안 및 시스템 엔지니어링 전반에 대한 저의 경험에서, 이 단일 이메일 채널은 "단일 장애 지점(Single Point of Failure)"으로 지적되었고, 따라서 이를 수정해야 한다는 메모를 남겼습니다. 그리고 이 플러그인은 모든 다이제스트 이메일을 다른 SMTP 채널로 이동시킴으로써 이 문제를 해결합니다.

실제로 이 플러그인 코드가 얼마나 단순한지 보면, 이 작업을 수행하는 것이 꽤 쉽다는 것을 알 수 있습니다.

이 플러그인을 어떻게 설치하나요?

이 플러그인을 설치하는 것은 간단합니다.

  • Discourse 플러그인을 설치하듯 이 플러그인을 설치합니다.
  • 컨테이너 빌드 파일(.yml 파일)에 추가 SMTP 자격 증명을 정의합니다.

다음과 같은 추가적인 Discourse 컨테이너 환경 변수가 사용됩니다. 기본 값을 원하지 않는 경우에만 설정하십시오. 이 SMTP 환경 변수들은 기본적으로 _PRIORITY와 _DIGEST가 각각 추가된 Discourse 기본 SMTP 환경 변수와 동일합니다:

우선순위 채널 환경 변수

env:
  DISCOURSE_SMTP_ADDRESS_PRIORITY:                     
  DISCOURSE_SMTP_PORT_PRIORITY: 
  DISCOURSE_SMTP_USER_NAME_PRIORITY: 
  DISCOURSE_SMTP_PASSWORD_PRIORITY: 
  DISCOURSE_SMTP_AUTHENTICATION_PRIORITY:               # 보통 plain으로 설정
  DISCOURSE_SMTP_ENABLE_START_TLS_PRIORITY:             # 보통 true로 설정

다이제스트 채널 환경 변수

env:
  DISCOURSE_SMTP_ADDRESS_DIGEST:                     
  DISCOURSE_SMTP_PORT_DIGEST: 
  DISCOURSE_SMTP_USER_NAME_DIGEST: 
  DISCOURSE_SMTP_PASSWORD_DIGEST: 
  DISCOURSE_SMTP_AUTHENTICATION_DIGEST:               # 보통 plain으로 설정
  DISCOURSE_SMTP_ENABLE_START_TLS_DIGEST:             # 보통 true로 설정

위 채널 중 하나를 지정하지 않으면, 플러그인은 각 채널을 Discourse 표준 채널로 기본 설정합니다.

개발자를 위한 참고 사항

이 Discourse 플러그인은 “높은 우선순위” SMTP 메시지를 위한 새로운 “높은 우선순위” SMTP "채널"과, 사용자에게 발송되는 다이제스트 전용 새로운 “다이제스트” 채널을 생성합니다. 여기에는 AdminConfirmationMailer와 UserNotifications 메일러의 다음 메서드들이 포함됩니다:

우선순위 채널 액션

  • :email_login,
  • :signup,
  • :forgot_password,
  • :admin_login

다이제스트 채널 액션

  • :digest

이 새로운 “높은 우선순위” SMTP 채널은 Discourse가 다이제스트 등을 발송하는 표준 채널과 달라야 합니다.

위 “높은 우선순위” 선택은 완전히 주관적(저의 기준)이며, 플러그인을 수정하여 쉽게 변경할 수 있습니다.

컨테이너의 rails 콘솔을 사용하여 구성을 쉽게 확인할 수 있습니다. 예를 들어, "우선순위 채널"의 SMTP 설정을 표시하려면 다음과 같이 할 수 있습니다:

rails c
Rails.application.config.priority_smtp_settings

“다이제스트” 채널도 마찬가지입니다:

rails c
Rails.application.config.digest_smtp_settings

“기본” OOTB(Out-Of-The-Box) SMTP 설정도 마찬가지입니다:

rails c
Rails.application.config.action_mailer.smtp_settings

플러그인을 설치하고 컨테이너 빌드 파일에 ENV 변수를 설정하지 않은 경우, 모든 값이 Rails.application.config.action_mailer.smtp_settings로 기본 설정되었는지 쉽게 확인할 수 있습니다.

추가로, Discourse 관리자 패널을 쉽게 확인할 수 있습니다:

  • /admin/email/sent
  • /sidekiq

모든 것이 잘 작동하는지 확인하십시오.

테스트

이 버전(v0.1)은 여러 날 동안 라이브 테스트되었으며, 지금까지 완벽하게 작동하고 있습니다.

시스템 관리자를 위한 참고: 저희의 구성

저희의 설정은 현재 다음과 같이 구성되어 있습니다:

  • 다이제스트 채널: sendgrid, “api: blah_blah_blah_11111_blah_bla”
  • 기본 채널: sendgrid, “api: blah_blah_blah_2222_blah_blah”
  • 우선순위 채널: Google Workspace 계정

그 이유는 sendgrid를 통해 중요한 통계를 많이 얻을 수 있기 때문이며, 월 약 15달러의 기본(무료가 아님) 플랜을 사용하고 있어 월 최대 40,000개의 메시지를 발송할 수 있습니다. 40K 제한을 넘지 않도록 다이제스트를 켜고 끄며 관리합니다.

추적 목적으로 두 개의 서로 다른 sendgrid API를 사용합니다. 재미로 "기본 채널"을 "MailGun"과 같은 다른 제공자로 설정하려 했지만, 아직 그렇게 하지는 않았습니다.

저희는 Google Workspace 계정을 사용합니다. 저희의 Discourse 포럼은 이메일로 로그인하는 사용자가 많지 않고 가입량이 적어 Google이 불만을 제기하지 않기 때문입니다. 그리고 “높은 우선순위” 이메일 알림에서 무슨 일이 일어나고 있는지 쉽게 볼 수 있습니다:


많은 가입, 이메일 로그인 요청 및 기타 "우선순위 이메일 알림 트래픽"이 있는 사이트에는 Google Workspace(또는 어떤 Google 계정)를 사용하지 말고 Sendgrid, MailGun과 같은 다른 SMTP 벌크 이메일 제공자를 사용할 것을 권장합니다. aforementioned 대로, 저희는 기본(무료가 아님) sendgrid 플랜을 사용하고 있습니다.

그렇다고 해서, SMTP 구성은 “전적으로 당신에게 달려 있으며” “저에게 달려 있는 것이 아닙니다” :slight_smile: 따라서 “당신에게 가장 좋은” 방식으로 구성하십시오.

향후 개선 사항

우리는 예를 들어 다이제스트 이메일을 여러 제공자 사이에 로드 밸런싱하기 위해 난수 생성기를 사용한 "라운드 로빈"을 추가하는 것과 같은 재미있는 일들도 할 수 있습니다. 이 플러그인을 쉽게 수정하여 3개 또는 심지어 30개의 이메일 채널을 가질 수 있으며, 따라서 매우 창의적으로 활용할 수 있습니다!

추가로, 메일러의 Jobs 예외를 살펴보고 문제가 있으면 해당 메일러(채널)를 플래그를 지정하고 “플래그 지정된” 채널로 이메일 발송을 중지하는 등의 조치를 취할 수 있습니다.

실제로는 하늘이 한계입니다. 하지만 현재로서는 "라운드 로빈"이나 “고장 난 채널 비활성화” 기능을 이 플러그인에 추가할 즉각적인 계획은 없으며, 다른 작업에 바쁘기 때문입니다.

솔직히 말해서(죄송합니다), 저는 EmberJS 프로그래밍에 관심이 없습니다(2020년 기준, 2021년은 불확실하지만, 그럴 가능성은 낮습니다…), 따라서 이번 릴리스에서 새로운 UI 기능을 추가하지 않았습니다. 죄송합니다. 일반적으로 저는 서버 측 프로그래밍, 시스템 관리 및 사이버 보안 관련 기능(서버 측)에 더 관심이 많습니다. 하지만 그것은 저만의 취향일 뿐입니다. 새로운 Ember UI 코드를 PR하거나 포크하여 수정하는 것을 망설이지 마십시오. 만약 이 새로운 SMTP 채널을 표시하기 위해 새로운 라우트를 추가하기로 결정한다면, ( aforementioned 대로) 현재 EmberJS 프로그래밍에 흥미를 느끼지 못하고 있으므로 Bootstrap과 jQuery를 사용하여 수행할 가능성이 높습니다.

메서드 변경 또는 추가

현재 "우선순위 채널"에 대한 플러그인 구성은 완전히 주관적이며, "우선순위 채널"에 다른 메일러 클래스 메서드를 추가하여 변경하는 것에 열려 있습니다. 저는 인터넷에서 쉽게 찾을 수 있습니다 :slight_smile:

관련 링크

각주

  1. 사이버 보안의 세 가지 핵심 도메인은 다음과 같습니다:

    1. 가용성 (Availability)
    2. 기밀성 (Confidentiality)
    3. 무결성 (Integrity)

이 플러그인은 낮은 우선순위의 다이제스트 SMTP 트래픽을 기본 SMTP 채널에서 이동시키고, “높은 우선순위” SMTP 트래픽을 낮은 트래픽(다이제스트 없음, 캐주얼한 사용자 알림 없음)의 SMTP 채널로 이동시킴으로써 Discourse 사이버 보안의 “가용성” 도메인을 개선하도록 설계되었습니다.

플러그인 지원

지원이나 기능 요청에 대해 저에게 연락하는 가장 좋은 방법은 이 동반 주제에 게시하는 것입니다:

6개의 좋아요

플러그인 감사합니다. 회원 수가 많은 포럼에서 특히 유용할 것 같습니다.

1개의 좋아요

@ozkn 감사합니다.

이렇게 훌륭한 Discourse 사용자 커뮤니티에 작은 힘이라도 보탤 수 있어 기쁩니다.

1개의 좋아요