swsnu / swpp2020-team7

냉장고 파먹기 - 냉장고 속 재료를 기반으로 나만의 레시피를 추천받자! 주변 이웃과 재료 거래는 덤!
https://naengpa.shop/
3 stars 3 forks source link

[Settings] Deploy process #73

Open vegeshop opened 3 years ago

vegeshop commented 3 years ago

배포 설정이 복잡해 전체 과정을 재현할 수 있게 정리해둡니다.

AWS, DNS 셋업

AWS EC2 : 보안그룹 TCP 22, 80, 443 port 전체 개방, elastic ip 발급 및 연결 AWS RDS: 퍼블릭 액세스 허용, 보안그룹 TCP 5432 port를 ec2 ip에만 개방 DNS: ec2 elastic ip를 가비아에서 구입한 주소에 등록. _acme-challenge 호스트로 ssl 인증서 DNS TXT record 등록. @ 호스트 등록.

EC2 셋업

python, virtualenv, pip

sudo apt update
sudo apt install -y python3-pip
sudo pip3 install virtualenv
sudo apt install -y python3.7 python3.7-dev // should install dev for uwsgi install
virtualenv --python=python3.7 env // virtual env folder name "env"

npm, node, yarn

sudo apt install -y npm
sudo npm install -g n
sudo n stable
sudo npm install npm
sudo npm install -g yarn

redis

sudo apt install -y redis-server
sudo vi /etc/redis/redis.conf # redis 기본설정 변경
> maxmemory 256mb
> maxmemory-policy allkeys-lru

gdal for postgis, java for konlpy

sudo apt install -y gdal-bin
sudo apt install -y g++ openjdk-8-jdk

postgresql

sudo apt install -y postgresql postgresql-contrib

sudo chown -R $USER:$GROUP ~/.npm
sudo chown -R $USER:$GROUP ~/.config

application

git clone {github repository}
vi .env // /home/ubuntu 디렉토리에 환경변수 파일 보관
cp .env swpp2020-team7/.env
source env/bin/activate
cd swpp2020-team7/backend/naengpa
pip3 install -r requirements.txt
export PYTHONPATH=$PYTHONPATH:$PWD // must execute at the backend root directory

frontend build

cd /home/ubuntu && vi setup-deploy.sh
> #!/bin/bash
> cd swpp2020-team7 && git pull origin master
> cp ../.env .env
>
> cd frontend/naengpa && yarn
> cp ../../../.env.front .env
> yarn build --prod
> 
> cd ../../backend/naengpa
> pip3 install -r requirements.txt
> python3 manage.py makemigrations
> python3 manage.py migrate

./setup-deploy.sh

ssl

sudo add-apt-repository ppa:certbot/certbot
sudo apt update && sudo apt install -y python-certbot-nginx
sudo certbot certonly --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory -d {domain name}
// 결과창의 인증서 DNS txt record를 가비아에 상기된 대로 등록

nginx

sudo apt install -y nginx
sudo vi /etc/nginx/sites-available/frontend.conf
---
upstream django {
  server 127.0.0.1:8000;
}

server {
  listen 80;
  server_name naengpa.shop;
  charset utf-8;
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl http2;
  server_name naengpa.shop;
  charset utf-8;

  ssl on;
  ssl_certificate /etc/letsencrypt/live/naengpa.shop/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/naengpa.shop/privkey.pem;

  access_log /home/ubuntu/logs/nginx/access.log;
  error_log /home/ubuntu/logs/nginx/error.log;

  location / {
    uwsgi_param HTTP_X_FORWARDED_PROTO https;
    root /home/ubuntu/swpp2020-team7/frontend/naengpa/build;
    index index.html index.htm;
    try_files $uri $uri/ /index.html;
  }
  location /api {
    include uwsgi_params;
    proxy_pass http://django$request_uri;
    proxy_pass_header X-CSRFToken;
    proxy_set_header HOST $host;
  }
}
---

sudo ln -s /etc/nginx/sites-available/frontend.conf /etc/nginx/sites-enabled/frontend.conf
sudo rm /etc/nginx/sites-enabled/default
mkdir -p /home/ubuntu/logs/nginx
sudo nginx -t
sudo systemctl start nginx
sudo systemctl enable nginx

uwsgi (참고링크)

sudo -H python3.7 -m pip install uwsgi // should install with the same version of python as virtualenv
sudo adduser deploy-user
sudo mkdir -p /etc/uwsgi/sites
sudo vi /etc/uwsgi/sites/deploy.ini
---
[uwsgi]
http = :8000
base = /home/ubuntu
chdir = %(base)/swpp2020-team7/backend/naengpa
module = naengpa.wsgi.deploy
home = %(base)/env

uid = deploy-user
gid = deploy-user

socket = /tmp/ec2.sock
chmod-socket = 666
chown-socket = deploy-user:deploy-user

# process-related settings
# master
master = true
enable-threads = true
pidfile = /tmp/ec2.pid

vacuum = true
logger = file:/tmp/uwsgi.log
---

sudo -u deploy-user uwsgi -i /etc/uwsgi/sites/deploy.ini
sudo systemctl start uwsgi
sudo systemctl enable uwsgi

deploy.sh

vi deploy.sh
> #!/bin/bash
> redis-server --daemonize yes
> sudo systemctl restart uwsgi
> sudo systemctl restart nginx

./deploy.sh

travis ci 자동 배포 설정

https://dev.to/gortron/deploying-to-aws-with-travis-via-ssh-315a 위 글 적용할때, ssh 키 설정 관련 파트에서, github token 발급받아 travis login하고, ec2에서 password login 관련 설정 두개 값 바꿔 ssh 키 전달하고, /tmp/deploy_rsa로 된 경로 적절히 바꿔줘야합니다.

lynn0506 commented 3 years ago

정말 감사합니다 ㅎ_ㅎ

vegeshop commented 3 years ago

현재 uwsgi를 service로 등록해 실행하거나, -i 옵션으로 ini 설정파일을 불러와 실행할때, 서비스가 상태는 문제없지만 접속시 500 에러가 뜨는 문제가 있습니다. 따라서 uwsgi만 다음 커맨드로 대체해 배포 중입니다.

sudo uwsgi --http :8000 -H /home/ubuntu/env --wsgi-file /home/ubuntu/swpp2020-team7/backend/naengpa/naengpa/wsgi/deploy.py --daemonize ~/logs/uwsgi/dev.log

http: 8000 port 사용 -H (--home): 가상환경 디렉토리 설정(uwsgi와 같은 버젼의 pip3로 설정된 가상환경이 아니면 환경은 인식해도 모듈을 못불러오는 이슈가 있음) --wsgi-file : 배포용 장고 wsgi.py 세팅파일 지정 --daemonize : background에서 실행, 로그파일에 로그 기록