저번에 이어서 배포 준비하기~~
로컬이 아닌 서버에서 돌아가는 파일은 github actions가 실행시켜준다. pr할때마다 action이 새로 실행된다.
수정한 코드를 쉽게 반영할 수 있어서 편리하다..!
# deploy.yml
- .github/workflows/deploy.yml
- github actions가 실행시켜준다.
name: Deploy to EC2
on:
push:
branches:
- dev
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@master
- name: create env file
run: |
touch .env
echo "${{ secrets.ENV_VARS }}" >> .env
- name: create remote directory
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ubuntu
key: ${{ secrets.KEY }}
script: mkdir -p /home/ubuntu/srv/ubuntu
- name: copy source via ssh key
uses: burnett01/rsync-deployments@4.1
with:
switches: -avzr --delete
remote_path: /home/ubuntu/srv/ubuntu/
remote_host: ${{ secrets.HOST }}
remote_user: ubuntu
remote_key: ${{ secrets.KEY }}
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ubuntu
key: ${{ secrets.KEY }}
script: |
sh /home/ubuntu/srv/ubuntu/config/scripts/deploy.sh
- dev branch에 있는 코드를 실행한다.
- 중간에 있는 secrests 변수들은 github에서 설정해준다. (.env.prod 파일을 만들거라 나중에)
- 마지막줄 sh/home/ubuntu/srv/ubuntu/config/scripts/deploy.sh를 통해 프로젝트 내 config/scripts/deploy.sh를 실행시킨다. .sh는 linux 계열의 shell script 확장자인데, 호환성이 좋다.
- deploy.sh에서는 docker와 docker-compose를 깔아준다.
- 그리고 마지막에 sudo docker-compose -f /home/ubuntu/srv/ubuntu/docker-compose.prod.yml up --build -d을 실행해준다. -d는 background에서 서버가 계속 돌아가도록 하는 역할
# EC2
- 이전에 프리티어 계정이 끝나 비용이 청구되었던 아픈 경험이...있기 때문에 새로운 프리티어 계정을 만들어주었다.
- console에서 EC2검색 후 인스턴트 시작하기
- 이름은 암거나 하고...서버를 선택해준다.
- 서버는 다양하게 있다. linux 계열의 여러 서버들과 윈도우서버.
- 근데 가장 호환성 좋고 저렴하고..뭐 여러 이유로 Ubuntu를 많이 사용하는 듯??
- 공부하면서 알았는데 linux의 다른 버전인 unix는 이제 뒤쳐지고...linux(특히 ubuntu)가 서버에서 가장 인기가 많다.
- 인스턴스 유형은 일단 프리 티어 선택.
- 학생 수준의 프로젝트에서 micro말고 더 큰 인스턴스를 쓸 일은 별로 없다...
- 이전에 학교 축제 사이트 만들 때는 동접자 2-300명 생각하고 medium으로 했었다. 중간에 터져서 large로 바꾸고 별 짓을 다했지만...인스턴스 문제는 아니였음.🥲🥲
- 키 페어를 만들어준다. 연결을 위한 공인인증서 느낌...없으면 새 키 페어를 생성해준다. 다만 여기서만 다운이 가능하니 반드시 다운 받아서 저장해주기.
- 보안그룹에서는 ip주소와 port 허용을 설정한다.
- 이전에 만들어둔게 있으면 그걸 사용하고, 없으면 새로 만든다. 어짜피 나중에 규칙수정 가능함.
- 여기까지 한 후 인스턴트 생성. 인스턴트를 선택하면 관련된 여러 정보들이 나온다.
- 인스턴스의 주소는 재부팅할 때마다 바뀌는데, 이와 관련하여 탄력적ip(고정 ip)를 설정할 수 있다.
# RDS
- 애증의 RDS...자세히 안보면 실수할 수 있다. 이거땜에 몇주를 고생했음.
- 나는 mysql database를 설정했으므로 mysql선택.
- 템플릿은 프리 티어로 설정해준다.
- 식별자, 이름, 암호 모두 필요하니 기억해두자.
- 인스턴스는 micro, 스토리지는 20GiB. 이때 스토리지 자동활성화는 해제해준다!
- 연결은 default값으로 둔다. 다만 퍼블릭 액세스는 예로 바꾸기
- 보안그룹은 EC2에서 사용한 것이랑 같은걸로 선택하고 생성해주었다.
- 추가구성에서 이름을 설정하고 파라미터 그룹의 이름을 확인한다. 파라미터 그룹은 새로 만들어줄 건데 여기서 선택된 default 그룹을 그냥 수정하기만 해도 된다.
- 파라미터 그룹을 수정하거나 생성해준다.
- 수정할 파라미터 그룹을 선택 후 파라미터 그룹 편집 선택
- time_zone의 값을 Asia/Seoul로 바꾼 뒤 재설정해준다.
- 위와 마찬가지로 아래의 값들을 utf8mb4로 수정
- character_set_client
- character_set_connection
- character_set_database
- character_set_filesystem
- character_set_results
- character_set_server
- 아래의 값들은 utf8mb4_general_ci로 수정
- collation_connection
- collation_server
- 전부 완료하면 변경사항 저장
- 아까 만든 RDS를 선택 후 수정해서 파라미터 그룹을 설정해둔 그룹으로 바꿔준다.
- 이제 서버와 데이터베이스를 만들었으니 내 프로젝트와 연결만 해주자
# 연결하기
- 내 프로젝트의 최상위폴더 안에 .env.prod를 만들어준다.
DATABASE_HOST={RDS db 주소}
DATABASE_DB=mysql
DATABASE_NAME={RDS 기본 database 이름}
DATABASE_USER={RDS User 이름}
DATABASE_PASSWORD={RDS master 비밀번호}
DATABASE_PORT=3306
DEBUG=False
DJANGO_ALLOWED_HOSTS={EC2 서버 ip 주소}
DJANGO_SECRET_KEY={django secret key}
- 아까 만든 EC2와 RDS의 정보를 넣어준다.
- RDS의 db 주소는 엔드포인트의 주소, EC2 서버 ip주소는 퍼블릭 DNS주소를 넣어준다. 만약 탄력적 ip를 설정해주었다면 DJANGO_ALLOWED_HOSTS=* 로 작성
- 참고로 .env.prod는 .gitinore에 없어 github에 그대로 올라가게 된다(!) 반드시 .gitinore에 적어주자.
# github actions
- 이제 진짜 마지막...
- 프로젝트를 올리는 레포지토리의 settings -> Secrets and variables (Security) -> Actions -> New repository secret
- ENV_VARS : .env.prod값 전체 복붙
- HOST : 배포할 EC2서버의 퍼블릭 DNS 주소. 만약 탄력적 IP를 설정했으면 그 주소를 적어준다.
- KEY : EC2서버로 접근하기 위한 ssh 키페어(.pem)
- cmd에서 키페어가 있는 주소로 이동 후 type (키페어 이름).pem으로 값을 알 수 있다.
- ----까지 모두 복사해준다.
- mac은 type 대신 cat 🐱
- 전부 해주었으면 dev branch에 내가 만든 프로젝트를 push해주기!!
- 새롭게 push할때마다 actions가 돌아간다.
- 이제 선택이긴 하지만...https설정과 domain 연결이 남았다!
- 그리고 내가 겪었던 오류와 window에서 ssh 연결하는 방법도 정리해야겠다.
# 참고
'django > 정리' 카테고리의 다른 글
AWS 배포(4) - SSH 연결 및 docker 관리 (1) | 2023.05.24 |
---|---|
AWS 배포(3) - https, 도메인 (0) | 2023.05.24 |
AWS 배포(1) - Django, Nginx, Gunicorn (0) | 2023.05.23 |
CEOS Readme 정리 - 4주차:DRF2 : Simple JWT & Permission (0) | 2023.05.08 |
[Django] choice와 mutiplechoice (0) | 2023.03.22 |