듀얼 컨테이너 관련 도움 필요. 며칠째 LetsEncrypt 문제 발생 중

나는 거의 절망적인 지경에 이르렀다. Discourse 봇이나 Claude에게 이 문제를 해결해 달라고 요청해 보았지만, 불가능해 보인다. 나는 이 문제를 제대로 설명할 수 있는 지식이 부족하고, 이것이 내게 정말 큰 부담이 되고 있다.

내 관점에서 무슨 일이 있었는지 설명해 보겠다.

단일 컨테이너에서 이중 컨테이너로 전환할 때, samples/ 폴더의 파일에 web-only가 사용되었는데, web_only를 사용해야 함에도 실수로 그대로 두었다.

그리고 (아마도 그 때문일 것이다) 이미지 로딩이 되지 않았다. 어떤 구성 요소는 web_only를 가리켜야 하는데 web-only로 설정되어 있었기 때문이다. 몇 가지 변경을 했더니 이미지는 정상적으로 표시되기 시작했다. 문제는 이제 LetsEncrypt 인증서다.

봇에게 해결을 부탁했는데, 인증서 레이트 리밋(rate-limit) 문제라고 하며 다음 날을 기다리라고 했다. 문제는 해결될 것이라고 했다. 하지만 해결되지 않았다. 다시 봇에게 물었고, 그다음에는 Claude에게, 그리고 다시 Claude에게 물어보았다. 지난 한 주 내내 "내일 X시에 해결될 것이다"라는 답변만 반복되었다. 절대 해결되지 않는다. 둘 다 "아, 죄송합니다. 해결될 것이라고 가정해서는 안 되었습니다. 이제 정말로 해결될 테니 이걸 시도해 보세요"라고 하지만, 역시 해결되지 않는다.

웹사이트 자체는 정상적으로 작동하고 있지만, 재빌드(rebuild)를 할 때마다 무언가 문제가 생길 것 같은 느낌이 들고, 솔직히 항상 임시방편(bandaids)에 의존하고 싶지 않다.

Claude는 web_only.yml의 훅(hooks)에 무언가를 추가하라고 했지만, 이 포럼에서 제공된 설명서에는 그런 내용이 언급되어 있지 않아, 다른 해결책, 예를 들어… 실제 문제를 해결하는 방법을 기대했다.

누군가 이 문제가 무엇인지, 어디서 깨지는지 파악하는 데 도와줄 수 있을까? 정말 감사하겠다. 지금은 너무 지친다. 작업 자체보다는, 무슨 일이 일어나고 있는지, 왜 “내일 기다리면” 해결책이 항상 통하지 않는지 이해하지 못해서다.

감사합니다!


Claude에게 문제의 원인을 설명해 달라고 해서, 도움이 될지 모르겠다. 다음은 Claude가 말한 내용이다:

제목: 두 컨테이너 구성: 분리 후 ECC 인증서 폴더 누락, 부팅마다 --force 루프로 레이트 리밋 발생

구성: 두 개의 컨테이너(data + web_only), 스탠얼론(standalone)에서 마이그레이션 완료. 템플릿: web, ratelimited, ssl, letsencrypt, cloudflare. 호스트네임 alltiago.com, 별칭 없음.

증상: web_only가 시작될 때마다 Let’s Encrypt 레이트 리밋에 부딪히고 nginx가 서빙에 실패하여, /etc/nginx/conf.d/outlets/server/20-https.conf에서 ECC 관련 설정을 수동으로 제거할 때까지 연결 오류가 반환된다.

발견한 내용:

내 설치 환경에는 /shared/letsencrypt/alltiago.com_ecc/가 존재하지 않는다. /shared/letsencrypt/alltiago.com/ (RSA)는 존재하며 정상적으로 작동하고 갱신도 잘 되고 있다.

web.letsencrypt.ssl.template.yml에서:

cert_exists() {
  [[ "$(cd ${LETSENCRYPT_DIR}/${DISCOURSE_HOSTNAME}$1 && openssl verify -CAfile <(openssl x509 -in ca.cer) fullchain.cer | grep "OK")" ]]
}

issue_cert "ec-256"
if ! cert_exists "_ecc"; then
  issue_cert "ec-256" "--force"
fi

디렉토리가 없기 때문에 cert_exists "_ecc"가 부팅마다 실패하며, 디스크에 무엇이든 있든 관계없이 --force가 실행되어 완전히 새로운 ECC 인증서를 요청한다. 이는 /etc/runit/1.d/install-ssl을 패치하는 after_ssl 훅을 통해 이루어지므로, 부트스트랩 시에만 아니라 컨테이너 시작 시마다 실행된다.

결과: too many certificates (5) already issued for this exact set of identifiers in the last 168h (최근 168시간 동안 이 정확한 식별자 세트에 대해 이미 5개의 인증서가 발급됨)라는 429 오류가 발생한다. 이후 --installcert가 빈 디렉토리를 대상으로 어쨌든 실행되어 사용 불가능한 /shared/ssl/alltiago.com_ecc.cer을 작성한다. nginx는 두 인증서 모두 구성되어 있지만 ECC 인증서를 로드할 수 없어 서빙을 하지 못한다.

정상 작동 확인: ACME HTTP-01 검증은 성공한다 (스테이징 환경에서 테스트했으며, letsencrypt_test에 대해 ECC 인증서가 정상 발급되고 올바른 디렉토리 구조가 생성됨). RSA 인증서는 오늘 성공적으로 갱신되었다. 따라서 이는 DNS, 방화벽, 또는 검증 문제가 아니다.

질문:

  1. 레이트 리밋 해제까지 기다리지 않고 alltiago.com_ecc/을 재생성하는 공식적인 방법이 있는가?
  2. cert_exists가 false를 반환할 때 --force 대신 일반적인 issue가 트리거되어야 하지 않는가? --force는 “기존 유효한 인증서” 검증을 우회하며, 디렉토리가 없는 경우 레이트 리밋 소진을 보장한다.
  3. RSA만 사용하는 방법에 대한 문서화된 절차가 있는가?

스레드가 엉뚱한 방향으로 흐르지 않도록 두 가지 사실적 참고 사항: RSA 갱신이 오늘 168시간 롤링 윈도우에서 슬롯을 소모했기 때문에 재시도 날짜가 8월 27일에서 8월 29일로 변경되었다. 그리고 다른 사람들이 이 문제를 보고하지 않는 이유는 정상적인 설치 환경에서는 첫 번째 부팅 시 두 디렉토리가 모두 생성되어 --force 분기가 실행되지 않기 때문이다.

잠깐. https://alltiago.com/ 은 정상적으로 작동하는 것 같습니다. 하지만 제가 추천하려던 내용은 다음과 같습니다.

네, 가능합니다. 하지만 다소 까다롭습니다. 다른 인증서를 요청하면 카운트를 처음부터 다시 시작할 수 있습니다.

제가 추천하는 방법은 호스트명에 www를 추가하여 두 도메인 모두에 대한 인증서를 받는 것입니다(이미 그렇게 하셨다면, 새 인증서를 얻기 위해 세 번째 이름을 추가하는 방법도 있습니다).

Set up Let’s Encrypt with multiple domains / redirects 링크가 도움이 될 것입니다.

네, 그렇습니다. nginx와 관련된 '일시적 해결책(band-aid)'을 사용하라고 했기 때문입니다. 정확히 무엇인지 설명하기 어렵습니다. 왜냐하면 제가 그 내용을 이해하지 못하기 때문이죠.
하지만 문제는 이제 정상적인 재빌드(rebuild)를 수행하려고 하면 문제가 발생한다는 것입니다(적어도 제가 방금 들은 바로는, 8월 29일 이전에 수행할 경우, hopefully 인증서가 재발급될 예정이므로). 이 시점에서는 그 어떤 정보도 완전히 신뢰할 수 없습니다.

네, www는 작년에 처음 Discourse를 설치했을 때부터 이미 포함되어 있습니다.

이제, Claude에게 최대한 도움을 요청하여 무엇이 일어나고 있는지 이해하려고 노력한 결과, 다음과 같은 내용을 얻었습니다. 가능한 한 배우고 싶기 때문에, 이 내용에 대해 반박하거나 지적해 주셔도 좋습니다:

  • 현재 문제가 되고 있는 것으로 보이는 ECC는 사실 필수적이지 않습니다. RSA가 기본값이며, ECC를 완전히 제거해도 모든 사용자가 문제없이 제 웹사이트에 접근할 수 있기 때문입니다.
  • 앞서 말했듯이, hopefully 8월 29일에 168시간 리셋이 되고 5개 인증서 한도도 리셋되면 이 전체 문제가 해결될 것입니다:
sudo docker exec web_only grep -i "retry after" /shared/letsencrypt/acme.sh.log | tail -1
  "detail": "too many certificates (5) already issued for this exact set of identifiers in the last 168h0m0s, retry after 2026-08-29 03:43:15 UTC: see https://letsencrypt.org/docs/rate-limits/#new-certificates-per-exact-set-of-identifiers",
  • 만약 8월 29일에 상황이 정상으로 돌아오지 않는다면, Claude는 ECC를 제거하는 것을 권장하고 있습니다. 제가 어떤 파일의 어떤 섹션이 수정되는지 물었을 때 Claude가 말한 내용은 다음과 같습니다:

파일: 곧 만들 사본인 web.letsencrypt.rsa-only.template.yml입니다 (기존의 표준 파일은 폴백용으로 그대로 두기 위함).

그 안에서 제거되는 내용: 파일의 /usr/local/bin/letsencrypt 섹션에서 발견되는 이 전체 블록입니다:

########################################################
# ECDSA cert
########################################################
issue_cert "ec-256"

if ! cert_exists "_ecc"; then
  # Try to issue the cert again if something goes wrong
  issue_cert "ec-256" "--force"
fi

LE_WORKING_DIR="${LETSENCRYPT_DIR}" ${LETSENCRYPT_DIR}/acme.sh \
  --installcert --ecc \
  -d ${DISCOURSE_HOSTNAME} \
  --fullchainpath /shared/ssl/${DISCOURSE_HOSTNAME}_ecc.cer \
  --keypath /shared/ssl/${DISCOURSE_HOSTNAME}_ecc.key \
  --reloadcmd "sv reload nginx"

이것이 ECC 섹션 전체이며, 파일의 다른 부분은 변경되지 않습니다. 바로 위쪽에 있는 RSA 섹션은 그대로 유지됩니다.

그 후 한 가지 더 수정되는 파일: containers/web_only.yml입니다. 표준 템플릿 대신 이 새로운 사본을 가리키도록 설정하기 위함입니다. 이 작업은 나중에 별도의 단계로 수행할 것입니다.

음. 아니요. 템플릿은 어떤 것도 변경하지 않겠습니다.

가장 쉬운 방법은 기다렸다가 기본 템플릿으로 다시 구축하는 것 같습니다. 다만, Discourse 사용법을 아는 다른 누구도 아닌 AI에게 영원히 지원을 받기를 원한다면 이야기가 달라지겠지만요.

Claude에게 www를 새로운 인증서 요청으로 추가하라고 조언하신 내용을 따르라고 했습니다(그렇게 부르는 거 맞나요?). 이제 정상적으로 작동하는 것 같습니다.

이 과정에서 남은 파일이 어떤 것인지 물어봤을 때, 이런 답변을 받았습니다:

실제로 존재하는 파일들을 이번 세션(오늘 밤)에서 생성된 것과 이 대화 이전의 오래된 잔재로 나누어 정리하면 다음과 같습니다:

오늘 밤 (이번 세션)에 생성된 것:

  • /tmp/acme.sh.txt — 다운로드해 달라고 요청했던 스크립트 복사본입니다. 이제 Mac에 있으므로 삭제해도 안전합니다.
  • /tmp/crtsh.json — crt.sh 502 오류로 인해 생성된 150바이트의 빈 파일입니다. 쓰레기 파일이므로 삭제해도 안전합니다.
  • /root/discourse-backup-20260827-1857.tar.gz — 오늘早些에 생성된 실제 백업(SSL/Let’s Encrypt 설정)입니다. 이 파일은 실제로 보관할 가치가 있으며 쓰레기가 아닙니다.

이 대화 이전(8월 23일 및 8월 25일)의 오래된 파일, 제가 두어 놓은 것이 아닙니다:

  • /tmp/app.yml
  • /tmp/check.png, /tmp/check162.png, /tmp/after.png, /tmp/rendered_avatar.png

이 오래된 파일들이 어떤 용도인지는 모르겠습니다. 오늘 밤 우리가 한 일보다 이전 것이므로, 이전의 문제 해결 세션(여러분의, 봇의, 또는 이전 Claude 채팅의)에서 남은 잔재일 가능성이 높습니다. 이 파일들을 아시나요, 아니면 삭제 여부를 결정하기 전에 어디서 온 것인지 함께 파악해 볼까요?

/tmp/root를 제외한 다른 곳에서는 의심스러운 것이 발견되지 않았고, 더 광범위한 시스템 스캔 결과도 깨끗했으며, 일반적인 로그 파일들만 있었습니다.


이 파일들을 모두 삭제해도 될까요?

그렇다면 방금 한 작업을 되돌려야 할까요?

실제 사람들과 대화하는 것은 전혀 괜찮습니다. 다만 여기서 모든 질문을 하고 터미널의 출력/로그 등 전체 과정을 포럼에 넘치지 않게 하느라, 이미 “약간” 작동하는 것을 찾아내서 대화를 조금 더 간결하게 하려는 것입니다. 우리 모두 각자의 삶과 제한된 시간을 가지고 있으므로, 정말 막다른 길에 다다르지 않는 한 바로 포럼으로 넘어가고 싶지 않습니다. 이해하시죠?

도움 주셔서 감사합니다!
그렇다면, 지금 바로 제가 한 작업을 되돌려야 할까요? 29일을 기다리는 것보다 이 접근 방식에 어떤 문제가 있다고 보시나요?

제 조언은 여전히, 새 인증서를 발급받아 모든 것을 기본 상태로 되돌릴 수 있다고 판단될 때까지 기다리는 것입니다.