메모리즈 프로젝트의 ver 0.1을 마무리하였다.

스파르타 코딩클럽 마지막에는 3주동안 프로젝트 기간이 있다.
그 기간동안 각자 만들고 싶었던 프로젝트를 진행한다.

튜터를 진행하면서, 조금 욕심을 내어서 나도 함께
그 동안 마음에만 담아 두었지 진행하지 못했던 프로젝트를 함께 진행하였다.

워낙 간단한 프로젝트로 진행하여서,
프로토 타입도 간단하다.

그래도 그 동안 생각만 하던 프로젝트의 1차 버전을 마무리 할 수 있어서
첫 발을 내딛였다고 생각한다. 

앞으로 더욱 이런 프로젝트들을 많이 해보고 싶다.
이제 vue.js를 공부해서 프론트를 만들어봐야 겠다.

 

모델링 작업 진행

 

사진을 올릴 수 있어야 한다.

content

  1. 올린 사람 => 회원과 연결되어야 할 것이고

  2. 사진 => 여러개를 올릴 수 있도록 할꺼면 따로 모델을 뺀다.

  3. 글 적을 수 있도록 한다.

  4. 꼭 사진이 아니라도 글만 적을 수도 있도록 한다.

  5. 관리자가 언제든지 지울 수 있도록 한다.

    1. 관리자는 해당 페이지를 신청자이다.

 

해당 컨텐츠에 댓글을 달 수 있도록 한다.

  1. 익명으로 진행할 것인지

 

해당 올린 사진을 feed로도 볼 수 있고, 모아서 볼 수도 있다.

 

무조건 웹에서 할 것이다.

  1. why? 개별 링크 생성가능 해당 링크로 누구나 언제든지 접속 할 수 있도록.

  2. 그럼 추후에 개별 링크는 어떻게 생성할 것인가? 신청은 어떻게 할 것인가?

 

[모바일 홈페이지 파일업로드 갤러리 사용 - accept="image/*" : 네이버 블로그](https://m.blog.naver.com/PostView.nhn?blogId=oralol&logNo=220263644181&proxyReferer=https%3A%2F%2Fwww.google.com%2F)

 

스파르타코딩 클럽 수업을 하며, 나 역시도 프로젝트를 진행하기로 마음 먹었다.

3주 동안의 기한내에 그동안 진행하고 싶었던 프로젝트를 진행해볼 예정이다.

1. 프로젝트 이름

프로젝트 이름은 "메모리즈"이다. 
작년에 굉장히 슬픈 일이 있었다. 나와 정말 가까운 분이 먼저 세상을 떠나셨다.

지금도 한달에 한 번씩은 꼭 보고싶다. 
무엇보다 더 슬픈 점은 나에게 사진이 하나도 없다는 사실이다...

폰도 바꾸고, 또 매번 명절 때마다 보다보니, 사진을 찍어야 겠다는 생각을 하지 못했다. 

나에게는 추억할 게 없다...

원피스에 이런 말이 나온다.

"사람이 언제 죽는다고 생각하니, 

심장이 총알에 뚫렸을 때? 아니

불치의 병에 걸렸을 때? 아니

맹독의 스프를 마셨을 떄? 아니야

사람들에게서 잊혀졌을 때다"

 

너무 소중한 사람이었기에,
잊지 않기 위해 평생 혼자 기억만 곱씹다가
갑자기 막 보고 싶어지면 어떻게 해야 할까?

 

나중에 시간이 너무 많이 흘러서
더 이상 기억이 나지 않으면 어떻게 해야 할까?

그러지 않았으면 좋겠다.. 그래서 이 프로젝트를 진행한다.

2. 구상도

이 생각을 든 이후에 찾아보니 해외에서 굉장히 잘 만든 서비스가 있었다.
따라서 전체적인 형태는

[200만 명이 사용하는 부고 앱 | 1boon](https://1boon.kakao.com/ttimes/ttimes_1907110907

불러오는 중입니다...

를 따라 가려고 한다.

 

3. 개발 해야 하는 기능들

생각 보다 심플하다. 요청에 따라 (아마 가족) 개개인의 개별 공간을 만들어 줘야 한다. (개별 링크 생성)
그리고 사진 등록과 함께, 댓글을 남길 수 있어야 한다.

또한 방명록과 같은 글을 남길 수 있어야 하며,
글들을 모아서, 피드보기와 같이 보여줄 수 있어야 한다.

 

4. 개발 계획

상세 기획 : XD 활용 (금주까지 진행)

프론트 개발 : 1주일 진행

서버 개발 : 1주일 진행

기타 수정 : 1주일 진행

개발 기한 : 4월 8일 ~ 4월 28일까지 약 20일간... 너무 짧네 @.@

 

이제 이렇게 적었으니깐... 무조건 해야한다. 열심히 해보자! 화이팅

장고에서 

생성 시점의 시간을 기록하기 위해서는 2가지 방법이 있다.

(생성 시점 field를 reg_time)이라고 하자

첫 번째

class Post(models.model):
    reg_time = models.DateTimeField(auto_now_add=True)

 

두 번째

import datetime
class Post(models.model):
    reg_time = models.DateTimeField(default=datetime.datetime.now)

 

위와 같이 2가지 방법으로 reg_time을 설정해줄 수 있다.

추가 : 

여기서 default=datetime.datetime.now()를 하게 되면

함수를 실행시켜서 반환하는 값을 전달하게 되므로, 제대로 값이 전달 될 수 없다.

 

참고 : 

[python-장고 날짜 시간 문제 (default = datetime.now ())](https://stackoverflow.com/questions/2771676/django-datetime-issues-default-datetime-now)

 

추가 이슈 : 

실제 고객이 사용하고 있는 서비스(DB)에서 reg_time을 모델에 추가해주려고 할 때,

일단 db에서 먼저 migrate를 해주게 되면, 해당 DB를 생성할 때 아직 모델에 해당 reg_time을 어떻게 넣어라는 내용이 없으므로

"Field 'reg_time' doesn't have a default value") 라는 에러가 생긴다.

그럼 먼저 API 서버에 코드를 먼저 배포해주면, reg_time이라는 필드가 DB에 생성되지 못해서 에러가 발생한다....

어떻게 해야할지 고민이다.

 

대괄호 : [] , 중괄호 : {}  , 소괄호 : () 

대괄호 =>[] 

  • list를 나열 할 때

  • list의 인덱스를 지정해줄 때 ex) mise[0], mise[1]

 

중괄호 => {}

  • dictionary를 만들 때 {'key': 'value'}

  • style tag를 적용해줄 떄 ex) .commet { 적용해줄 것 }

  • 특정 function에 대해 정의해줄 때 ex). function openclose() { 실행 할 것 }

  • for문의 조건문 뒤에 실행할 것을 적어 줄 때 for (i=0; i<100; i++) { 실행 할 것 }

  • if문 뒤에 실행 할 것을 적어 줄 때 if ( a > b ) { 실행 할 것 }

 

소괄호 => ()

  • for문의 특정 조건을 적어줄 때 ex) for (i=0; i<100; i++) 

  • if문의 특정 조건을 적어 줄 때 ex) if ( a >b )

  • jquery 선택자를 적어줄 때(특정조건) $('#names-q7')

  • 함수 이름 바로 뒤에 (매개변수가 들어갈 위치) function openclose() => ()여기에는 특졍 매개변수가 들어갈 수 있다.

 

위와 같이 정리가 될 수 있겠네요.

위와 같이 적고 보니 어느정도 규칙이 보이는 것 같아요.

일단 기본적으로 list를 만들 때는 대괄호, 그리고 그 list의 특정 인덱스를 뽑아 줄 때도 대괄호를 쓰니

대괄호는 list와 굉장히 밀접하다고 생각하시면 되겠네요.

 

중괄호와 소괄호는 함께 보면 좋을 것 같은데요.

소괄호는 if문 for문 jquery의 선택자 등 보통 실행할 조건을 적어주는 경우가 많네요. 

그리고 중괄호는 그 소괄호 뒤에 나와서 실행할 조건이 맞으면 실행할 것을 적어주는 위주로 사용하고 있습니다.

저도 익숙해서 그냥 사용을 했는데, 이렇게 정리하고 나니 조금은 큰 규칙이 있는 것 같습니다.

해당 글은 celery documentation을 보고 정리한 것입니다. 원문은 [First steps with Django — Celery 4.4.1 documentation](http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html)

불러오는 중입니다...

여기에 있습니다.

django-celery-results 

=>using the django orm/cache as a result backend  

django-celery-result extions은 django orm또는 django cache 프레임워크를 사용하여 결과 백엔드를 제공한다.

$ pip install django-celery-results

pip를 통해 django-celery-results를 설치해준다.

그리고 INSTALLED_APPS에 추가해준다.

INSTALLED_APPS = (
    ...,
    'django_celery_results',
)

이후에 migrate를 통해 django_celery_results를 생성해준다.

python manage.py migrate django_celery_results

이후에 django setting에 celery 구성을 추가해준다.

CELERY_RESULT_BACKEND = 'django-db'

# 만약에 cache도 사용할 것이면
CELERY_CACHE_BACKEND = 'django-cache'

# cache 셋팅또 추가할 수 있다.
# celery setting.
CELERY_CACHE_BACKEND = 'default'

# django setting.
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'my_cache_table',
    }
}

해당 글은 Celery 4.4.1 documentation을 읽으면서 혼자 정리한 글입니다.

원문은 [First steps with Django — Celery 4.4.1 documentation](https://docs.celeryproject.org/en/stable/django/first-steps-with-django.html)

불러오는 중입니다...

여기에 있어요!

 

django에서 샐러리 활용하기

먼저 celery를 django prodjct에서 쓸려면 Celery library를 정의해줘야 한다.

일반적으로 모델링을 아래와 같이 했다고 가정한다.

- proj/
  - manage.py
  - proj/
    - __init__.py
    - settings.py
    - urls.py

이럴 경우 proj/proj/celery.py 라는 파일을 새로 만들고 여기에 celery instance를 정의해주는 것을 추천한다.

proj/proj/celery.py

from __future__ import absolute_import, unicode_literals

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

해당 파일에 이렇게 작성을 해주고 하나씩 알아보자. 아 이것을 알아보기 전에 먼저 proj/proj/__init__.py module을 작성해줘야 한다. init.py를 작성해주면 이것은 django가 시작했을 때, app을 load해주고, @shared_task decorator를 사용가능하게 되는 것을 보장한다.

proj/proj/init.py

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

이제 celery.py에 있는 것을 하나씩 보자

from __future__ import absolute_import

이것은 celery.py module이 import 될 때 다른 library와 충돌되지 않도록 해준다.

그 이후에 DJANGO_SETTINGS_MODULE의 환경 변수를 설정해준다.

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

이 줄이 꼭 필요한 것은 아닌데, 이것을 해주면 항상 설정 모듈이 셀러리 프로그램으로 전달하지 않아도 된다.

app = Celery('proj')

이것은 우리의 libary instance를 이야기 해주는데, 많은 인스턴스를 가질 수 있지만 django를 사용할 때는 이유가 없다.

=> 이해가 안되네??

이제 django setting module을 샐러리 구성에 더해줘야하는데, 이것이 의미하는 것은 너는 복수의 구성 파일을 가질 필요가 없고, 대신에 django setting에서 celery 구성을 바로 할 수 있다. 하지만 너가 원하면 분리할 수도 있다.

app.config_from_object('django.conf:settings', namespace='CELERY')

위에 namespace를 설정해준 것은 celery 구성 옵션들이 모두 앞에 CELERY_가 붙게 되는 것을 의미한다. 예를 들면 broker_url 을 setting하면 이게 CELERY_BROKER_URL로 표시될 것이다. 이것은 worker setting에서도 적용되고, worker_concurrency가 CELERY_WORKER_CONCURRENCY로 표시 될 것이다.

그리고 일반적인 사항으로 재사용 가능한 앱은 모두 tasks.py에 빼서 정의하는 것이다. 그리고 celery에서는 이것은 자동적으로 찾아주는 모듈을 가지고 있다. => tasks.py에 celery tasks에서 반복적으로 재사용할 앱을 정의하라

app.autodiscover_tasks()

위의 줄을 추가해주면 celery가 자동적으로 tasks를 찾는데, 우리가 설치되어 있는 앱에서 찾는다. 

- app1/
    - tasks.py
    - models.py
- app2/
    - tasks.py
    - models.py

 위와 같은 형태라면 celery에서 import 해주지 않아도, 알아서 tasks를 celery가 찾는다.

Using thr @shared_task decorator

재사용 가능한 app은 단지 한 프로젝트에 국한 되지 않을 것이고, 그래서 앱 instance를 다이렉트로 import 해줄 수가 없다. 

하지만 @shared_task 데코레이터는 앱 인스턴스에 국한되지 않고 tasks를 생성해준다.

예를 들어보면 아래와 같다.

from __future__ import absolute_import, unicode_literals

from celery import shared_task
from demoapp.models import Widget


@shared_task
def add(x, y):
    return x + y


@shared_task
def mul(x, y):
    return x * y


@shared_task
def xsum(numbers):
    return sum(numbers)


@shared_task
def count_widgets():
    return Widget.objects.count()


@shared_task
def rename_widget(widget_id, name):
    w = Widget.objects.get(id=widget_id)
    w.name = name
    w.save()

 

# 추가 

작업 모듈을 가지고 오는데 일관성이 있어야 한다.

예를 들어 INSTALLED_APPS에 project.app가 있는 경우 project.app에서 작업을 가져와야 한다. 그렇지 않으면 작업 이름이 달라지게 된다.

2019.06.05 EC2에 장고 서버 설정하기

EC2에 장고 서버 설정하기

EC2에 장고 서버 셋팅하기

01. VIM 설치

  • sudo apt-get install vim

02. 파이썬 관련 패키지 설치

  • sudo apt-get install python3-dev python3-venv python3-pip

03. django 애플리케이션 구동용 계정을 생성합니다.

  • sudo useradd -b /home -m -s /bin/bash django

04. www-data 그룹에 django 유저를 추가합니다.

  • sudo usermod -a -G www-data django

05. FTP로 업로드 할 때 ubuntu 계정을 사용하기 때문에, 애플리케이션 소스코드 폴더에 쓰기 권한을 얻기 위해 www-data 그룹에 ubuntu 유저를 추가합니다.

  • sudo usermod -a -G www-data ubuntu

06. 소스코드를 업로드 하기 위한 폴더를 만듭니다.

  • sudo mkdir -p /var/www/django
  • -p는 사이경로를 모두 만들어준다.

07. 소스코드 업로드 폴더의 소유자 변경

  • sudo chown django:www-data /var/www/django

08. 소스코드 폴더에 그룹 쓰기 권한을 부여

  • sudo chmod -R g+w /var/www/django

09. 가상 환경을 소스코드 폴더 밑에 만듭니다.

  • sudo python3 -m venv /var/www/django/venv

10. 관리자 모드로 변경 이후 가상 환경 활성화

  • sudo -s
  • source venv/bin/activate

11. 가상 환경에 장고 설치 및 프로젝트 생성

  • pip install django
  • django-admin startproject config .
  • python manage.py migrate

12. WSGI 모듈 중 하나인 uwsgi 설치

  • pip install uwsgi

13. uwsgi 동작확인

  • uwsgi --http :8000 --home /var/www/django/venv/ --chdir /var/wwww/django/ --module config.wsgi
  • DisallowedHost 확인하기
    • DEBUG 상태 및 allow host 조정 필요

14. UWSGI 모듈을 위한 폴더를 만듭니다.

  • sudo mkdir /var/www/django/run

  • sudo mkdir /var/www/django/logs

  • sudo mkdir /var/www/django/ini

  • 현재 해당 폴더에 있으면

  • sudo mkdir sudo mkdir run logs ini

15. 폴더의 소유권 변경

  • sudo chown django:www-data rrun
  • sudo chown django:www-data logs

16. uwsgi.ini 파일을 작성해줍니다.

  • sudo vim /var/www/django/ini/uwsgi.ini
[uwsgi]
uid = django
base = /var/www/django

home = %(base)/venv
chdir = %(base)
module = config.wsgi:application
evn = DJANGO_SETTINGS_MODULE=config.settings

master = true
processes = 5

socket = %(base)/run/uwsgi.sock
logto = %(base)/logs/uwsgi.log
chown-socket = %(uid):www-data
chmod-socket = 660
vaccume = true

17. uwsgi.service 파일 생성 및 작성

  • sudo vim /etc/systemd/system/uwsgi.service
[Unit]
Description=uWSGI Emperor service

[Service]
ExecStart=/var/www/django/venv/bin/uwsgi --emperor /var/www/django/ini
User=django
Group=www-data
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
StandardError=syslog

[Install]
WantedBy = multi-user.target

18. uwsgi.service를 시작하고 시작프로그램으로 등록

  • sudo systemctl start uwsgi
  • sudo systemctl enable uwsgi

19. 사이트 설정파일을 변경하여 기존의 스테틱 웹 서버에서 장고 애플리케이션이 구동하도록 변경

  • sudo vim /etc/nginx/sites-available/staticweb
  • 이전에 이미 설정 완료!
upstream django {
        server unix:/var/www/django/run/uwsgi.sock;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        charset utf-8;
        access_log /var/www/django/logs/access.log;
        error_log /var/www/django/logs/error.log;

        server_name _;

        location = /favicon.ico {access_log off; log_not_found off; }
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                include         /etc/nginx/uwsgi_params;
                uwsgi_pass      django;
        }

}

20. 전체 권한 변경

  • sudo chown -R django:www-data /var/www/django

소스코드 업데이트 할 때

  • sudo chmod -R g+w /var/www/django
    • 새로운 폴더에 대해서는 쓰기 권한이 없어서 이후에 올릴 때 올라가지 않을 수도 있다.
  • sudo systemctl restart nginx

2019.06.05 EC2에 웹서버 설정하기

EC2에 웹 서버 설정하기

1. EC2 인스턴스 생성

  • 아마존 AWS를 통한 EC2인스턴스 생성한 상태에서 진행합니다.

2. 키 페어 권한 변경

  • chmod 400 django.pem

3. 키 페어 위치 변경

  • mv django.pem ~/.ssh

4. EC2 서버 접속하기

5. EC2서버에 접속후 기존 패키지를 업데이트 합니다.

  • sudo apt-get update

6. NGINX를 설치합니다.

  • sudo apt-get install nginx

7. NGINX 구동확인

  • systemctl status nginx

8. 기존 NGINX default 설정파일을 복사하여 staticweb 설정파일 생성

  • sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/staticweb

9. staticweb 설정 파일을 수정

  • sudo vim /etc/nginx/sites-available/staticweb

upstream django {
        server unix:/var/www/django/run/uwsgi.sock;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        charset utf-8;
        access_log /var/www/django/logs/access.log;
        error_log /var/www/django/logs/error.log;

        server_name _;

        location = /favicon.ico {access_log off; log_not_found off; }
        location / {

                include         /etc/nginx/uwsgi_params;
                uwsgi_pass      django;
        }

}

10. 해당 설정 파일을 Nginx에 활성화시키기

  • sudo ln -s /etc/nginx/sites-available/staticweb /etc/nginx/sites-enabled/

11. staticweb 폴더 만들기

  • sudo mkdir staticweb

12. Route53 을 이용해 도메인 연결 및 사이트 접속 확인

2019.05.31 장고 서버 셋팅하기 큰 그림 그리기

그림으로 설명 듣기

025F597C-0984-4849-BD31-1D85FBAD4369

EC2는 아마존에서 운영하는 서버이다. 정확히 Elastic Compute Cloud(EC2)는 안전하고 크기 조정이 가능한 컴퓨팅 파워를 클라우드에서 제공하는 웹 서비스입니다. 간단하게 생각하며 서버라고 생각하면 된다. 기존에 python에서 python manage.py runserver를 통해 간단한 서버를 운영할 수 있었는데 배포를 위해서는 아마존 EC2와 같은 서버를 운영해야 한다. 하지만 이것을 위해 먼저 큰 그림을 그리는 것이 정엉엉말 중요하다.

크게 EC2를 설정하기 위해서는 Nginx, uwsgi, django 3개에 대해 이해해야 한다.

먼저 Nginx , Nginx는 가장 먼저 클라이언트와 맞닥들이게 되는 웹서버라고 생각하면 쉽다. 이 웹서버에서 처리할 수 있는 일들을 처리를 하고 동적인 요청 혹은 데이터베이스에 대한 요청이 오면 그것은 django(웹 어플리케이션 서버)로 보내서 처리를 해야 한다.

그리고 그것을 중간에서 이어주는 미들웨어가 uwsgi다. 이렇게 그림을 먼저 그린 다음에 시작하면 쉽다.

크게 NGINX 와 UWSGI, DJANGO 3개를 합쳐서 EC2, 하나의 인스턴스로 생각하면 좀 더 쉽게 와닿을 수 있다.

따라서 먼저 Nginx를 설정해줘야 한다. 하나의 nginx에는 여러개의 설정파일을 설정할 수 있고, site-available한 설정파일들을 생성하고 이 설정파일들을 site-enable로 바꿔줌으로서 하나의 서버로 여러개의 웹사이트를 돌릴 수 있게 된다.

이 각각의 요청들은 nginx의 설정파일들에세 연결해준 servername을 통해 해당 django로 찾아가게 된다. 따라서 어떤 url로 오는지 연결하기 위해서는 IP와 ROUTE53을 통해 해당 url로 연결해주는 작업이 선행되어야 한다.

그렇게 하나의 서버에서 여러개의 설정파일들을 만들어내고 각각에 uwsgi와 django 어플리케이션을 연결하여 운영할 수 있다.

하지만 보통은 그렇게 하지 않는다.
하나의 EC2에 하나의 어플리케이션을 구동하도록 만들고, 리소스가 늘어나게 되면(즉 사용자가 많아지게 되면), 해당 EC2를 복사하여 여러개의 동일한 EC2를 생성해 낸다. 그리고 그 생성된 EC2들을 하나의 로드밸런서에 붙여 줌으로서 로드밸런스에서 적절히 분배해줌으로서 리소스가 몰리는 문제를 해결한다.

상황이 이렇다 보니 매번 새로운 서비스를 할 떄마다 EC2를 새롭게 설정해주는 것은 매우 비효율적이고 (실제적으로 servername만 바꾸어 주면 되므로) 이미지를 만들어 놓았다가 그 이미지를 인스턴스로 만들어서 해당 servername을 바꾸는 형태로 손쉽게 초기 테스트서버를 설정할 수 있다.

우리가 생성한 장고 파일은 EC2의 장고 파일에 업로드 시켜줘야 한다.
이때 이용하는 것이 FTP이다. 파일 전송 프로토콜(File Transfer Protocol, FTP)은 TCP/IP 프로토콜을 가지고 서버와 클라이언트 사이의 파일 전송을 하기 위한 프로토콜이다.

이를 통해 우리는 깃과 같은 소스관리를 거치지 않고 바로 EC2에 연결하여 업데이트 내용을 올릴 수 있게 된다.

여기서 또 하나의 문제점이 발생하게 되는데 여러개의 EC2를 운영하고 있다고 하면 어떻게 해야 할까? 한 곳의 EC2에 수정사항을 반영하게 되면 다른 EC2에는 반영이 안되는 상황이 발생하게 된다.

물론 가장 원초적으로 각각의 EC2에 접속하여서 하나 하나 바꾸어 주면 되지만 그것 역시 매우 비효율적이다. 따라서 하나의 인스턴스를 수정하면 그 인스턴스의 이미지를 복사하여 다시 새로운 인스턴스들을 생성한다.

한 번에 기존의 인스턴스들과 교체하게 되면 서버가 돌지 않는 순간이 발생하게 되므로 주의해야 한다.

따라서 기존의 인스턴스들과 함께 연결을 시킨이후에 잘 작동하는 것을 확인하고, 기존에 연결되어 있던 인스턴스들을 해체하는 순으로 작업을 완료시킨다.

아래에 장고 서버 리로드 하기를 순서로 진행하면 된다.

장고 서버 리로드 하기

  1. 신규서버 만들기
  2. src 업데이트
  3. 이미지 생성
  4. 신규 인스턴스 만들기
  5. ELB 넣기
  6. 기존 인스턴스 제거

장고 서버 셋팅 순서

  1. EC2 인스턴스 생성
  2. django 계정 생성
  3. www-data에 django 추가, ubuntu 추가
    1. www-data는 nginx에서 제공하는 기본 그룹
  4. nginx 설치
  5. python3-dev python3-pip python3-venv 설치
  6. 가상 환경 만들기
  7. 소스코더 폴더 만들기, 권한 변경, 소스코드 업로드, requirements.txt 설치, uwsgi 설치
  8. uwsgi.ini 만들기
  9. uwsgi.service 만들기
  10. /etc/nginx/site_available/default 수정
  11. systemctl restart nginx
  12. systemctl restart uwsgi

'배포' 카테고리의 다른 글

EC2에 장고 서버 설정하기  (0) 2020.03.16
EC2에 웹서버 설정하기  (1) 2020.03.16
자동 이메일 발송 설정하기  (0) 2020.03.16
ACM으로 SSL인증서 발급받기  (0) 2020.03.16
장고 프로젝트 S3로 연동하기  (0) 2020.03.16

2019.05.31 자동 이메일 발송 설정하기

이메일 서버 셋팅하기

  • rmtp 프로그램 서버 설치
  • 스팸함에 넣지 않도록 협조를 요청해야 한다.
  • white_list와는 다르다.
  • 외부에서 접속할 수 있도록 허용해주는 imap을 설정
  • 보안수준이 낮은 앱에서도 접속할 수 있도록 해줘야 한다.
  • 기본적으로 셋팅은 쉬운데, 스팸함이나 그런 곳에 들어가는 경우가 너무 많다.

gmail 로그인

8D49CB1C-CF9C-4331-9C80-DDF1B5120BCE

전달 및 POP / IMAP 접속 (외부에서 접속가능하도록 설정)

C615E20B-5A57-4061-AA54-108C0A8F1D63
  • IMAP 사용으로 클릭
  • 변경사항 저장 클릭

인증 관리(보안수준이 낮은 앱에서도 접속할 수 있도록 인증)

92EA4C54-25C2-4852-AD89-387A9EFA028F
  • 구글 계정 클릭
3FA53363-5844-4EBE-A039-05B2DC1CF813
  • 보안 수준이 낮은 앱의 액세서 사용 허용
  • 여기까지 하면 gmail 관련 설정 끝

setting.py에서 추가 작성

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'deaguowl@gmail.com'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

실제로 보내기

from django.core.mail import EmailMessage
email = EmailMessage('제목','본문', to=['받는 사람'])
email.send()

2019.05.31 ACM으로 SSL인증서 발급받기

#ACM으로 ssl인증서 발급받기

  • 각각의 ec2의 인스턴스에 발급하지 않기 위해 ERB에 하나만 연결하여 해결한다.

SSL인증서 발급받기

F051C95C-D2A0-4770-9E82-D4B750CE8733

인증서 요청하기

1D16C43D-3783-4E23-98FB-0CE05991C908
  • www.personalconnect.co.kr 을 등록하면 www로 접속해야만 가능하다.
  • *.personalconnect.co.kr로 하면 꼭 www가 안 붙어도 가능하다.
  • *.naver.com을 해놓으면
    • blog.naver.com
    • cafe.naver.com
    • 어디든 적용가능하게 된다.
    • 와일드카드 인증서라고 부른다.
    • 하지만 가격이 비싸다.

검증 방법 선택

9FBA2C27-417E-4683-9D40-EFCA39377D43
  • 이메일 검증은 편하나, 아마존에서 1년마다 이메일로 재인증을 해야한다.
  • 하지만 DNS 검증은 알아서 자동갱신을 해준다. 장기적으로 봤을 때 편하다.

검증 대기

B463FDE2-15B3-42DF-B3A6-0D28BD975CDF
  • 소유자 확인이 안되서 검증이 보류되었음
  • 도메인 옆 표시를 클릭하여
  • CNAME을 처리해줘야 한다.
  • ROUTE 53에서 레코드 생성을 클릭하여 마무리 한다.

검증 보류

26798382-A080-47FE-A8DD-78320801A48F
  • 시간이 지나 검증이 완료되면 사용이 가능해진다.

발급완료

DAD5452A-4971-48B0-9FCE-B93B755CAA8F

2019.05.13 장고 프로젝트 S3로 연동하기

s3 셋팅 - url 있는 형태로 (url 연결 & api 키 연결)

버킷 만들기

  1. 버킷 만들기(사이트 주소 넣어서 만들기)
스크린샷 2019-05-13 오후 9 46 03
  • 버킷이름은 꼭 이름.사이트주소.com과 같이 특정 사이트 이름을 넣어서 만들어준다.
    버킷의 퍼브릭 액세스 설정 : 다 해제를 해준다.
스크린샷 2019-05-13 오후 9 48 17
  • s3에서 사용자에게 바로 줄 수 있도록 만든다.
스크린샷 2019-05-13 오후 9 49 26
  1. 버킷 정적 웹사이트 호스팅 설정 : route53에서 확인할 수 있도록 해준다.
  2. 인덱스 문서 및 오류 문서를 그대로 따라 쳐준다.

Route53 주소 연결

스크린샷 2019-05-13 오후 9 53 47
  1. 레코드 세트 생성
  2. 본인이 등록했던 s3 버킷에 연결해주기
  3. s3에 파일 올리고 확인해보기

setting.py에 s3 관련 설정해주기

  1. assert_storage.py 생성
스크린샷 2019-05-13 오후 9 56 52
  1. bucket_name과 custom_domain을 활용하여 static과 media를 따로 저장할 수 있다.
  1. storages 설치 : pip install django-storages
  2. boto3 설치 : pip install boto3
  3. aws셋팅
스크린샷 2019-05-13 오후 9 57 49
  1. python manage.py collectstatic (static 파일 다 업로드 하기)
  2. 초기화 : python manage.py migrate
    1. 만약에 안될 시 보안그룹의 IP 포트를 확인한다.

2019.05.12 장고 프로젝트 postgreSQL로 연동하기

아마존에서 DB 생성하기

  1. 아마존 RDS 접속
  2. db는 aws RDS - PostgreSQL로 셋팅 -> 10.x 버전
스크린샷 2019-05-13 오전 6 43 53

1. RDS 파라매터 생성 : db를 기동하는데 필요한 셋팅 관리

  1. 꼭 생성 전에 서울인지 확인
  2. Amazon Relational Database Service(Amazon RDS)는 클라우드에서 관계형 데이터베이스를 더 쉽게 설치, 운영 및 확장할 수 있는 웹 서비스
  3. 인코딩 utf-8 확인

2. 데이터베이스 생성

2A62ABAD-1E8C-400D-9F4F-FF4B757AEE32
  1. PostgreSQL 선택
  2. 인스터스 식별자 : db 이름 지정
  3. 마스터 사용자 설정 : superuser 설정
  4. 퍼블릭 액세스 가능성 설정 : 예로 설정 (외부에서 DB에 접근할 수 있도록 한다.)
  5. DB파라미터 그룹 설정 : 위에서 생성한 파라미터를 넣는다.
  6. 백업보존기간: 백업 보존 기간이 길수록 과금이 많이 된다.
  7. 삭제 방지 활성화 : 이것을 체크해주면 쉽게 삭제가 불가능하다
  8. 보안 설정
    1. 어느 위치에서 접속하는 것을 허용할 것인가?
    2. VPC보안그룹 클릭
    3. 인바운드 클릭
    4. 소스 : 위치무관을 해주면 어디서든 접근 가능

3. DB와 연결해주는 드라이버 설치

  1. pip install psycopg2-binary
  2. python 라이브러리의 한 종류로 python에서 postgresql을 활용하게 해주는 라이브러리

4. setting.py에 DATABASE 수정

  1. RDS 주소를 host에 넣는다.
  2. will learn : 멀티 데이터베이스
스크린샷 2019-05-13 오후 9 34 06
  • 해당 서버에 업로드

체크사항

  • 만약 heroku 서버를 이용 중이라면 heroku에서 포트를 열어주지 않아 db에 연결하는 것이 큰 의미가 없음
  • heroku 자체적으로 저장이 된다.

2019.05.09 heroku를 활용한 북마크 배포하기

헤로쿠를 통한 북마크 앱 배포하기

헤로쿠 배포 순서

  1. 헤로쿠 설치하기 The Heroku CLI | Heroku Dev Center
  2. 헤로쿠 추가 필수 모델 설치하기
  3. requirements.txt 파일만들기
  4. 모듈 설정 : setting.py
  5. Procfile 만들기
  6. runtime.txt 만들기
  7. gitignore 만들기
  8. 헤로쿠에 업로드
  9. 헤로쿠 초기화

1. 헤로쿠 설치하기

  1. [The Heroku CLI | Heroku Dev Center] 접속(https://devcenter.heroku.com/articles/heroku-cli)
  2. 터미널 설치 명령어
brew tap heroku/brew && brew install heroku 
  1. 설치 확인
    1. 터미널 : heroku --version

2. 헤로쿠 추가 모듈 설치하기

  1. 추가 모듈 설치 (pip install 모듈명)
    1. dj-database-url : 데이터베이스 관련 옵션을 변수로 쉽게 접근할 수 있게 해주는 유틸리티
    2. gunicorn : wsgi용 미들웨어 - 웹서버와 장고 사이의 다리 역할
    3. whitenoise : static 파일 서빙용 미들웨어
    4. psycopg2-binary : postgreSQL용 드라이버

3. requirements.txt 파일 만들기

freeze > requirements.txt

4. 모듈 설정

  1. DEBUG = False
  2. ALLOWED_HOST = ['*']
  3. 미들 웨어 추가
    1. 정적파일을 사용하기 위해 미들웨어를 추가하고 STATIC ROOT를 추가해줘야 한다.
    2. 'whitenoise.middleware.WhiteNoiseMiddleware'
  4. STATIC ROOT 추가 : 스태틱 파일을 저장할 경로 설정
    1. STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
  5. 테이터 베이스 옵션 추가(헤로쿠가 알아서 해주는데 무엇을 해줄지 적는다.)
    1. DATABASES 아래에 추가
B43A59AA-6CFC-4541-809D-06DB07F83821

5. Procfile 만들기

  • 최상단에 Procfile 생성
  • web : gunicorn config.wsgi 입력

6. runtime.txt 만들기

  • 최상단에 runtime.txt 만들기
  • python-3.7.0 적어주기

7. gitignore 만들기

*.pvc
*~
/venv
__pycache__
db.sqlite3
.DS_Store

8. 헤로쿠에 업로드

  1. 헤로쿠 로그인
    1. 터미널 : heroku login
  2. git init
  3. git add -A
  4. git commit -m "heroku commit"
  5. heroku create django-bookmarkproject
  6. git push heroku master

9. 헤로쿠 초기화

  1. 헤로쿠 초기화
    1. 데이터베이스 초기화
      1. heroku run python manage.py migrate
    2. 슈퍼 유저 생성
      1. heroku run python manage.py createsuperuser
  2. 헤로쿠 열어보기
    1. heroku open

+ Recent posts