Skip to content

Conversation

@chabinhwang
Copy link
Collaborator

1. PR 설명

기존 docker-compose.yml 설정은 certbot 서비스가 자체적으로 갱신 스케줄링을 시도하고, 새로 추가하려는 certbot-renew 서비스가 별도로 갱신을 시도하는 중복/충돌 문제가 있었습니다.

가장 치명적인 문제는, 만약 certbot의 자체 스케줄러가 먼저 갱신에 성공할 경우, Nginx를 리로드(reload)하는 로직이 없어 실제 서비스에 새 인증서가 적용되지 않는 심각한 오류가 발생할 수 있다는 점입니다.

이 PR은 certbot-renew를 전용 스케줄러로 사용하고, 기존 certbot은 단순 실행기로 역할을 변경하여 이러한 문제를 근본적으로 해결하고 SSL 갱신 프로세스를 안정화합니다.

2. 주요 변경 사항

A. certbot-renew 서비스 추가 (신규)

docker:cli 이미지와 docker.sock을 사용해 다른 컨테이너(certbot, nginx)를 오케스트레이션하는 헬퍼 컨테이너를 추가합니다.

certbot-renew:
  image: docker:cli
  container_name: certbot-renew
  restart: always
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  entrypoint: /bin/sh -c "while :; do docker exec certbot certbot renew && docker exec nginx nginx -s reload; sleep 12d; done"
  depends_on:
    - certbot
    - nginx

B. certbot 서비스 수정 (변경)

certbot 서비스의 entrypoint에서 자체 스케줄링 로직을 제거하고, 단순히 컨테이너가 대기 상태로 살아있도록 변경합니다.

 certbot:
   image: certbot/certbot:latest
   container_name: certbot
   restart: always
   logging:
     driver: json-file
     options:
       max-size: "10m"
       max-file: "5"
       tag: "{{.Name}}"
   depends_on:
     nginx:
       condition: service_healthy
   volumes:
     - ./certbot/data:/var/www/certbot:rw
     - ./certbot/conf:/etc/letsencrypt/:rw
   # ... (최초 발급 관련 주석) ...
-  entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12d & wait $${!}; done;'"
+  entrypoint: "tail -f /dev/null"

3. 변경된 동작 방식 (Architecture)

  1. certbot (실행기):

    • entrypointtail -f /dev/null로 변경되었습니다.
    • 이제 컨테이너는 부팅 후 아무 작업도 하지 않고, 인증서 파일과 Certbot 실행 파일만 보관한 채 '실행 대기' 상태로 유지됩니다.
  2. certbot-renew (스케줄러):

    • 12일마다 한 번씩 while 루프가 실행됩니다.
    • 1단계 (명령): docker exec certbot certbot renew
      • certbot 컨테이너 내부에서 갱신 명령을 실행합니다.
    • 2단계 (적용): && docker exec nginx nginx -s reload
      • 1단계(갱신)가 성공했을 때만 (&&) nginx 컨테이너에게 nginx -s reload 명령을 내려 새 인증서를 적용시킵니다.
    • 3단계 (대기): sleep 12d
      • 작업을 마치고 12일간 대기합니다.

4. 기대 효과

  • 갱신 스케줄러 일원화: 갱신 로직이 중복 실행되는 문제를 해결합니다.
  • Nginx 리로드 보장: 가장 중요. 인증서 갱신 성공 시, Nginx 리로드가 반드시 수행되도록 보장하여 인증서 만료 오류를 방지합니다.
  • 명확한 역할 분리: certbot은 파일/프로그램 저장소, certbot-renew는 자동화 스케줄러로 역할이 명확해집니다.

@sonarqubecloud
Copy link

@sudo-Terry
Copy link
Member

확인했습니다.
그런데 갱신을 담당하는 컨테이너를 따로, nginx를 갱신하는 컨테이너를 따로 두는 이유는 있나요?
기존 certbot컨테이너에서 갱신한 뒤에, certbot-renew가 한 것처럼 socket으로 nginx reload를 하면 안되나 싶어서요

@chabinhwang
Copy link
Collaborator Author

1컨테이너 1이미지가 보기에? 좋아서..이렇게 구성해봤습니닷.

@chabinhwang chabinhwang merged commit 65bb704 into main Oct 31, 2025
3 checks passed
@chabinhwang chabinhwang deleted the feat/nginx-renew branch October 31, 2025 06:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants