Docker compose certbot nginx 로 ssl 인증서 발급하기

LeeJaeG·2023년 8월 10일
0

준비물 : 도메인 발급
nginx 컨테이너 443포트 열기

목표

docker-compose를 실행하여 nginx와 certbot을 사용하여 https 로 사용하게 한다.

3trolls.me의 80 포트로 접근 할 때 443 https로 리다이렉트로 시켜준다.

golang 서버(was)에 로직처리, 동적컨텐츠를 요청하고 리턴 받는다.

docker compose 설치

podman compose 도 가능!

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

docker-compose-nginx-certbot.yaml

version: '3'
services:
  nginx:
    container_name: nginx
    image: nginx:latest
    restart: unless-stopped
    ports:
    - 80:80
    - 443:443
    volumes:
    - ./data/nginx/conf.d:/etc/nginx/conf.d //conf.d안에 ???.conf파일 설정을 nginx에 마운트시켜야함
//이 부분에 대한 자세한 설명은 conf파일 설명에서 대신한다.
    - ./data/certbot/conf:/etc/letsencrypt  //ssl 부분 certbot과 같은 폴더를 공유해야함
    - ./data/certbot/www:/var/www/certbot   //위와 같음
    - ./git/cube/cube/dist:/usr/share/nginx/html  //vue build 파일을 넣어줘야하는 부분이다.
//이 볼륨을 처음에 어떻게 설정하는지 몰라서 당황했다
//[host폴더]:[docker nginx에 마운트되야하는폴더]
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"

  certbot:
    image: certbot/certbot
    restart: unless-stopped
    volumes:
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
~

재발급이 가능하도록 command 추가

인증서 만료가 될 때쯤 자동으로 다시 SSL인증서를 다시 발급하도록 nginx, certbot

컨테이너에 커맨드를 추가

nginx:
    ...
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"

certbot:
    ...
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

data/nginx/conf.d/app.conf

이부분이 실질적으로 nginx가 웹서버로써 기능하는 코드이다.

먼저 server 80 포트로 3trolls.me로 들어오면 443으로 보냄

server {
    listen 80;
    server_name 3trolls.me;
    server_tokens off;

    location /.well-known/acme-challenge/ { //이것을 통해 인증 ssl
        allow all; 
        root /var/www/certbot; //파일에 인증서 갱신및 저장
    }

    location / {
        return 301 https://$host$request_uri;
//301 redirect는 영구적(Permanent)으로 옮겼을때 사용하고 302 redirect는 일시적(Temporary)으로 옮겼을때 사용
    }
}

server {
    listen 443 ssl;
    server_name 3trolls.me;
    server_tokens off;

    ssl_certificate /etc/letsencrypt/live/3trolls.me/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/3trolls.me/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
    }

    location /api {
    proxy_pass http://forwizlab.com:38071;
    }

    error_page 500 502 503 504   /50x.html;
    location = /50x.html {
    root /usr/share/nginx/html;
    }

}

[.init-letsencrypt.sh](https://github.com/wmnnd/nginx-certbot/blob/master/init-letsencrypt.sh) 위의 SSL재발급 자동화가 완성된다. 그렇지만 재발급을 하기 위해서는 첫번째 발급을 해야 하는데, 현재 nginx폴더에 SSL 관련 정보가 있기 때문에 nginx를 돌리기 위해서는 SSL 인증서가 필요하다. 따라서 이걸 위해서 더미 인증서를 발급받아 nginx를 구동하고, 더미 인증서를 삭제하고 SSL인증서를 발급 받을 것이다. 이 과정을 자동화 한 쉘 스크립트가 [.init-letsencrypt.sh](https://github.com/wmnnd/nginx-certbot/blob/master/init-letsencrypt.sh)이다.

curl -L https://raw.githubusercontent.com/wmnnd/nginx-certbot/master/init-letsencrypt.sh > init-letsencrypt.sh

profile
코딩으로 경제적 자유까지

0개의 댓글