개발한 vue-django 프로젝트를 실제 운영서버에 띄우는 과정을 정리합니다! 

 

개발서버에서 구축했던 방법이 운영서버에서 적용할 때 조금씩 다른 부분도 있었고, 

여러 단계를 거쳐야 했기 때문에 잊어 버리지 않기 위해 기록해봅니다 스타트..!

 

🐾 단계

  1. 인스턴스 생성
  2. 보안규칙 생성
  3. DB ACL 허용 요청
  4. 도커 설치 - v23.0.3
  5. Jenkins 도커 서버 띄우기 - v2.399
    1. Jenkins 컨테이너 생성 및 실행
    2. Jenkins 컨테이너 내부에 DooD 구성하기
  6. 패키지 설치 및 환경 구성
  7. 웹 서버 띄우기
    1. 백그라운드로 웹 서버 띄우기

 

1. 인스턴스 생성

개발서버

ssh -i {pem키} ubuntu@{ip}

  • OS : Ubuntu Server 20.04 LTS
  • 타입 : r2.c4m16 (4vCPU, 16GB)
  • 스토리지 : 300GB

운영서버

  • OS : Ubuntu Server 20.04 LTS
  1. ssh {id}@{domain}
  2. (kinit)
  3. ssh {user}@{host}

😃 커버로스을 이용해 티켓이 발급된 사용자만 접속할 수 있도록 보안 단계를 거치게 됩니다! 

 

2. 보안규칙 생성

보안 그룹에서 필요한 포트 열어주기

젠킨스 기본 포트는 8080이지만 장고에서 사용하고 있기 때문에 겹치지 않게 7070으로 변경!

  • 7070 : 젠킨스
  • 8080 : 장고
  • 8000 : 뷰

 

3. DB ACL 허용

 

 

4. Docker 설치

  • Docker Latest : v23.0.3

개발서버

# dependency library download  
sudo apt-get update  
sudo apt-get install -y curl apt-transport-https ca-certificates gnupg-agent software-properties-common  
  
# Docker 다운로드 링크 추가  
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg  
  
# Docker Repository 등록  
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null  
  
# Docker 설치  
sudo apt-cache policy docker-ce  
sudo apt-get update  
sudo apt-get install -y docker-ce docker-ce-cli containerd.io  
  
# docker 그룹에 사용자 추가  
sudo usermod -aG docker $USER  
  
# 그룹 변경사항 활성화  
sudo newgrp docker

 

운영서버

# sudo 권한을 위해 아래 계정으로 접속
ssh {user}@{host}

# dependency library download  
sudo apt-get update  
sudo apt-get install -y curl apt-transport-https ca-certificates gnupg-agent software-properties-common  
  
# Docker 다운로드 링크 추가  
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg  
  
# Docker Repository 등록  
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null  
  
# 의존성 문제 해결
curl -O http://archive.ubuntu.com/ubuntu/pool/main/libs/libseccomp/libseccomp2_2.5.1-1ubuntu1~20.04.2_amd64.deb
sudo dpkg -i libseccomp2_2.5.1-1ubuntu1~20.04.2_amd64.deb

# Docker 설치
sudo apt-cache policy docker-ce  
sudo apt-get update  
sudo apt-get install -y docker-ce docker-ce-cli containerd.io  
  
# docker 그룹에 사용자 추가  
sudo usermod -aG docker $USER

 

5. Jenkins 서버 띄우기

Jenkins 컨테이너 생성 및 실행

  • Jenkins 제공 공식 도커 이미지 사용 (Jenkins 2.399)
  • Jenkins 컨테이너 생성 시 --privileged 옵션 필요
    • Variable Parsing 시 PostgreSQL는 yum으로 설치되므로 systemctl 명령어 사용 필요
  • 프로젝트 내 폴더 생성 후 실행할 스크립트 파일 모으기 (/home/ubuntu/variable-comparison/script/<DBMS명>)
  • 인스턴스와 컨테이너 폴더 위치 마운트하기 (/root/script)
sudo docker run --privileged -d --name jenkins -p 7070:8080 -v /home1/{user}/variable-comparison/script:/root/script -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins

젠킨스 초기 비밀번호 확인

docker exec -i jenkins bash <<< "cat /var/jenkins_home/secrets/initialAdminPassword"

 

Jenkins 컨테이너 내부에 DooD 구성하기

# jenkins 컨테이너에 루트 권한으로 접속
docker exec -it -u root jenkins bash

# docker 그룹 생성
groupadd docker
# docker 그룹에 jenkins 사용자 추가
usermod -G docker -a jenkins
# 호스트의 docker 그룹 ID(998)로 지정된 그룹명을 docker로 변경
# docker 그룹 ID는 /etc/group 파일에서 확인 가능
groupmod -g 499 docker
# 컨테이너 내부 사용자가 호스트의 파일에 접근 가능하도록 호스트 사용자 아이디(500)로 변경
usermod -u 500 jenkins

apt-get update
apt-get -y install lsb-release apt-transport-https ca-certificates curl gnupg2 software-properties-common
apt-get -y upgrade apt-transport-https

# Docker 다운로드 링크 추가
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey
apt-key add /tmp/dkey

# Docker Repository 등록
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"

# Docker 설치
apt-get update
apt-get -y install docker-ce docker-ce-cli containerd.io

 

6. 패키지 설치 및 환경 구성

1. 프로젝트 Git clone

  • 안될 경우, 사내 게이트웨이 신청 필요할 수 있음
git clone {repository url}

 

2. pyenv 설치 (python 3.9.10)

sudo apt update
sudo apt install -y git sqlite3 build-essential libedit-dev make

# pyenv 설치를 위한 패키지 다운로드
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev
# pyenv 다운로드
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

# ~/.bashrc에 환경변수 추가
cat >> ~/.bashrc << 'EOF'
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export PYENV_VIRTUALENV_DISABLE_PROMPT=1
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
EOF

# ~/.bashrc 적용
source ~/.bashrc

# pyenv로 python 3.9.10 버전 다운로드
#sudo apt install -y lzma
pyenv install 3.9.10
# py39라는 이름의 가상환경 생성
pyenv virtualenv 3.9.10 py39
# py39 활성화
pyenv activate py39

 

3. requirements.txt 설치

pip install -r requirements.txt

# setuptools가 먼저 설치되어야 mysqlclient 설치가 정상적으로 진행됨
# 설치 순서도 중요!

 

4. secret key 발급

 

5. 필요한 패키지

  • Redis
sudo apt-get install -y libssl-dev default-mysql-server default-mysql-client default-libmysqlclient-dev
sudo apt-get install -y python3-pip
pip3 install requests bs4 sqlalchemy pymysql mysqlclient pandas redis
  • PostgreSQL
apt-get update && apt-get -y install sudo
sudo apt-get install -y postgresql-client
sudo apt-get install -y postgresql-client-common
sudo apt install pip 
sudo apt install default-libmysqlclient-dev
pip install sqlalchemy requests bs4 psycopg2-binary mysqlclient numpy pandas
  • 설치가 잘 안 될 경우
# ModuleNotFoundError: No module named '_ctypes' 에러
sudo apt-get install libffi-dev
# 가상환경 파이썬 제거
pyenv uninstall 3.9.10
# 가상환경 파이썬 재설치
pyenv install 3.9.10
# py39라는 이름의 가상환경 생성
pyenv virtualenv 3.9.10 py39
# py39 활성화
pyenv activate py39

 

6. npm, vue, nvm 설치

node 버전을 잘 맞춰 주는 것이 매우 중요하다! 안 맞으면 띄워지지가 않음..

# npm 설치
sudo apt install npm

# vue-cli 설치
sudo npm install -g @vue/cli
vue --version #@vue/cli 5.0.8

# nvm 설치
sudo apt-get install build-essential libssl-dev
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
source ~/.bashrc

# 원하는 버전 설치
nvm install 16.14.2

# 실행
# nvm use default 16.14.2

# 버전 확인
node -v  # v16.14.2
npm -v # 8.5.0

 

7. vue.config.js 변경

publicPath: process.env.NODE_ENV === 'production' ? '/static/dist/' : 'http://{ip}:{port}',

.public('http://{ip}:{port}')

 

7. 서버 띄우기

* 주의

로컬을 띄운 상태에서 실행할 경우 로컬 화면이 나오는 것이기 때문에 로컬을 끈 상태에서 진행해야 진정한 서버를 볼 수 있다!

 

운영서버

백그라운드에서 띄우기!

  • nohup node ./node_modules/@vue/cli-service/bin/vue-cli-service serve --port 18080 &
  • nohup python manage.py runserver {ip}:{port} --settings=main.config.settings.debug
  • 15361번 포트, 18080번 포트 사용

드디어 메인 화면이 예쁘게 뜬 것을 확인할 수 있다~!!

 

이렇게 정식으로 서버를 띄워본 것은 처음이어서 한 단계를 알아 갈 때마다 너무 재밌고 이런 시간을 보낼 수 있어서 감사했다!

관련 내용은 더 반복하고, 모르는 내용은 스터디해서 잘 정리해두어야겠다 :)

Django는 설치할 때 기본적으로 SQLite가 연동됩니다.

하지만 실제 프로젝트를 위해 MySQL 연동 작업을 진행해보겠습니다.

 

 

1. 커넥터 설치

mysqlclient 라는 라이브러리를 설치하면 파이썬과 MySQL 통신이 가능합니다.

pip install mysqlclient

 

2. settings.py 설정

DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',    
        'NAME': '연동할 데이터베이스 이름',                  
        'USER': 'DB 접속 계정명',                          
        'PASSWORD': 'DB 접속 비밀번호',                  
        'HOST': '실제 DB 주소',                     
        'PORT': '3306',         # 기본 포트 주소                  
    }
}

 

3. DB 감지

해당 DB에 존재하는 테이블들을 model로 만들어줌

# 앱 안에 models.py에 바로 저장하기
python manage.py inspectdb > [앱이름]/models.py

# 앱 안에 models.py에 바로 저장하기 (멀티 DB)
python manage.py inspectdb --database 'db명' > [앱이름]/models.py

# 출력만 하기
python manage.py inspectdb

 

 

4. 테이블 생성

모델이 변경되었으니 마이그레이션 적용하기

python manage.py makemigrations
python manage.py migrate

 

Django 공식문서를 참조했습니다.

 

데이터베이스 셋업

기본으로 설치되어 있는 SQLite를 사용할 수 있다.

 

  • SQLite 진입
# db.sqlite3 가 있는 위치에서
sqlite3 db.sqlite3

 

모델 만들기

모델이란, 부가적인 메타데이터를 가진 데이터베이스 구조!

 

1. polls/models.py에서 모델 작성

Question과 Choice 테이블을 만든다.

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

 

모델 활성화

모델을 통해 장고는 다음과 같은 일을 한다.

  • 이 앱을 위한 데이터베이스 스키마 생성 (CREATE TABLE statements)
  • Question와 Choice 객체에 대한 파이썬 데이터베이스 접근 API 생성

 

2. mysite/settings.py 수정

프로젝트에 polls 앱이 있다는 것을 알려야 한다.

INSTALLED_APPS에 PollsConfig 클래스 추가

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

 

3. 변경사항에 대한 마이그레이션 생성

모델에 대한 변경사항을 장고에 알리는 것

python manage.py makemigrations

💡 마이그레이션이란? Migrations

장고에서 모델에 대한 변경사항을 데이터베이스 스키마에 전파하는 방법

장고는 ORM을 사용하는데 DB 스키마를 git처럼 버전 관리 할 수 있도록 함

하나의 마이그레이션 파일은 해당 마이그레이션이 생성된 시점의 구조를 가짐

 

4. 변경사항을 데이터베이스에 적용

모델과 관련된 테이블을 생성한다.

python manage.py migrate

 

🧐 마이그레이션을 만드는 명령과 적용하는 명령이 분리된 이유는 무엇일까?

버전 관리 시스템에 마이그레이션을 커밋하고 앱과 함께 출시할 수 있도록 하기 위해서이다.

 

✅ 공식문서

https://docs.djangoproject.com/en/4.1/

 

⬇️ Django 설치 전이라면 아래 글을 참고해보세요!

 

맥(Mac)에서 Django 개발환경 구축 및 설치하기

개발환경 macbook pro (2019) macOS Monterey 12.6.2 python 3.9.6 django 4.1.6 python3 설치 1. 설치 여부 확인 python3 --version 2. 설치가 되어있지 않다면 설치 python 공식 다운로드 (3.9.6으로 설치함) https://www.python.org/do

myminju.tistory.com

 

https://static.djangoproject.com/img/logos/django-logo-negative.1d528e2cb5fb.png

 

개발환경

  • macbook pro (2019)
  • macOS Monterey 12.6.2
  • python 3.9.6
  • django 4.1.6

Writing your first Django app

장고 프로젝트 생성

django-admin startproject mysite

 

프로젝트 생성 후 파일 목록

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
  • mysite/ : 프로젝트를 담는 컨테이너 폴더, 루트 디렉토리이며 이름 변경 가능
    • manage.py : 여러가지 방법으로 장고 프로젝트와 상호작용 하는 커맨드라인 유틸리티 - manage.py에 대한 디테일
    • 내부 mysite/ : 프로젝트를 위한 실제 파이썬 패키지들이 저장됨
      • __init__.py : 파이썬에게 이 디렉토리를 파이썬 패키지로 인식하도록 하는 비어있는 파일
      • settings.py : 프로젝트의 setting과 configuration  - Django settings
      • ursl.py : 프로젝트의 url 선언
      • asgi.py : ASGI 호환 웹에 배포하기 위한 엔트리 포인트
      • wsgi.py : WSGI 호환 웹에 배포하기 위한 엔트리 포인트

 

개발 서버 실행

python manage.py runserver
  • 언제 runserver를 해야할까?
    자동 변경 기능으로 인해 개발 서버는 요청이 들어올 때마다 자동으로 파이썬 코드를 다시 불러온다.
    즉, 코드 변경 사항을 적용하기 위해서는 굳이 서버를 다시 시작하지 않아도 된다.
    그러나, 파일 추가 등의 작업은 개발서버가 자동으로 인식하지 못하기 때문에 서버를 다시 시작해야한다.

설문조사 앱 생성

python manage.py startapp polls

💡 프로젝트 vs 앱

  • 앱은 블로그 시스템, 공공 기록 데이터베이스 또는 소규모 투표 앱과 같은 작업을 수행하는 웹 애플리케이션
  • 프로젝트는 특정 웹 사이트에 대한 구성 및 앱의 모음
  • 프로젝트는 여러 앱을 포함할 수 있고, 앱은 여러 프로젝트에 있을 수 있다.

 

앱 생성 후 파일 목록

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

첫번째 뷰 띄우기

1. polls/views.py에 아래 코드 추가

# polls/views.py
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

 

2. polls/urls.py에 URL 매핑

뷰를 호출하려면 이와 연결된 URL이 있어야 하고, 이를 위해 URLConf가 사용된다.

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

 

3. mysite/urls.py에서 모듈 가리키기

최상위 URLConf에서 polls.urls 모듈을 바라보게 설정한다.

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]

💡 include()

다른 URLConf를 참조하도록 함

URL이 일치하는 부분까지 잘라내고 남은 부분을 included URLConf로 보냄

 

💡 path()

필수 파라미터 : route, view

선택 파라미터 : kwargs, name

 

4. http://localhost:8000/polls/ 에 접속하여 연결 확인하기

index 뷰가 URLConf에 연결되어 잘 나오는 것을 확인할 수 있다!

https://i0.wp.com/hanamon.kr/wp-content/uploads/2021/05/django.jpeg?fit=1280%2C720&ssl=1

 

개발환경

  • macbook pro (2019)
  • macOS Monterey 12.6.2
  • python 3.9.6
  • django 4.1.6

python3 설치

1. 설치 여부 확인

python3 --version

 

2. 설치가 되어있지 않다면 설치

  • python 공식 다운로드 (3.9.6 설치)
 

Download Python

The official home of the Python Programming Language

www.python.org

 

 

  • python3 명령어를 python으로 바꿀 수 있도록 환경변수 설정
    • vi ~/.zshrc 실행 후 하단에 아래 코드 기입
alias python="python3"
# Setting PATH for Python 3.9
export PATH="/Library/Frameworks/Python.framework/Version/3.9/bin:${PATH}"

 

가상환경 구축

1. virtualenvwrapper 설치

sudo pip install virtualenvwrapper

 

2.  하단에 환경변수 추가

export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh

 

3. 터미널에서 source ~/.zshrc 실행

 

4. 가상환경 생성

mkvirtualenv [가상환경명]

 

5. 가상환경 활성화

worknon [가상환경명]

 

가상환경 명령어 모음

  • 가상환경 생성
mkvirtualenv [가상환경명]
  • 사용가능한 가상환경 목록 확인
workon
  • 가상환경 활성화
worknon [가상환경명]
  • 가상환경 비활성화
deactivate
  • 가상환경 제거
rmvirtualenv [가상환경명]

 

장고 설치

❗️가상환경을 실행한 상태에서 하는 것 잊지 말기 ⭐️

 

pip install django

 

  • 설치가 잘 되었는지 테스트 (파이썬이 장고 모듈을 찾을 수 있는지 확인)
python -m django --version

 

장고 프로젝트 생성

  • 생성
django-admin startproject [프로젝트명]

 

  • settings.py에 Timezone 설정
LANGUAGE_CODE = 'ko-kr'
TIME_ZONE = 'Asia/Seoul'  # 한국 시간 적용 
USE_I18N = True
USE_TZ = False  # False 로 설정해야 DB에 변경 된 TIME_ZONE 이 반영 됨

 

서버 구동 확인

cd [프로젝트명]
python manage.py runserver

# python manage.py runserver [IP]:[port]

 

  • http://127.0.0.1:8000/ 접속

장고 로켓이 잘 뜨는 것을 확인할 수 있다!

+ Recent posts