CloudType에 DRF 서버 배포하기 Django Restfull API

 

서버를 배포하기 위해서 무료로 서버를 배포할 수 있는 클라우드 타입을 사용했다.

 

https://help.cloudtype.io/guide

 

클라우드타입 이용가이드

클라우드타입을 처음 사용하시나요? 아래의 가이드를 따라 클라우드타입을 사용하세요! 그럼 시작해볼까요? 😃

help.cloudtype.io

 

 

1. 준비 단계

 

- django 버전 업그레이드 

 

장고 버전이 3.2 미만이라면 3.2 이상으로 버전을 업그레이드 해주어야 한다.

 

pip install --upgrade django==3.2

 

- 배포용 패키지 설치 

 

pip install django-cors-headers gunicorn whitenoise django-environ
  • gunicorn : 프로젝트가 서버 상에서 계속 구동되도록 도와주는 서버 엔진 관련 
  • whitenoise : 정적 파일들의 사용을 도와주는 미들웨어 
  • django-environ : Django 프로젝트에서 환경변수를 설정하고 사용하기 위함
  • django-cors-headers : CORS 에러 방지

 

2. 외부 패키지 목록 제작

 

앱에 사용된 패키지 목록을 외부 패키지 목록으로 만들어야 한다.

 

* 주의 : 토큰 패키지 충돌 오류 *

 

https://www.notion.so/ImportError-cannot-import-name-InvalidKeyError-from-jwt-exceptions-13d23c0dbcd849de8f3cecaddafcf86b

 

ImportError: cannot import name 'InvalidKeyError' from 'jwt.exceptions’

네임 스페이스 충돌 오류

www.notion.so

 

노션에 오류 해결 기록을 한 것인데,

jwt와 PyJWT의 패키지가 선언되어 있다면 충돌 오류가 발생한다.

이 경우 jwt 토큰이 PyJWT보다 먼저 적용되므로 반드시 둘 중 하나의 패키지를 uninstall로 제거해야 한다.

이 후에 아래 명령어를 실행한다.

 

pip freeze > requirements.txt

 

3. settings.py 수정

 

DEBUG = False

ALLOWED_HOSTS = ['*']

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True

 

* 주의 : DEBUG 설정 *

 

배포 시에는 꼭 debug=false로 설정해야 하며, True일 경우 아래 오류가 발생한다.

django.template.context_processors.debug

 

 

- 앱 추가

INSTALLED_APPS = [
		...
    'corsheaders',
]

 

- 미들웨어 추가

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware', ## 이거 추가!! 위치 중요!!!
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware', ## 이거 추가!!
]

 

4. 환경 변수 분리하기

 

앱 보안을 위해서 환경 변수를 분리해야 한다.

환경변수를 세팅하는 방법에는 다양한 방법이 있는데 가장 간단한 방법을 사용했다.

환경변수 분리를 통해서 디버그 정보와 비밀키를 관리한다.

 

# 환경변수 세팅 
env = environ.Env(DEBUG=(bool, False))
environ.Env.read_env(
    env_file=os.path.join(BASE_DIR, '.env')
)
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static") # 정적 파일 경로 지정 & 모으기

 

 

SECRET_KEY = env('SECRET_KEY')
DEBUG = env("DEBUG")

 

프로젝트 내부의 .env 파일에 비밀키와 디버그 정보를 외부에 저장한다.

이 후에 앱을 등록할 때 비밀키 정보를 추가해야 하므로 비밀키는 따로 기억하고 있어야 한다.

 

5. 정적 파일, 미디어 파일 경로 지정 

 

 

배포 후에 정적 피알과 미디어 파일 경로를 읽기 위해서는 따로 설정을 지정해야 한다.

 

- BASE_DIR 지정

BASE_DIR = Path(__file__).resolve().parent.parent

 

- 정적 파일 지정 

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static") # 정적 파일 경로 지정 & 모으기

 

- 미디어 파일 지정 

# 절대 경로로 이미지로 접근
# http://http://127.0.0.1:8000/media/현재날자/이미지.jpg
MEDIA_URL = '/media/'

# MEDIA FILE의 경로 설정 - Upload된 파일들이 저장되는 위치를 지정
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

 

이 후에 경로를 url에 등록해주어야 한다.

이전에 MEDIA 경로를 지정할 때 사용한 방식을 제거하고 새로 작성한다.

# 배포 전 방식
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

from django.conf.urls.static import static
from django.views.static import serve
from django.urls import re_path

# 배포 후 방식 
urlpatterns = [
 	.
    .
    .
    re_path(r'^media/(?P<path>.*)$', serve, {'document_root':settings.MEDIA_ROOT}),
    re_path(r'^static/(?:.*)$', serve, {'document_root': settings.STATIC_ROOT, }),

]

 

6. 클라우드 타입 가입후 앱 등록

 

클라우드 타입에서는 Github 계정 연걸을 통해서 배포를 해야한다.

깃허브 계정과 연동되어 있으므로 앱을 수정할 때 원격 저장소로 push 후 재배포하면 된다.

 

프로젝트를 생성하고 앱을 배포하며 환경 변수를 설정해야 한다.

위에서 작성한 비밀키를 등록해준다.

 

 

앱을 시작할 때 실행 되는 커맨드인 Start Command 와 Pre Start Command를 작성한다.

 

  • Pre Start Command
    • python3 manage.py makemigrations && python3 manage.py migrate 
  • Start Command
    • python3 manage.py runserver 0:8000

https://www.notion.so/django-db-utils-OperationalError-no-such-table-fb6642914fc74d50b6d4c9c40e6fd53d

 

django.db.utils.OperationalError: no such table

drf 서버에서 url 요청시 발생

www.notion.so

 

테이블 조회가 안되는 경우 DB 씽크를 맞춰줘야 한다. 

migrate 코드를 python manage.py migrate --run-syncdb로 변경한다.

 

 

7. 배포하기

 

성공적으로 배포 빌드가 완료 되면, Running(실행 중) 상태로 변경된다.

10분 이상 경과해도 Running 상태로 변하지 않으면 오류나 배포 준비 상태로 변경된다.

 

오류 사항이 있어서 앱이 실행 안되는 경우인데, 제일 오른쪽 아이콘을 클릭해서 실행 로그를 확인하면,

앱을 개발할 때처럼 터미널을 통해서 오류 상황을 확인할 수 있다.

 

 

위와 같은 상태로 변하면 성공적으로 앱이 배포된 상태이며, 접속하기를 통해서 등록 된 도메인을 확인할 수 있다.