Certbot SSL 인증서 자동갱신 하기 (feat. Docker & Crontab)

2025. 2. 27. 16:40·Infra/DevOps

귀찮은 갱신을 해야하는 거시에오

원래는 크론탭이라고 자동갱신을 해둬야하는데 나는 docker로 띄워놔서 크게 상관이 없었다
그냥 docker-compose.yml의 entrypoint에 적어두면 되는 것이라서!
 
그래도 오늘은 두가지 방법 다 어떻게 하는지 포스팅 해보겠다
어차피 나 또 나중에 까먹을테니까...


0. 각각의 장단점?

- Docker-compose에 하면 docker 하나로 다 끝낼 수 있다는 장점이 있다
- 근데 반면에 crontab보다 좀 더 귀찮은 것 같다...
 
- crontab(크론탭)으로 하면, 좀 더 쉬운데 Docker 외부 서비스를 쓰게 된다
- docker-compose가 꺼져있어도 되는 장점이 있긴함


1-1. (직접 명령어로) 갱신하는 방법

# 갱신이 정상 작동하는지 테스트
sudo certbot renew --dry-run

# 특정 인증서 갱신 테스트
sudo certbot renew --cert-name <도메인> --dry-run

# 모든 인증서 수동 갱신
sudo certbot renew

# 특정 도메인 인증서만 갱신
sudo certbot renew --cert-name <도메인>

# standalone 옵션 (certbot이 자체 임시 웹서버를 80포트에 실행)
# nginx 등 웹서버 설정이 복잡할 때 이걸 쓰면 잠시나마 해결할 수 있음
sudo certbot renew --cert-name <도메인> --standalone

1-2. Docker로 certbot 자동 갱신하는 방법

일단 한줄을 추가하면 된다

entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew --webroot -w /var/www/certbot --quiet; sleep 24h; done'"

 
이걸 docker-compose.yml에 있는 certbot 부분에 등록해두면 된다
그럼 알아서 갱신한다
 
아래는 docker-compose.yml의 certbot 전문 예시

더보기
  certbot:
    image: certbot/certbot
    restart: always
    container_name: certbot-container
    volumes:
      - ./letsencrypt:/temp  # 인증서 파일 저장 위치
      - ./certbot/www:/temp  # 인증서 challenge 파일 저장 위치
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew --webroot -w /var/www/certbot --quiet; sleep 24h; done'"
    networks:
      - jenkins_network
    depends_on:
      - nginx

나는 초기엔 sleep 24h를 보고 `하루 단위로 하는게 너무 낭비이지 않나?` 싶어서 7일인 168h으로 변경해두었다
근데 알고보니 certbot의 renew는 30일 이하로 남았을 때만 갱신된단다 (이자식.. 똑똑하잖아?)
 
다만 갱신한다고 nginx가 알아서 재시작 되는건 아니니까 이건 또 기능을 추가해줘야한다
그럼 아래 순서의 수행이 필요함

1) .sh 파일 만들기
2) 파일 실행 권한 부여
3) volume 연결

1) .sh 파일 만들기

파일 이름은 nginx-reload.sh라고 가정

#!/bin/sh
docker exec nginx-container nginx -s reload

2) 파일 실행 권한 부여

chomod +x nginx-reload.sh

3) volume 연결

docker-compose.yml의 certbot volume 파트에 스크립트 경로를 추가해준다

  certbot:
    image: certbot/certbot
    restart: always
    container_name: certbot-container
    volumes:
      - ./letsencrypt:/temp  # 인증서 파일 저장 위치
      - ./certbot/www:/temp  # 인증서 challenge 파일 저장 위치
      - ./certbot/nginx-reload.sh:/nginx-reload.sh  # 스크립트 추가
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew --webroot -w /var/www/certbot --quiet --deploy-hook \"/nginx-reload.sh\"; sleep 24h; done'"
    networks:
      - jenkins_network
    depends_on:
      - nginx

이제 docker container를 다시 실행시켜서 스크립트 파일이 root 경로에 있는지 확인하고
도커 내부에서 직접 실행시켜본 뒤 컨테이너 로그를 확인하면 정상동작하는지 쉽게 확인할 수 있다
 
로그를 보면 인증서 데드라인이 아직 남아서 갱신 안되고 skip된 것을 확인할 수 있음


2. Crontab에 certbot 자동갱신 등록하는 방법

일단 Crontab은 특정 시간 간격으로 명령어를 실행하는 리눅스의 스케줄링 도구이다
그니까 쉽게 말하면 `매주 월요일에 certbot 인증 갱신하는 스크립트 실행시켜`가 되는 것임
우리가 할 것은 딱 두가지

1) 스크립트를 짜고
2) 크론탭을 등록한다

1. 스크립트

### 템플릿 ###
#!/bin/sh
docker compose -f {.yml 파일 이름} exec {certbot 서비스명} certbot renew
docker exec {nginx 컨테이너명} nginx -s reload

### 예시 ###
#!/bin/sh
docker compose -f docker-compose.yml exec certbot certbot renew
docker exec nginx-container nginx -s reload

2. 크론탭 등록

터미널에 crontab -e 입력하면 크론탭 편집 가능하다
그리고 맨 아랫줄에 추가하면 됨

### 예시 ###
0 0 * * 1 /home/n100/docker-compose/certbot-renew.sh >> /var/log/certbot-renew.log 2>&1

위 처럼 스크립트 경로 주고, 나 같은 경우는 매주 월요일, 스크립트를 실행하고, 출력을 로그로 저장하게 함
0 0 * * 1을 설명하면 아래와 같다

0 0 * * 1: 시간 및 날짜 필드 (분, 시, 일, 월, 요일)
    0 0: 0분, 0시 (즉, 매일 자정에 실행)
    *: 모든 날 (매일)
    *: 모든 월 (매월)
    1: 월요일 (요일, 1은 월요일을 의미)

 
등록 잘 됐는지 보려면 터미널에 crontab -l 입력하면 됨

반응형

'Infra > DevOps' 카테고리의 다른 글

[서버 보안 시리즈 #1] Nginx 필터링으로 악성 요청 차단하기  (0) 2025.06.05
IP 변경 시 도메인 자동 갱신 시스템 구축하기 (feat. Docker & DuckDNS)  (0) 2025.05.31
Certbot SSL 인증서 만료일 확인하기 (feat. certbot SSL 인증 유효기간)  (0) 2025.02.27
Certbot으로 SSL 인증서 발급받기 (feat. 부셔버릴 통신사 공유기)  (3) 2025.02.13
프로세스 종료 시, 텔레그램(Telegram) 알림 보내기 (feat. PID)  (0) 2024.12.11
'Infra/DevOps' 카테고리의 다른 글
  • IP 변경 시 도메인 자동 갱신 시스템 구축하기 (feat. Docker & DuckDNS)
  • Certbot SSL 인증서 만료일 확인하기 (feat. certbot SSL 인증 유효기간)
  • Certbot으로 SSL 인증서 발급받기 (feat. 부셔버릴 통신사 공유기)
  • 프로세스 종료 시, 텔레그램(Telegram) 알림 보내기 (feat. PID)
Ratatou2
Ratatou2
온갖 정보들을 기록해두는 메모보드 블로그
  • Ratatou2
    nak-z
    · Ratatou2 ·
  • 전체
    오늘
    어제
  • 공지사항

    • 블로그 이전 진행 중 (24.11.25 ~)
    • 분류 전체보기 (305)
      • OS (89)
        • Linux (39)
        • Window (24)
        • Mac (21)
        • Android (5)
      • Infra (84)
        • DevOps (38)
        • Docker (14)
        • Jenkins (10)
        • n8n (13)
        • Nextcloud (8)
        • Rasberry Pi (1)
      • Dev (19)
        • JAVA (7)
        • Python (1)
        • DB (3)
        • Vue (2)
        • AI (6)
        • Git (0)
      • Tools (10)
      • Study (69)
        • Algorithm (66)
        • CS (3)
      • Game (10)
        • Project Zomboid (9)
        • Don't Starve Together (1)
      • etc (23)
        • Temp (0)
      • 개발 외 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Ratatou2
Certbot SSL 인증서 자동갱신 하기 (feat. Docker & Crontab)
상단으로

티스토리툴바