본문 바로가기

Django

DRF 프로젝트 우분투 서버 git push로 배포하기

작동 방법

개발자의 맥에서 서버로 Push   >   깃훅을 이용해서 마이그레이션과 uwsgi, nginx 재시작

 

 


 

방법

1. requirements.txt 생성

프로젝트 폴더로 가서 아래 명령어를 실행

 

pip3 freeze >> requirements.txt

 

 

2. ALLOW_HOST에 서버 주소 추가

서버의 주소를 설정파일 ALLOW_HOST에 추가

 

 

3. 서버에서 사용할 Static 파일 위치 설정

설정 파일에 추가

 

STATIC_ROOT = os.path.join(BASE_DIR, ".static")

 

 

 

4. 필요한 라이브러리 설치

sudo apt-get update

 

sudo apt-get dist-upgrade

 

sudo apt-get install python3-pip

 

 

5. 프로젝트 폴더 생성

mkdir app && cd app && mkdir project && cd project
git init  
git config receive.denycurrentbranch ignore

 

 

- git init : 해당 폴더를 깃 폴더로 사용

- git config receive.denycurrentbranch ignore : 개발자의 로컬에서 푸시를 할라면 필요

 

 

 

6. 로컬에서 해당 서버로 푸시

git remote add prod [user]@[server ip]:[프로젝트 경로]
git push prod main

 

당연한 이야기지만 서버에 개발자의 ssh 키가 설지되어 있어야 함

프로젝트 경로를 정확하게 모르겠다면 서버에 해당 폴더로 가서 pwd 를 입력하면 알 수 있음

서버에 있는 해당 폴더로 가면 아무것도 없는 경우가 있음, 이 경우에 브랜치가 main인지 확인

 

 

 

7. 가상환경 설치 & 실행

python3 -m venv venv

 

source venv/bin/activate

 

 

8. 라이브러리 인스톨

pip3 install -r requirements.txt

 

 

mysql 오류 발생시 https://stackoverflow.com/questions/70315196/unable-to-install-mysqlclient-with-pip-on-ubuntu

 

 

9. key 파일 추가

사용하는 키 파일이 있다면 복사해주기

 

 

10. 로그 폴더 생성

mkdir config/logs

 

 

11. DB 서버 설치

여기서는 mariadb 를 설치하겠음

 

apt install mariadb-server
apt-get install mariadb-client
mysql_secure_installation

 

 

참고 https://blogger.pe.kr/885

 

 

 

12. DB 생성

create database your_database character set utf8mb4 collate utf8mb4_general_ci;

 

 

 

 

 

 

13. 서버 실행 테스트

python manage.py makemigrations --settings=config.settings.prod
python manage.py migrate --settings=config.settings.prod
python manage.py collectstatic --settings=config.settings.prod
python manage.py runserver 0:8000 --settings=config.settings.prod

 

 

잘 실행 되는지 확인

 

 

 


 

14.  가상환경 실행 후 uwsgi 설치

pip3 install uwsgi

 

 

15. 실행 테스트

uwsgi --http :8000 --home /root/app/project/venv/ --chdir /root/app/project/ -w config.wsgi

 

 

--home : 가상 환경 경로

--chdir : 프로젝트 경로

마지막 config.wsgi 는 장고 프로젝트의 wsgi.py 경로임. 만일 자신의 장고 프로젝트가 project > config > wsgi.py 의 경로로 이루어졌다면 config.wsgi 로 적어야 함

 

 

16. uwsgi 설정파일 생성하기

app 폴더에 config/uwsgi/mysite.ini 파일을 생성

 

[uwsgi]
env=PROD=True

chdir = /root/app/project/
module = config.wsgi:application
home = /root/app/project/venv/

uid = root
gid = root

socket = /tmp/mysite.sock
chmod-socket = 666
chown-socket = root:root

enable-threads = true
master = true
vacuum = true
pidfile = /tmp/mysite.pid
logto = /var/log/uwsgi/project/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true

 

 

env : 환경 설정,  PROD = true 로 설정

chdir : 프로젝트 경로

home : 가상 환경 경로

uid : 유저 아이디

gid : 그룹 아이디

chown-soket : 유저 아이디:그룹 아이디

logto : 로그 폴더 위치

 

 

17. uwsgi 로그 폴더 생성

sudo mkdir -p /var/log/uwsgi/project

 

sudo chown -R ubuntu:ubuntu /var/log/uwsgi/project/

 

 

18. 실행 테스트

sudo /root/app/project/venv/bin/uwsgi -i /root/app/config/uwsgi/mysite.ini

 

 

19. 로그 확인하기

sudo tail -f /var/log/uwsgi/project/2020-03-15.log

 

 


 

 

20. nginx 설치

sudo apt-get install nginx

 

 

21. nginx 사용 유저 설정

sudo vi /etc/nginx/nginx.conf

 

user ubuntu; <---------- 이 부분을 자신의 유저로 설정
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
 
events {
        worker_connections 768;
        # multi_accept on;
}
 
http {
 
        ##
        # Basic Settings
        ##
.... 중략

 

 

 

23. nginx 설정 파일 생성

app/config/nginx/mysite.conf 생성

 

server {
    listen 80;

    server_name 0.0.0.0;

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

    charset utf-8;
    client_max_body_size 20M;

    large_client_header_buffers 4 16k;

    location / {
        uwsgi_pass  unix:///tmp/mysite.sock;
        include     uwsgi_params;
    }

    location /static/ {
        alias /root/app/project/.static/;
    }

    location /uploads/ {
        alias /root/app/project/config/uploads/;
    }
}

 

listen : 사용할 포트

sever_name : 자신의 서버 IP

location : 외부에서 접근 가능할 파일의 경로를 적어야 한다.

                 예를 들어 장고 프로젝트의 정적 파일인 js나 css 파일의 경로를 적어야 함(맨 위에서 설정함, 13번 명령에서 생성되는 파일들)

                 또는 프로젝트에서 사용하는 이미지 파일이나 업로드 파일의 경로가 있으면 같이 설정해야 함

 

 

 

24. uwsgi service 파일 생성

app/config/uwsgi/uwsgi.service

 

[Unit]
Description=uWSGI service
After=syslog.target
 
[Service]
ExecStart=/root/app/project/venv/bin/uwsgi -i /root/app/config/uwsgi/mysite.ini
 
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
 
[Install]
WantedBy=multi-user.target

 

/root/app/project/venv/bin/uwsgi : 자신의 프로젝트의 가상환경 주소

/root/app/config/uwsgi/mysite.ini : 자신의 uwsgi 파일 경로

 

 

25. uwsgi.service 파일을 데몬에 등록

sudo ln -f /root/app/config/uwsgi/uwsgi.service /etc/systemd/system/uwsgi.service

 

 

26. uwsgi 재실행

sudo systemctl enable uwsgi && sudo systemctl restart uwsgi

 

 

27. nginx 설정 파일을 nginx 어플리케이션에 등록

sudo cp -f /root/app/config/nginx/mysite.conf /etc/nginx/sites-available/mysite.conf

 

 

복사된 파일을 sites-enables 폴더 안에 링크

 

sudo ln -sf /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf

 

 

기본 파일 삭제

 

sudo rm /etc/nginx/sites-enabled/default

 

 

 

28. 데몬 리로드

sudo systemctl daemon-reload && sudo systemctl restart nginx uwsgi

 

 

 

29.  서버의 포트 열어주기

자신이 사용하는 포트를 열어준다.

 

우분투 20.04를 사용할때 포트가 안열리면 해결방법

참조 https://www.vultr.com/docs/how-to-configure-uncomplicated-firewall-ufw-on-ubuntu-20-04/

 

sudo apt-get install ufw
sudo ufw enable

 

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp
sudo ufw allow mysql

 

 

현재 포트 상태를 보려면

 

sudo ufw status

 

 

30. 배포 자동 스크립트 생성

개발자의 맥에서 서버로 푸시를 하면 자동으로 마이그레이션과 정적 파일 생성, nginx 등을 재시작 하는 방법을 적용

 

1) 자동 동작 로그 파일 생성

 

/root/app 폴더 안에 생성

 

vi git_hook_log.txt

 

 

2) 자동 동작 스크립트 생성

 

app 폴더 안에 생성

 

vi deploy.sh

 

#!/bin/sh

PROJECT_NAME=project
APP_DIR=$HOME/app/$PROJECT_NAME

venv_act() {
   . $APP_DIR/venv/bin/activate
}

collectstatic() {
   python manage.py collectstatic --settings=config.settings.prod
}


makemigrations() {
   python manage.py makemigrations --settings=config.settings.prod
}

migrate() {
   python manage.py migrate --settings=config.settings.prod
}


echo "--- Start Venv"
venv_act

echo "--- Move API Dir"
cd $APP_DIR

echo "--- python manage.py collectstatic"
rm -rf $APP_DIR/config/.static
collectstatic

echo "--- python manage.py makemigrations"
makemigrations

echo "--- python manage.py migrate"
migrate

echo "--- Link uwsgi.service"
sudo ln -f /root/app/config/uwsgi/uwsgi.service /etc/systemd/system/uwsgi.service

echo "--- Copy nginx mysite.conf"
sudo cp -f /root/app/config/nginx/mysite.conf /etc/nginx/sites-available/mysite.conf

echo "--- Link nginx mysite.conf"
sudo ln -sf /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/mysite.conf

echo "--- Restart nginx & uwsgi"
sudo systemctl daemon-reload && sudo systemctl restart nginx uwsgi

 

 

그리고 해당 파일의 권한을 변경

 

chmod +x deploy.sh

 

해당 부분은 deploy.sh가 실행되면 해당 실행 결과를 git_hook_log.txt에 남김

 

 

 

3. 깃훅 설정

 

프로젝트의 .git 폴더 안에 post-update 파일을 생성

 

vi app/project/.git/hook/post-update

 

#!/bin/sh

sh /root/app/deploy.sh

timestamp=$(date)
echo "Post-update : $timestamp : exec deploy.sh"  >> /root/app/git_hook_log.txt

 

chmod +x post-update