
원래는 크론탭이라고 자동갱신을 해둬야하는데 나는 docker로 띄워놔서 크게 상관이 없었다
그냥 docker-compose.yml의 entrypoint에 적어두면 되는 것이라서!
그래도 오늘은 두가지 방법 다 어떻게 하는지 포스팅 해보겠다
어차피 나 또 나중에 까먹을테니까...
0. 각각의 장단점?
- Docker-compose에 하면 docker 하나로 다 끝낼 수 있다는 장점이 있다
- 근데 반면에 crontab보다 좀 더 귀찮은 것 같다...
- crontab(크론탭)으로 하면, 좀 더 쉬운데 Docker 외부 서비스를 쓰게 된다
- docker-compose가 꺼져있어도 되는 장점이 있긴함
1. 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 입력하면 됨

'OS > Linux' 카테고리의 다른 글
우분투 할당되지 않은 하드 디스크 할당하기 (feat. Beelink S12 Pro) (0) | 2025.03.27 |
---|---|
Certbot SSL 인증서 만료일 확인하기 (feat. certbot SSL 인증 유효기간) (0) | 2025.02.27 |
서버 간 핑(ping), 통신 테스트 (feat. nc, nmap, python) (0) | 2025.02.14 |
Certbot으로 서버에 HTTPS 적용하기 (feat. 부셔버릴 통신사 공유기) (1) | 2025.02.13 |
HDMI 뺐다 끼면 소리 안나옴 (feat. Beelink S12 Pro) (0) | 2025.02.12 |