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 후 재배포하면 된다.

 

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

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

 

스크린샷 2023-04-23 오후 4.50.16.png

 

앱을 시작할 때 실행 되는 커맨드인 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 상태로 변하지 않으면 오류나 배포 준비 상태로 변경된다.

스크린샷 2023-04-23 오후 4.57.15.png

 

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

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

 

스크린샷 2023-04-23 오후 4.58.13.png

 

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