활성화 이메일: discourse-doctor는 작동하지만 discourse 자체는 작동하지 않음

안녕하세요,

제목에 적힌 대로입니다. discourse-doctor는 호스트 머신에서 실행 중인 메일 서버에 외부 및 인터넷 접근 인터페이스(localhost는 제외)를 통해 연결되지만, discourse 자체는 연결되지 않습니다.

discourse가 시도한 내용은 Rails production 로그나 메일 서버 로그 어디에도 기록되지 않습니다. Docker 인터페이스에서 패킷 스니퍼를 실행해 보았지만 메일 트래픽이 전혀 보이지 않습니다.

반면, discourse-doctor는 예상대로 메일 서버에 로그 항목을 생성하며, 메일 클라이언트에서 해당 이메일을 읽을 수 있습니다.

아래 설정으로 Docker 컨테이너를 여러 번 재구축해 보았습니다:

## 이것은 올인원, 스탠드얼론 Discourse Docker 컨테이너 템플릿입니다
##
## 이 파일에 변경 사항을 적용한 후에는 반드시 재구축해야 합니다
## /var/discourse/launcher rebuild app
##
## 편집할 때 *매우* 주의하세요!
## YAML 파일은 공백이나 정렬 실수에 대해 매우 민감합니다!
## 필요 시 http://www.yamllint.com/에서 이 파일을 검증하세요

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Lets Encrypt(https)를 추가하려면 이 두 줄의 주석을 해제하세요
###   - "templates/web.ssl.template.yml"
###   - "templates/web.letsencrypt.ssl.template.yml"

## 이 컨테이너가 어떤 TCP/IP 포트를 노출해야 합니까?
## Apache나 nginx 같은 다른 웹서버와 포트를 공유하려면
## https://meta.discourse.org/t/17247을 참조하세요
expose:
  - "127.0.0.1:1234:80"   # http
    ###   - "127.0.0.1:1235:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## db_shared_buffers는 총 메모리의 최대 25%로 설정하세요.
  ## bootstrap이 감지된 RAM에 따라 자동으로 설정하거나, 직접 덮어쓸 수 있습니다
  db_shared_buffers: "256MB"

  ## 정렬 성능을 향상시킬 수 있지만, 연결당 메모리 사용량이 증가합니다
  #db_work_mem: "40MB"

  ## 이 컨테이너가 어떤 Git 리비전을 사용해야 합니까? (기본값: tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## 동시 웹 요청을 얼마나 지원할 수 있습니까? 메모리와 CPU 코어 수에 따라 다릅니다.
  ## bootstrap이 감지된 CPU에 따라 자동으로 설정하거나, 직접 덮어쓸 수 있습니다
  UNICORN_WORKERS: 4

  ## TODO: 이 Discourse 인스턴스가 응답할 도메인 이름
  ## 필수입니다. Discourse는 IP 주소만으로는 작동하지 않습니다.
  DISCOURSE_HOSTNAME: example.com


  ## 컨테이너가 위에서 지정한 도메인 이름(-h 옵션)과 동일한
  ## 호스트네임으로 시작되도록 하려면 주석을 해제하세요 (기본값 "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 초기 가입 시 관리자 및 개발자로 설정될 쉼표로 구분된 이메일 목록
  ## 예: 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'me@another.com'

  ## TODO: 새 계정을 검증하고 알림을 보내는 데 사용되는 SMTP 메일 서버
  # SMTP 주소, 사용자 이름, 비밀번호는 필수입니다
  # 경고: SMTP 비밀번호에 '#' 문자가 있으면 문제가 생길 수 있습니다!
  DISCOURSE_SMTP_ADDRESS: submission.example.com # A 레코드는 작동하지만 CNAME은 작동하지 않습니다
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: somedumbuser
  DISCOURSE_SMTP_PASSWORD: somedumbpass
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (선택 사항, 기본값 true)

  ## Lets Encrypt 템플릿을 추가했다면 무료 SSL 인증서를 얻으려면 아래 주석을 해제하세요
  LETSENCRYPT_ACCOUNT_EMAIL: ssl@yetanother.com

  ## 이 Discourse 인스턴스의 http 또는 https CDN 주소 (인출하도록 구성됨)
  ## 자세한 내용은 https://meta.discourse.org/t/14857을 참조하세요
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

## Docker 컨테이너는 상태(stateless)를 유지하지 않으며, 모든 데이터는 /shared에 저장됩니다
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## 플러그인은 여기에 설치합니다
## 자세한 내용은 https://meta.discourse.org/t/19157을 참조하세요
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## 빌드 후 실행할 사용자 정의 명령
run:
  - exec: echo "Beginning of custom commands"
  ## 첫 번째 가입 시 'From' 이메일 주소를 설정하려면 주석을 해제하고 변경하세요:
  ## 첫 가입 이메일을 받은 후, 해당 줄의 주석을 다시 활성화하세요. 한 번만 실행하면 됩니다.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - replace:
      filename: /etc/nginx/conf.d/discourse.conf
      from: "types {"
      to: |
        set_real_ip_from 0.0.0.0/0;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;
        types {
  - exec: echo "End of custom commands"

즉, /admin/email에서 메일 테스트를 실행해도 메시지가 전송되지 않는다는 뜻인가요? /sidekiq가 실행 중인가요? 표준 방식으로 설치하셨나요?

Discourse는 도메인 이름이 있어야 작동하므로, 로컬호스트에만 바인딩한 것이 문제의 원인이 될 수 있습니다.

제이, 답변해 주셔서 감사합니다.

sudo docker exec -it app /bin/bash를 실행해도 /admin 디렉터리를 찾을 수 없습니다. git 저장소에서 클론된 /admin 디렉터리도 보이지 않습니다.

pgrep -afl sidekiq 명령을 실행하면 해당 이름의 프로세스가 실행 중임을 확인할 수 있습니다.

여기서 설명드린 대로 HAProxy 뒤에 Discourse를 실행하고 있기 때문에 localhost에 바인딩되어 있습니다: How to install Discourse behind Apache mod_proxy?

expose를 다음과 같이 수정해 보았지만, 여전히 메일 서버의 587 포트로 SYN 패킷이 하나도 전송되지 않습니다. DISCOURSE_HOSTNAME은 올바른 도메인으로 설정되어 있고, sidekiq도 실행 중인데, /admin/email을 어디서 찾을 수 있는지 여전히 모르겠습니다.

expose:
  - "1234:80"   # http

/admin/email은 상대 경로입니다.
웹 브라우저에서 접근해야 합니다:
{Your Discourse Hostname}/admin/email