NullNull

Django 서비스 배포 (10) - 프로젝트 배포 실습 본문

Django

Django 서비스 배포 (10) - 프로젝트 배포 실습

KYBee 2022. 8. 4. 23:49

해당 글은 비전공자를 위한 개발 동아리 피로그래밍에서 진행했던 세션의 정리본 입니다.

 

프로젝트 가져오기

자 그러면 서버에 가상환경도 깔았고 접속도 했으니 우리는 우리의 프로젝트를 서버로 옮겨 줘야 합니다. 이럴때 사용하는 것이 바로 Github 입니다!

 

 

Github으로 이동해서 여러분들이 clone 할 서버를 가져와 주세요! 이번 세션은 연습이 목적이므로 모두가 같은 레퍼지토리를 클론하겠습니다. 이걸 클론 해주세요!

 

GitHub - KYBee/DeploymentSessionPiro17: 피로그래밍 17기 프로젝트 배포 세션 실습 자료

피로그래밍 17기 프로젝트 배포 세션 실습 자료. Contribute to KYBee/DeploymentSessionPiro17 development by creating an account on GitHub.

github.com

 

 

아래의 명령어를 차례대로 실행하시면 됩니다.

$ git clone <https://github.com/KYBee/DeploymentSessionPiro17.git>

$ cd DeploymentSessionPiro17

$ python3 -m venv venv

$ pip3 install -r requirements.txt

 

 

그럼 우리가 클론한 프로젝트도 서버에 올렸고, 필요한 requirements.txt 역시 다운을 받은 상태입니다. 여기까지 완료하셨으면 아래의 명령을 실행 해주세요.

$ python3 manage.py makemigrations

$ python3 manage.py migrate

$ python3 manage.py runserver 0.0.0.0:8000
# 여기서 0.0.0.0:8000을 꼭 적어주셔야 합니다.
# 0.0.0.0이 의미하는 것은 어떤 IP에서도 모두 접속을 허용한다는 의미입니다.
# 즉 여러분들이 어떤 IP 주소를 가지고 있던 모든 접속을 허용한다고 생각하시면 됩니다. 

 

 

이 화면이 나오면 된 겁니다.

이제 여러분의 브라우저에서 [여러분들의 IP]:8000을 입력하신다면 아래와 같은 화면이 보이실 겁니다!

스크린샷 2022-08-04 오후 11 17 06 스크린샷 2022-08-04 오후 11 17 34

 

축하드려요 방금 배포를 완료했어요!!
이제 여러분들의 개인 레퍼지토리도 git clone 받으셔서 한번 실습 해보세요!


 

배포 전 확인 사항

여러분들이 1달동안 개발한 서비스를 실제 배포하기 전에 몇 가지 체크할 내용들이 있습니다. 아래 장고 공식 문서를 읽어보시면 점검 사항을 리스트로 볼 수 있습니다.

 

Deployment checklist | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

또한 Django는 아래의 명령어를 제공하여 실제 배포 전에 준비가 되었는지 확인해주는 기능도 제공합니다.

python3 manage.py check --deploy

 

 

지금은 그 중에서도 필수로 바꾸셔야 하는 3가지의 내용을 언급하려 합니다.

필수 점검 사항은 다음과 같습니다.

 

 

1. SECRET_KEY 분리하기

 

SECRET_KEY는 뭔가 이름만 들어도 공개되면 안될 것 같죠. 실제로 Django 공식 문서에서도 하드코딩 되어있는 SECRET_KEY를 공개되지 않도록 수정하라고 강조합니다. 여러분의 프로젝트의 settings.py를 확인해보면 지금은 그 SECRET_KEY가 공개되어 있을 거에요. 배포 하시기 전에 이 부분에 대한 처리를 꼭 해주셔야 하고 저는 이런 변수를 담아둘 secret.json이라는 파일을 하나 만들어서 settings.py에서 필요한 내용을 그 파일에서 읽어가도록 하겠습니다.

 

우선 SECRET_KEY를 담아둘 secret.json 파일을 만들겠습니다. 당연히 .gitignore에 secret.json을 추가해서 이 파일이 Github으로 올라가지 않도록 하셔야 합니다. 배포한 이후에는 서버에서 직접 같은 내용의 파일을 만드시거나, scp등의 별도 파일 전송 프로토콜을 사용하셔서 secret.json을 생성해서 배포해주세요. 아래 사이트는 Django의 SECRET_KEY를 생성해주는 사이트 입니다.

 

Django Secret Key Generator

Django Secret Key Generator

miniwebtool.com

 

secret.json

{
	"SECRET_KEY" : "", 
}

 

그 다음 settings.py에서 이 파일을 읽어서 SECRET_KEY를 Django가 필요로 할 때 전달하도록 코딩하겠습니다. 이를 위해서 json과 ImproperlyConfigured를 import 해주세요. 아래의 모든 코드는 settings.py에 작성하시면 됩니다.

# json, ImproperlyConfigured 추가 -> 배포 전 SecretKey 부분을 수정하기 위해서

import os, json
from django.core.exceptions import ImproperlyConfigured

 

이제 secret.json이 어디에 있는지를 Django에게 알려줄게요. BASE_DIR에 secret.json을 위치한 뒤, BASE_DIR에 있는 secret.json을 가져오도록 하는 명령이 아래 코드 입니다.

# BASE_DIR은 manage.py가 있는 곳
secret = os.path.join(BASE_DIR, 'secret.json')
with open(secret) as f:
    secrets = json.loads(f.read())

 

파일에서 읽어온 json 객체에서 keyword를 key 값으로 전달하여 그에 맞는 value를 가져오도록 할게요. 아래의 코드처럼 get_secret이라는 메서드를 정의해서 이를 구현했습니다.

def get_secret(keyword, secrets=secrets):
    try:
        return secrets[keyword]
    except KeyError:
        raise ImproperlyConfigured("No variable : {}".format(keyword))

 

마지막으로 SECRET_KEY 변수에 json에 저장되어 있던 SECRET_KEY 값을 저장합니다. 끝입니다!

SECRET_KEY = get_secret("SECRET_KEY")

 

 

 

 

2. DEBUG 모드 변경

운영되는 서버에서는 절대로 DEBUG 모드를 True로 해두시면 안됩니다. DEBUG를 True로 해두시면 사용자가 잘못된 입력을 했거나 서버에 문제가 생겼을 때 어떤 문제가 있는지 보여주게 됩니다.

 

여러분들이 서비스를 개발하는 단계에서는 이러한 에러 메시지들을 활용해야해서 DEBUG를 True로 했지만, 배포 이후에는 웹 서비스의 취약점을 드러내는데 이용될 수 있습니다. 따라서 DEBUG 모드를 꺼두어 잘못된 요청이 들어와도 이런 화면이 보이도록 해야 합니다.

 

3. ALLOWED_HOST 변경

DEBUG 모드에서는 ALLOWED_HOST를 빈 리스트로 설정해도 문제없이 동작했습니다. 하지만 DEBUG가 False 즉 위 2번 조치를 취한 이후에는 ALLOWED_HOST가 빈 리스트로 되어 있다면, 아무도 해당 서비스에 접근할 수 없게 됩니다. 따라서 값을 *으로 변경하여 모두가 접근할 수 있도록 설정합니다. 이후에 특정 클라이언트에서만 요청을 허용하고 싶다면 *를 지우시고 리스트에 그 클라이언트의 IP 주소를 적으시면 됩니다.

 

settings.py

ALLOWED_HOST = ['*']

 

 

 

 

추가로 변경할 내용들은 위의 공식 문서에 추가적으로 나와있습니다. 이번 발표를 위해서는 굳이 바꾸시지 않으셔도 좋지만 이후에 변경하길 추천 드리는 것은 DB 입니다.

 

현재 DB는 Django에서 제공하는 SQLite를 사용하고 계실텐데요. 차후에는 이를 MySQL, PostgreSQL 등 다른 SQL로 바꾸어서 사용해보시길 권장드립니다. 일단 DB를 바꾸는게 크게 어렵지 않구요, DB setting 코드만 바꾸면 알아서 연동이 되는 구조라 여러분들이 작성한 프로젝트 코드들을 수정하실 필요도 없습니다. 작은 단위 프로젝트라면 SQLite도 문제 없겠지만, 미래를 위해 미리 구축한다는 생각으로 수정해두시면 좋을 것 같아요.

 

DB를 바꾸기 위해서도 SECRET_KEY를 분리했던 것 처럼 DB_SETTING 값들을 secret.json에 저장해야 합니다. 감이 안오실 것 같아서 예시 코드를 첨부해 드릴게요!

 

settings.py

import pymysql
pymysql.install_as_MySQLdb()

...

# DB 관련 세팅을 아래처럼 수정하시면 됩니다.
DB_ENGINE = get_secret("DB_ENGINE")
DB_NAME = get_secret("DB_NAME")
DB_USER = get_secret("DB_USER")
DB_PASSWORD = get_secret("DB_PASSWORD")
DB_HOST = get_secret("DB_HOST")
DB_PORT = get_secret("DB_PORT")
DATABASES = {
    'default': {
        'ENGINE': DB_ENGINE,
        'NAME': DB_NAME,
        'USER': DB_USER,
        'PASSWORD': DB_PASSWORD,
        'HOST': DB_HOST,
        'PORT': DB_PORT,
    }
}

...

 

secret.json

{
	"SECRET_KEY" : "", 
	"DB_ENGINE" : "", 
	"DB_NAME" : "", 
	"DB_USER" : "", 
	"DB_PASSWORD" : "", 
	"DB_HOST" : "", 
	"DB_PORT" : "" 
}

 

Comments