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 의 오타 등등 오탈자에 신경써서 천천히 꼼꼼하게
'Web > Django' 카테고리의 다른 글
| Django - Pagination (클래스형 뷰) (0) | 2019.08.05 |
|---|---|
| Django - Pagination (0) | 2019.08.02 |
| Django - Dstagram part4-아마존 S3 연동하기(이미지 서버) (0) | 2019.07.23 |
| Django - Dstagram part3-댓글 기능 구현하기 (0) | 2019.07.23 |
| Django - Dstagram part2-Account app (0) | 2019.07.18 |
댓글