작동 방법
개발자의 맥에서 서버로 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
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
'Django' 카테고리의 다른 글
DRF 응답 포멧 커스텀 하기(JSONRenderer) (0) | 2023.03.07 |
---|---|
DRF(Django REST framework)로 API 서비스 만들기-3 (0) | 2023.02.14 |
DRF(Django REST framework)로 API 서비스 만들기-2 (0) | 2023.02.14 |
DRF(Django REST framework)로 API 서비스 만들기-1 (0) | 2023.02.14 |
요청 도메인, 아이피, 정보 얻기 (0) | 2023.02.10 |