PROJECTS

https 적용

nicesugi 2022. 9. 6. 16:42

letsencrypt을 사용하여 certbot ssl 적용

추가한 부분은 굵은 글씨체로 변경함

파일 생성

  1. docker-compose.yml
version: '3.9'
services:
  nginx:
    build: ./nginx
    volumes:
      - static_volume:/django/static
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    ports:
      - 80:80
      - 443:443
    depends_on:
      - app
  
  certbot:
    image: certbot/certbot
    volumes:
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot

  app:
    build: .
    volumes:
      - .:/django
      - static_volume:/django/static
    image: app:django
    container_name: django_container
    env_file:
      - ./.env.prod
    command: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn Wayne_Hills.wsgi:application --bind 0.0.0.0:8000"

volumes:
  static_volume:

2. 이메일은 꼭 깃 로그인하는 본인 이메일을 작성

도메인 → www. 같이 앞에는 제외하고 작성

docker-compose run~~ 있는데 굵은 글씨를 추가해줘야 함

yml 파일이 본인의 yml과 이름이 맞는지 확인

#!/bin/bash

if ! [ -x "$(command -v docker-compose)" ]; then
  echo 'Error: docker-compose is not installed.' >&2
  exit 1
fi

domains=(citistagram.com)
rsa_key_size=4096
data_path="./data/certbot"
email="본인이메일/깃로그인하는!" # Adding a valid address is strongly recommended
staging=0 # Set to 1 if you're testing your setup to avoid hitting request limits

if [ -d "$data_path" ]; then
  read -p "Existing data found for $domains. Continue and replace existing certificate? (y/N) " decision
  if [ "$decision" != "Y" ] && [ "$decision" != "y" ]; then
    exit
  fi
fi


if [ ! -e "$data_path/conf/options-ssl-nginx.conf" ] || [ ! -e "$data_path/conf/ssl-dhparams.pem" ]; then
  echo "### Downloading recommended TLS parameters ..."
  mkdir -p "$data_path/conf"
  curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf > "$data_path/conf/options-ssl-nginx.conf"
  curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem > "$data_path/conf/ssl-dhparams.pem"
  echo
fi

echo "### Creating dummy certificate for $domains ..."
path="/etc/letsencrypt/live/$domains"
mkdir -p "$data_path/conf/live/$domains"
docker-compose -f docker-compose.yml run --rm --entrypoint "\
  openssl req -x509 -nodes -newkey rsa:$rsa_key_size -days 1\
    -keyout '$path/privkey.pem' \
    -out '$path/fullchain.pem' \
    -subj '/CN=localhost'" certbot
echo


echo "### Starting nginx ..."
docker-compose -f docker-compose.yml up --force-recreate -d nginx
echo

echo "### Deleting dummy certificate for $domains ..."
docker-compose -f docker-compose.yml run --rm --entrypoint "\
  rm -Rf /etc/letsencrypt/live/$domains && \
  rm -Rf /etc/letsencrypt/archive/$domains && \
  rm -Rf /etc/letsencrypt/renewal/$domains.conf" certbot
echo


echo "### Requesting Let's Encrypt certificate for $domains ..."
#Join $domains to -d args
domain_args=""
for domain in "${domains[@]}"; do
  domain_args="$domain_args -d $domain"
done

# Select appropriate email arg
case "$email" in
  "") email_arg="--register-unsafely-without-email" ;;
  *) email_arg="--email $email" ;;
esac

# Enable staging mode if needed
if [ $staging != "0" ]; then staging_arg="--staging"; fi

docker-compose -f docker-compose.yml run --rm --entrypoint "\
  certbot certonly --webroot -w /var/www/certbot \
    $staging_arg \
    $email_arg \
    $domain_args \
    --rsa-key-size $rsa_key_size \
    --agree-tos \
    --force-renewal" certbot
echo

echo "### Reloading nginx ..."
docker-compose exec nginx nginx -s reload

3. nginx/nginx.conf

이전에 배포하고, 도메인 적용했을 때 이후라면 중복된 location부분이 삭제된 상태임을 알려드림

server {
  listen 80 default_server;
  server_name _;
  charset utf-8;
  client_max_body_size 100M;

  location /static/ {
    alias /django/static/;
  }
  
	location / {
    return 301 https://citistagram.com$request_uri;
  }
  
  location /.well-known/acme-challenge/ {
    root /var/www/certbot;
  }
}

server {
    listen 443 ssl;
    server_name _;

    location / {
        proxy_pass http://app:8000/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /static/ {
        alias /django/static/;
    }

    ssl_certificate /etc/letsencrypt/live/citistagram.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/citistagram.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

 


Ubuntu 연결

 ls  → 프로젝트 레포 확인

 cd 프로젝트 레포명 

 git checkout 브랜 치명 

 git pull  → 최신버전으로 유지

 sudo docker ps  → 컨테이너 확인

 sudo docker-compose down  → 인증서를 새로 발급받아야 하기 때문에 컨테이너를 내려줍니다.

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

 sudo chmod +x init-letsencrypt.sh 

 sudo ./init-letsencrypt.sh  → 실행

이 화면이 나와야 인증서 발급 성공

오류가 난다면 메세지 확인하여 수정하면 됩니다

 sudo docker-compose build 

 sudo docker-compose up 

 

이 화면에서 certbot 은 exit 되는 것은 정상

다른 컨테이너가 안내려가고 작동이 된다면 →

브라우저에 https 를 적용한 url 입력 후에 정상적으로 작동이 된다면 컨테이너와 이미지를 올립니다.

 sudo docker ps  → 컨테이너 확인

확인시 컨테이너 있을 경우 down 시켜주세요.

 sudo docker-compose up -d —build 

브라우저에서 https 보안설정 되어있는지 재확인하면 끝!

반응형

'PROJECTS' 카테고리의 다른 글

쿼리수 확인  (0) 2022.10.12
set_password | make_password | check_password  (0) 2022.09.08
도메인 연결  (0) 2022.09.05
RDS PostgreSQL 배포 과정  (0) 2022.09.02
AWS EC2 배포과정  (0) 2022.09.02