Sidekiq에서 nil 이메일 주소로 활성화 이메일이 전송된다고 표시됨

안녕하세요, 멋진 여러분,

재미있는 문제를 하나 공유하려고 합니다. 다음과 같은 일이 발생했어요:

  1. discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub 를 참고하여 Discourse를 설치했습니다.
  2. doctor로 이메일을 테스트했는데, 정상적으로 작동하며 이메일도 수신되었습니다.
  3. 관리자 계정을 활성화하려고 시도했는데, sideqik가 다음과 같은 내용을 표시합니다. (토큰은 삭제되었습니다):
    {“type”=>“signup”, “user_id”=>1, “email_token”=>“REDACTED”, “to_address”=>nil, “current_site_id”=>“default”}

to_address가 nil인 이유가 무엇인지 모르겠습니다.

어떤 팁이나 조언, 제안이든 환영합니다!

아마도 찾을 수 있을 것 같지만, 이메일을 트리거한 Sidekiq 작업의 이름이 무엇인지 아시나요?

활성화 이메일을 받지 못해 사이트에 접근할 수 없는 경우, rake admin:create 명령을 사용하여 관리자 사용자 이름과 비밀번호를 생성할 수 있습니다. 자세한 지침은 여기에서 확인할 수 있습니다: Create an admin account from the console. 이를 통해 사이트에 로그인할 수 있을 것입니다.

다만, 이메일 전송 관련 문제를 해결해야 할 것으로 보입니다.

늦게 답변드려 죄송합니다. 해당 문제를 트리거한 작업은 Jobs::CriticalUserEmail이었습니다.

따라서 가이드를 그대로 따랐습니다. 관리자 계정을 등록할 때 이메일이 전송되지 않았고, Jobs::CriticalUserEmail에는 {“type”=>“signup”, “user_id”=>1, “email_token”=>“REDACTED”, “to_address”=>nil, “current_site_id”=>“default”}가 포함되어 있었습니다.

문제를 확인하기 위해 관리자 계정을 강제 생성했습니다. 그 결과는 다음과 같습니다:

  • Doctor는 정상 작동하며 이메일이 수신됩니다.
  • Digest 테스트도 정상 작동하며 HTML 버전과 일반 텍스트 버전 모두 이메일이 수신됩니다.
  • 어떤 등록을 하든 이메일이 전송되지 않으며, 관리자 섹션의 이메일 로그에는 이메일이 전송되었다는 메시지도 표시되지 않습니다.

사용자가 등록을 시도할 때마다 동일한 결과가 나타납니다:
Jobs::CriticalUserEmail에는 {“type”=>“signup”, “user_id”=>2, “email_token”=>“REDACTED”, “to_address”=>nil, “current_site_id”=>“default”}가 포함되어 있습니다.

/var/discourse/shared/standalone/log/rails/production.log의 끝부분은 다음과 같습니다(일부 정보는 마스킹 처리됨):

Processing by UsersController#check_username as JSON
  Parameters: {"username"=>"bobo", "email"=>"REDACTED"}
Completed 200 OK in 2ms (Views: 0.1ms | ActiveRecord: 0.0ms | Allocations: 636)
Started GET "/session/csrf" for REDACTEDPUBLICIP at 2024-09-26 08:13:03 +0000
Processing by SessionController#csrf as JSON
Completed 200 OK in 1ms (Views: 0.1ms | ActiveRecord: 0.0ms | Allocations: 270)
Started POST "/u" for REDACTEDPUBLICIP at 2024-09-26 08:13:03 +0000
Processing by UsersController#create as */*
  Parameters: {"name"=>"JJ", "email"=>"REDACTED", "password"=>"[FILTERED]", "username"=>"bobo", "password_confirmation"=>"[FILTERED]", "challenge"=>"REDACTED", "timezone"=>"Europe/London"}
Completed 200 OK in 335ms (Views: 0.1ms | ActiveRecord: 0.0ms | Allocations: 23323)
Started POST "/login" for REDACTEDPUBLICIP at 2024-09-26 08:13:04 +0000
Processing by StaticController#enter as HTML
  Parameters: {"username"=>"bobo", "password"=>"[FILTERED]", "redirect"=>"/u/account-created"}
Redirected to https://REDACTEDDOMAIN/u/account-created
Completed 302 Found in 1ms (ActiveRecord: 0.0ms | Allocations: 507)
Started GET "/u/account-created" for REDACTEDPUBLICIP at 2024-09-26 08:13:04 +0000
Processing by UsersController#account_created as HTML
  Rendered layout layouts/application.html.erb (Duration: 14.0ms | Allocations: 4624)
Completed 200 OK in 21ms (Views: 15.1ms | ActiveRecord: 0.0ms | Allocations: 6821)
Started GET "/sidekiq/queues/critical" for REDACTEDPUBLICIP at 2024-09-26 08:13:15 +0000

로그에는 등록 파라미터에 정확한 이메일 주소가 표시되지만, Sidekiq에서는 여전히 “to_address”=>nil로 보고하고 있습니다.

사이트의 오류 로그(Error Logs) 페이지에서 오류가 표시됩니까? 해당 페이지는 /logs에 있습니다. 관리자 사이드바에서 보안 / 오류 로그(Security / Error Logs) 항목을 클릭하여 접근할 수 있습니다.

오, 흥미롭네요. 이걸 얻었습니다:

/sidekiq에서 Sidekiq 웹 인터페이스에 접근할 수 있나요? 가능하다면 해당 페이지에서 오류가 보고되고 있나요?

저는 그렇습니다. 하지만 제가 보는 것은 이렇습니다:

„Enqueued“ 탭을 클릭해 보세요. 링크입니다.

이런 오류가 발생합니다:

여기서 address_to=nil이라는 것을 발견했습니다.

Redis와/또는 Sidekiq에 문제가 있는 것 같습니다. 이 포럼의 다른 몇몇 멤버들이 문제를 디버깅하는 방법에 대한 아이디어를 가지고 있을 수 있습니다.

저라면 서버에 SSH로 접속하여 다음을 실행해 보겠습니다:

cd /var/discourse
./launcher rebuild app

지금 시점에서 시도해 보는 것이 나쁠 것은 없습니다.

네, 그걸 여러 번 해봤고, 그래서 이렇게 와서 질문하는 겁니다.

재빌드도 해봤고, 아예 처음부터 새로 설치도 해봤습니다.

어떤 설치든, 매번 같은 문제가 생깁니다. 정말 막막합니다.

도와주려고 애써주신 점에 대해 진심으로 감사드립니다.

그런 일이 있다는 게 놀랍네요. 여기에서 설명하는 모든 단계를 따르고 있는지 확인해 주세요: . discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub.

또한, Discourse를 설치하려는 서버가 여기에서 설명하는 요구 사항을 충족하는지 확인해 주세요: discourse/docs/INSTALL.md at main · discourse/discourse · GitHub.

무엇이 잘못되고 있는지 파악하는 것이 좋겠습니다.

내가 사용한 정확한 과정을 알려줄 수 있습니다. 내가 수행하는 과정에서 무언가 잘못되었을 수도 있습니다. 어딘가에서 실수를 하고 있다면 완전히 인정할 의향이 있습니다!

  1. 도메인 보유. discourse.domain.dev입니다 (도메인은 당연히 비공개 처리됨)
  2. 이메일 계정 설정. Mailgun 계정이 있으므로 SMTP를 위해 완전히 새로운 사용자를 설정했습니다. 이메일은 discourse@discourse.domain.dev입니다.
  3. 서버 보유. 최신 Ubuntu (Jammy Jellyfish)입니다.
  4. apt install docker.io - 없음
  5. Git은 이미 설치되어 있었습니다.
  6. 사용자는 root였습니다.
  7. git clone https://github.com/discourse/discourse_docker.git /var/discourse를 사용하여 클론했습니다.
  8. cd /var/discourse로 이동했습니다.
  9. chmod 700 containers를 실행했습니다.
  10. 여전히 root 사용자 상태였습니다.
  11. ./discourse-setup을 실행했습니다.
  12. 요청된 정보를 입력했습니다: discourse.domain.dev
  13. Discourse 관리자 이메일: my@personal.email
  14. SMTP: smtp.eu.mailgun.org
  15. SMTP 포트: 587
  16. 사용자 이름: noreply@discourse.domain.dev
  17. 비밀번호: 비공개
  18. 알림 이메일: noreply@discourse.domain.dev
  19. Let’s Encrypt 이메일: my@personal.email
  20. Maxmind ID: 입력했습니다.
  21. MaxMind 라이선스: 입력했습니다.
  22. 설정을 위한 입력 데이터를 확인했습니다.
  23. Enter 키를 눌렀습니다.
  24. 기다렸습니다.
  25. 더 기다렸습니다.
  26. 차 한 잔을 만들었습니다.
  27. 부트스트랩 프로세스의 마지막 줄:
    + /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=8 -e UNICORN_SIDEKIQS=1 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e LETSENCRYPT_DIR=/shared/letsencrypt -e DISCOURSE_FORCE_HTTPS=true -e LC_ALL=en_US.UTF-8 -e LANGUAGE=en_US.UTF-8 -e DISCOURSE_HOSTNAME=discourse.domain.dev -e DISCOURSE_DEVELOPER_EMAILS=my@personal.email -e DISCOURSE_SMTP_ADDRESS=smtp.eu.mailgun.org -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=noreply@discourse.domain.dev -e DISCOURSE_SMTP_PASSWORD=b7fc73b0905b5ffb5f70300f1f796000-1b5736a5-0a60075a -e DISCOURSE_SMTP_DOMAIN=discourse.example.com -e DISCOURSE_NOTIFICATION_EMAIL=noreply@discourse.domain.dev -e LETSENCRYPT_ACCOUNT_EMAIL=my@personal.email -e DISCOURSE_MAXMIND_ACCOUNT_ID=REDACTED -e DISCOURSE_MAXMIND_LICENSE_KEY=REDACTED -h devsite -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address REDACTGED local_discourse/app /sbin/boot REDACTEDLONGSTRING
  28. ./discourse-doctor를 실행했습니다. redis에 연결할 수 없어서 실패했습니다.
  29. ./laucher rebuild app를 실행했고 설정에서 아무것도 변경하지 않았습니다.
  30. 빌드가 완료되었습니다. 모든 것이 정상입니다. 유일한 차이는 마지막에 비공개 처리된 긴 문자열이었습니다.
  31. ./discourse-doctor를 실행했습니다. 테스트 이메일을 받았습니다.
  32. 사이트가 실행 중이므로 관리자를 위한 사용자 계정을 생성하러 갔습니다.
  33. Register를 클릭했습니다.
  34. 알림 이메일을 보내고 있다고 표시되었습니다.
  35. 이메일을 받지 못했습니다.
  36. ./discourse-docter를 통해 확인했고 이것을 보았습니다:
    Discourse version at discourse.domain.dev: NOT FOUND Discourse version at localhost: NOT FOUND
  37. ./launcher enter app를 실행했습니다.
  38. rake admin:create를 실행했습니다.
  39. 이메일 입력: my@personal.email
  40. 사용자가 이미 존재하므로 비밀번호를 재설정했습니다.
  41. “Your account now has Admin priviledges!”(이제 계정에 관리자 권한이 있습니다!)라는 메시지가 표시되었습니다.
  42. 도메인에서 사이트에 로그인했습니다.
  43. discourse.domain.dev/logs로 이동 - "Sidekiq heartbeat test failed, restarting`(Sidekiq 하트비트 테스트 실패, 재시작 중)를 확인했습니다.
  44. discourse.domain.dev/sidekiq로 이동: 다음을 확인했습니다:
  45. Enqueued(대기 중)를 보기로 이동
  46. "critical"을 클릭하고 내용을 확장하면 다시 “to_address”=>nil을 볼 수 있습니다.

잠시 멈추고 도움을 요청합니다.

오늘 새 기계에서 완전히 다시 설정한 것입니다. 이전에 사용했던 것과 정확히 동일한 단계입니다. 만약 제가 실수를 했다면 알려주세요! :pray:


시스템 설정:

  • CPU: 4코어
  • RAM: 16 GB
  • OS: Ubuntu LTS 64bit 24.04
  • 저장소: NVMe 500G
  • Postgres 버전: 13.16-1
  • Redis: 7.0.7
  • Ruby: 3.3.4