설치가 작동하지 않아요!

DigitalOcean의 1클릭 앱을 사용하여 새로 설치를 시도하고 있습니다.
처음부터 세 번째로 생성해 보았는데, 동일한 문제가 발생하고 있습니다.
DNS를 확인해 보니 도메인이 드롭렛 IP를 가리키고 있지만, 제 도메인에서 Discourse가 표시되지 않습니다.

discourse-doctor를 실행하면 “도메인이 제공 중/제공되지 않음” 정보가 표시되기 전에 멈추거나 반응이 없습니다.

이러한 동작을 유발할 수 있는 업데이트가 있었나요?

원클릭 설치 방식은 지원되지 않습니다.

대신 공식 설치 과정을 사용하세요. 과정이 매우 간단합니다.

설치 중 문제가 발생하면 이 곳에 게시하여 도움을 받을 수 있습니다.

@merefield 방금 새 드롭렛을 생성하고 공식 설치 페이지에 설명된 대로 설치를 실행했습니다. 여전히 동일한 문제가 발생하고 있습니다.

discourse-doctor가 멈추고 있습니다

그리고 제 도메인에서 아무것도 서빙되지 않습니다.

공식 설치로 완전히 새로 설치한 상태입니다. 여기서 무슨 일이 일어나고 있는지 파악할 수 없습니다. 어떤 단서가 있을까요?

@merefield ./launcher logs app 명령을 실행하면 다음 내용이 표시됩니다:

nginx: [emerg] cannot load certificate "/shared/ssl/mydomainname.de.cer": PEM_read_bio_X509_AUX() failed (SSL: error:0909006C:PEM routines:get_name:no start line:Expecting: TRUSTED CERTIFICATE)

정확한 의미를 잘 모르겠습니다.

그렇다면 /shared/ssl을 참조하려고 하는 것 같은데, 실제로 SSL은 shared/standalone/ssl에 있네요. 어떻게 수정해야 하나요?

문제는 대개 DNS가 올바르게 설정되어 있지 않거나, 전파(propagation)가 완료되지 않은 것입니다. URL을 공유해 주시면 누군가가 확인해 줄 수 있습니다.

저는 보통 https://dnschecker.org/#A/example.com을 사용하여 확인합니다.

하지만 여러 번 시도해 보셨다면, Let’s Encrypt가 인증서를 발급할 수 있는 횟수를 이미 소진했을 가능성이 큽니다. 제 추측으로는 이것이 현재 문제가 될 것입니다. 약 90% 확신합니다. https://meta.discourse.org/t/setting-up-let-s-encrypt-with-multiple-domains/56685/53을 따라 "속임수"를 쓸 수는 있지만, 이는 더 복잡한 설정이며 단순한 설정을 구현할 수 없게 됩니다. 가장 좋은 방법은 며칠간 기다린 후 다시 시도하는 것입니다.

문제가 아닙니다. /shared/ssl은 컨테이너 내부의 경로입니다. shared/standalone/ssl은 컨테이너 외부의 경로입니다.

@pfaffman 네, 그럴듯하네요! 그래도 저는 아직 생성할 수 없지만, 다른 도메인에서는 생성할 수 있습니다. DNS 조회 결과 올바른 서버에 연결되어 있는 것으로 보이므로, 당신이 설명하신 상황인 것 같습니다. 며칠 더 기다렸다가 다시 시도해 보겠습니다.
감사합니다 :metal:

@pfaffman 해킹하는 데 도움을 주실 수 있나요? 여러 도메인을 설정하는 방법을 살펴봤는데, 말씀하신 내용을 정확히 이해하지 못하겠습니다. after_ssl 훅을 어떻게 활용하라는 말씀이신가요?

다른 도메인을 추가하면 됩니다. 예를 들어 포럼이 forum.example.com이라면, 서버를 가리키는 cheat.example.com에 대한 DNS 레코드를 추가하고 해당 문서에 설명된 대로 추가하면 됩니다. 인증서 요청이 다르기 때문에 요청할 수 있습니다.

@pfaffman 저는 Digital Ocean을 사용 중입니다. cheat.example.com을 A 레코드로 추가했는데, 설정 시 도메인으로 인식되지 않습니다.

(경고: 컴퓨터의 포트 443에 접근할 수 없음)

설명에 따라 재구축을 진행했지만 여전히 "사이트에 연결할 수 없음"이 표시됩니다. :thinking:

나머지 설정의 경우, app.yml 파일의 hooks: 안에 다음 내용을 추가했습니다.

  after_ssl:
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--keylength/
        to: "-d cheat.example.com"

또는 이 방법을 사용하여 도메인 또는 서브도메인을 하나 추가할 수 있습니다. 이는 레이트 리밋에 도달했을 때 우회하는 쉬운 방법입니다. 하지만 레이트 리밋에 도달하는 것을 피하려면 항상 테스트 환경인 --dryrun을 사용하는 것이 가장 좋습니다. (참고: Let’s Encrypt는 --dryrun을 영어권 외 사용자에게 더 쉽게 인식할 수 있는 --test 또는 --testrun 등으로 이름 변경하는 것을 고려하고 있습니다. 아마도 2021년 1월 중순 이후에나 이루어질 가능성이 높습니다. 또한 가이드 전체를 재작성하는 작업도 진행 중입니다. :slightly_smiling_face:


기존 인증서에 새 도메인을 추가하는 권장 방법은 원래의 명령어를 재사용하고, 새로운 도메인을 다른 -d 플래그로 추가한 후, --expand를 추가하여 certbot이 새로운 라인리지(lineage)를 생성하지 않도록 지시하는 것입니다. (라인리지 생성 시 /etc/letsencrypt/live 디렉토리에 새로운 하위 디렉토리가 생성됩니다.)

여기서의 문제는, 너무 늦게서야 그것이 테스트였다는 사실을 알게 된다는 점입니다. 또한, 저조차도 Discourse를 테스트 모드로 설정하여 해당 인증서를 가져오도록 구성하는 방법이 명확하지 않습니다.

제가 전하고자 했던 바로 그 내용입니다.

이것이 그들이(Let’s Encrypt) 가이드를 다시 작성하는 이유 중 하나입니다… 더 명확하게 만들기 위해서입니다. 테스트 환경에서 테스트(가짜) 인증서를 발급받는 방법을 설정한 후, Certbot을 프로덕션 모드로 실행하여 CA를 발급받을 수 있습니다. 그 다음 Discourse를 설치하면 새로(확장된) CA를 가져와야 합니다.

:+1:

그것이 아닙니다. 앱의 app.yml 파일에 스탠사를 추가하여 그 스위치를 넣는 방법—그것이 아무리 명백해 보일지라도—을 알아내는 것이 Discourse를 설치하는 것보다 약 3배(아니면 10배)는 더 어렵습니다. app.yml을 편집하고 복잡한 내용을 추가해야 하며, 모든 공백 위치까지 정확히 맞춰야 하는 건가요? 그냥 일주일 정도 기다리거나 새 이름을 선택하세요.

@pfaffman 설명드린 대로 새로운 이름을 선택했습니다. 문제는 cheat.example.com이 A 레코드 대신 CNAME이어야 한다는 점이었습니다.

하지만 여전히 작동하지 않습니다. 조금 더 시간을 두고 지켜보겠습니다.

수정: 참고로 제 app.yml은 다음과 같습니다:


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"

expose:
  - "80:80"   # http
  - "443: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
  # DISCOURSE_RELATIVE_URL_ROOT: /forum
  ## 동시 웹 요청은 몇 개까지 지원됩니까? 메모리와 CPU 코어 수에 따라 다릅니다.
  ## bootstrap에 의해 감지된 CPU에 따라 자동으로 설정되거나, 직접 덮어쓸 수 있습니다
  UNICORN_WORKERS: 4

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

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

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

  ## TODO: 새 계정을 검증하고 알림을 보내는 데 사용되는 SMTP 메일 서버
  # SMTP 주소, 사용자 이름, 비밀번호는 필수입니다
  # 경고: SMTP 비밀번호에 포함된 '#' 문자는 문제를 일으킬 수 있습니다!
  DISCOURSE_SMTP_ADDRESS: smtpout.secureserver.net
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: some@email.com
  DISCOURSE_SMTP_PASSWORD: "apassword"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (선택 사항, 기본값 true)

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

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

## Docker 컨테이너는 상태가 없으며, 모든 데이터는 /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
  after_ssl:
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--keylength/
        to: "-d cheat.example.com --expand"
 

결국 일주일이 지나고 나서야 제 도메인을 다시 사용할 수 있었습니다. 아마 서브도메인으로 작동하도록 설정하는 과정에서 설정 파일에 오류가 있었던 것 같습니다. Let’s Encrypt 문서를 읽은 후에도 이것이 해결책이라는 데에는 꽤 확신이 있었거든요.

도와주신 @pfaffman님과 @JimPas님께 다시 한번 감사드립니다. 유용한 답변을 주셔서 감사합니다!