Django - Dstagram part5-배포하기 헤로쿠(Heroku)
Web/Django

Django - Dstagram part5-배포하기 헤로쿠(Heroku)

뉴비뉴 2019. 7. 23.

1. 헤로쿠 가입 

2. 윈도우에 툴 킷 설치

 

3. 프로젝트에 추가 모듈 설치

$ pip install dj-database-url # 데이터베이스 환경 변수를 설정할 수 있게 도와주는 유틸리티입니다.

$ pip install gunicorn # wsgi 미들웨어입니다.

$ pip install whitenoise # 정적 파일의 사용을 돕는 미들웨어 입니다.

$ pip install psycopg2-binary # PostgreSQL 사용을 위한 모듈입니다.

 

네 가지의 추가 모듈을 다 설치했다면 프로젝트에 설치된 모든 모듈의 목록을 파일로 생성하겠습니다.

$ pip freeze > requirements.txt # 명령을 실행하면 requirements.txt 파일이 생성되고 그 안에는 프로젝트에 사용된

모듈 목록이 들어있습니다.

boto3==1.9.193
botocore==1.12.193
dj-database-url==0.5.0
Django==2.2.3
django-disqus==0.5
django-storages==1.7.1
docutils==0.14
gunicorn==19.9.0
jmespath==0.9.4
mock==3.0.5
Pillow==6.1.0
psycopg2-binary==2.8.3
python-dateutil==2.8.0
pytz==2019.1
s3transfer==0.2.1
six==1.12.0
sqlparse==0.3.0
urllib3==1.25.3
whitenoise==4.1.3

settings.py

"""
Django settings for config project.
Generated by 'django-admin startproject' using Django 2.1.3.
For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
"""

import os
import dj_database_url

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = ''

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = ['*']


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'photo',
    'accounts',
    'disqus',
    'django.contrib.sites',
    'storages',
]

MIDDLEWARE = [
    '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',
]

ROOT_URLCONF = 'config.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'config.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
DATABASES['default'].update(dj_database_url.config(conn_max_age=500))


# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'staticfiles')

AWS_ACCESS_KEY_ID = 'ACCESS_KEY_ID'
AWS_SECRET_ACCESS_KEY = 'SECRET_ACCESS_KEY'
AWS_REGION = 'ap-northeast-2'
AWS_STORAGE_BUCKET_NAME = 'BUCKET_NAME'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.%s.amazonaws.com' % (AWS_STORAGE_BUCKET_NAME,AWS_REGION)
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}

DEFAULT_FILE_STORAGE = 'config.asset_storage.MediaStorage'

MEDIA_URL = '/media/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')


LOGIN_REDIRECT_URL = '/'

DISQUS_WEBSITE_SHORTNAME = 'dstagram-django'
SITE_ID = 1

확장자 없는 Procfile을 생성해준다.

web: gunicorn config.wsgi

 

runtime.txt

python-3.7.3 # 현재 사용하고있는 python 버전을 입력해준다.

 

헤로쿠에 업로드

$ heroku login # 로그인 

이제 깃 명령을 이용해 소스코드를 업로드 합니다. 우선 .gitignore 파일을 만들어 업로드 하지 않을 파일 목록을 만들겠습니다.

 

.gitignore

*.pyc

*~

/venv

__pycache__

db.sqlite3

.DS_Store

 

으로 프로젝트 소스 코드를 관리하기 위한 명령을 입력한다.

$ git init # 새로운 저장소 만들기 .git

$ git add -A # 변경 된 파일은 해당 명령어로 추가할 수 있다.

$ git commit -m "heroku upload" 하지만 실제로 변경 내용을 확정하려면 해당 명령을 내려야한다.

# 이제 변경된 파일이 HEAD 에 반영되었다, 하지만 아직 heroku 에는 반영되지 않았다.

 

헤로쿠에 dstagram-django 라는 리포지터리를 생성해준다.

$ heroku create dstagram-django

 

발행(push) 하기

$ git push heroku master # 아까 commit 까지의 내용은 HEAD 안에 머물고 있었다. 해당 명령어를 실행하여

# 원격 서버로 올려보자.

 

설정을 제대로 했다면 중간 오류 없이 업로드가 끝난다. 헤로쿠는 업로드 함과 동시에 requirements.txt 를 참고로 모듈들을 설치하고 각종 설정을 자동으로 진행한다.

 

헤로쿠 초기화

$ heroku run python manage.py migrate

데이터베이스를 초기화 했으니 관리자 계정도 생성해보겠습니다.

$ heroku run python manage.py createsuperuser

$ heroku open # 작동이 잘 되는지 홈페이지를 띄워보자!!

 

github 업로드하기

$ git remote add origin https://github.com/2044smile/dstagram.git

 

$ git commit -m "~"

 

$ git push -u origin master

 

 

 

 

 

 

[삽질]

1. ETIMEDOUT: connect ETIMEDOUT 50.19.103.36:5000

$ heroku ~ 실행 시 위와 같은 타임아웃 에러 발생 아래 깃허브에서 해결방법 찾았고, 해당 해결방법은

방화벽에서 포트번호 5000을 오픈해주는 것이였음

https://github.com/heroku/heroku-repo/issues/51

 

2. DISQUS_WEBSITE_SHORTNAME = 'dstagram-django'

' ' 부분을 내가 생성한 웹사이트 주소를 지정한 것이 아닌 이상한 주소를 지정하여 DISQUS 가 제대로 실행되지 않았음

git 에 대한 지식도 부족하여 코드는 수정하였으나 업로드하는 것에 구글링하여 아래 사이트에서 해답을 찾음

https://rogerdudler.github.io/git-guide/index.ko.html

 

3. 오탈자

settings.py 에서의 오탈자, requirements.txt 의 오타 등등 오탈자에 신경써서 천천히 꼼꼼하게

댓글

💲 추천 글