1. EC2 생성하기
아래 참고해서 EC2 생성해 줌

2. 환경 변수를 사용하도록 변경하기
settings.py에서 CSRF_TRUSTED_ORIGIN 환경 변수 설정
- 민감한 정보나 배포시 설정이 필요한 값들은 환경 변수로 설정하는 것이 좋음
# 환경변수를 가져오고 None이 아닐 경우에만 추가
extra_trusted_origin = os.getenv("CSRF_TRUSTED_ORIGIN")
if extra_trusted_origin:
CORS_ALLOWED_ORIGINS.append(extra_trusted_origin)
CSRF_TRUSTED_ORIGINS.append(extra_trusted_origin)
마찬가지로, settings.py에서 DB 접속 정보도 환경 변수로 설정
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql",
"NAME": os.getenv("DB_NAME"),
"USER": os.getenv("DB_USER"),
"PASSWORD": os.getenv("DB_PASSWORD"),
"HOST": os.getenv("DB_HOST"),
"PORT": "5432",
}
}
settings.py에서 .env 파일을 읽게 하기 위해 “python-dotenv” 종속성을 추가
- 추후 배포 과정에서 .env 파일에 “DB 연결” 관련된 환경 변수를 입력하고, 로드하게 하기 위함
uv add python-dotenv

settings.py에 .env 파일 로드 추가
from dotenv import load_dotenv
load_dotenv() # .env 파일 로드

.gitignore에 .env 추가

3. requirements.txt 생성하기
uv pip compile 명령으로 requirements.txt 생성하기
- requirements.txt는 EC2에서 동일한 배포 환경을 구성하는데 필요
- pyproject.toml의 내용을 바탕으로 requirements.txt가 생성됨
$ uv pip compile pyproject.toml -o requirements.txt

4. 배포 스크립트 파일 생성하기
runserver.sh 파일 생성
- 배포 시 해당 파일을 실행하여, 배포 환경을 구성하고 서버 실행하도록 함
- django-tutorial 디렉터리가 존재하면 git pull, 존재하지 않으면 git clone
- python3.12-venv가 설치 안 되있으면 설치
- 기존의 가상 환경 삭제하고, 새로운 가상 환경 생성 & 활성화
- 투표앱을 실행하기 위한 종속성을 설치 (이전 단계에서 생성한 requirements.txt로 설치 진행)
- 현재 실행 중인 투표 앱 프로세스의 pid를 확인하고, 해당 프로세스 종료
- 백그라운드로 투표 앱 서버 실행
#!/bin/bash
date > current_time.txt
# 해당 디렉터리가 있으면
if [ -d $HOME/my-first-django-project ]; then
# git pull
cd my-first-django-project
git pull origin main
else # 없으면
# git repository로부터 파일을 clone
git clone https://github.com/dojun43/my-first-django-project.git
cd my-first-django-project
fi
# python3.12-venv 없으면 설치
if dpkg -l | grep -q "python3.12-venv"; then
echo "python3.12-venv is already installed."
else
sudo apt update
sudo apt install -y python3.12-venv
echo "python3.12-venv is installed."
fi
# 가상 환경 설정
rm -rf .venv # 기존에 설치한 가상 환경 있으면 있으면 삭제
python3 -m venv .venv
source .venv/bin/activate
# 종속성 설치
pip3 install -r requirements.txt
# 종속성 설치 확인
pip3 freeze
# 서버가 실행중이면 끄기
export SERVER_PID=$(ps -ef | grep runserver | awk '{ print $2 }' | head -1)
echo "Server PID는 $SERVER_PID 번입니다. 해당 프로세스를 죽입니다..."
kill -15 $SERVER_PID
# 백그라운드로 서버 실행
DEBUG=True nohup python3 manage.py runserver 0.0.0.0:8000 > server.log 2>&1 &
5. github에 repository secret 추가하기
github에 환경변수 값들을 저장해두고, 배포시 해당 값들을 참조에서 사용하도록 secret 추가
- Settings에서 Actions 탭가서 [New repository secret] 클릭

EC2_PRIVATE_SECRET에 ec2의 pem 키 입력하고 추가

마찬가지로 DB 접속 정보와 EC2의 호스트(퍼블릭 IPv4 DNS)도 추가
- DB_HOST, DB_NAME, DB_PASSWORD, DB_USER, EC2_HOST를 추가함

EC2_HOST의 secret은 ec2 인스턴스 정보에서 확인하고 추가해줌

6. django.yaml 파일 생성
- .github/workflows/에 django.yaml 파일 생성하여 CI/CD 워크플로우 정의
- env: secrets에서 EC2 접속을 위한 환경변수를 읽음
- run:
- pem key 생성하고, 권한 변경
- ssh로 EC2에 접속하고, DB 연결을 위한 환경변수 .env 파일에 지정
- 마지막으로 배포 스크립트 실행
name: EC2 deploy
on:
push:
branches: [ "main" ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Tests
env:
# GitHub Secrets 사용
EC2_PRIVATE_SECRET: ${{ secrets.EC2_PRIVATE_SECRET }}
EC2_USER: "ubuntu"
EC2_HOST: ${{ secrets.EC2_HOST }}
run: |
echo "EC2 deploy start"
# pem key 생성
echo "${EC2_PRIVATE_SECRET}" > ec2-private-key.pem
chmod 400 ec2-private-key.pem
# 환경 변수 설정
ssh -o StrictHostKeyChecking=no -i ec2-private-key.pem ${EC2_USER}@${EC2_HOST} << 'EOF'
echo "DB_NAME=${{ secrets.DB_NAME }}" > .env
echo "DB_USER=${{ secrets.DB_USER }}" >> .env
echo "DB_PASSWORD=${{ secrets.DB_PASSWORD }}" >> .env
echo "DB_HOST=${{ secrets.DB_HOST }}" >> .env
EOF
# 배포 스크립트 실행
ssh -o StrictHostKeyChecking=no -i ec2-private-key.pem ${EC2_USER}@${EC2_HOST} "bash -s" < runserver.sh
환경 변수 사용시 주의사항
ssh 명령어에서 ${DB_NAME} 이런식으로 환경변수를 주입하려고 하면 안됨
- EC2 내부의 환경 변수를 사용하려고 해서 안되는거 같음

실제로 git push해서 배포하고, EC2 접속해서 .env 파일 확인해보면 값이 입력 안 되어있음
vi .env

다음과 같이 직접 secrets에서 참조하여 환경 변수를 지정하도록 변경

동일하게 git push해서 배포하고, EC2 접속해서 .env 파일 확인해보면 값이 정상적으로 입력됨

7. 배포하기
git push하면, CI/CD 워크플로우가 실행됨
$ git add .
$ git commit -m "create django.yaml"
$ git push -u origin main
확인해보면, 정상적으로 종속성 설치하고 서버를 실행함

EC2 접속해서 프로세스 확인하기
- 정상적으로 서버 실행 중
$ ssh -i "my-secret.pem" ubuntu@[host 주소]
$ ps -ef | grep runserver

요청 보내보기
curl http://localhost:8000/polls/ | jq

curl http://localhost:8000/polls/1/ | jq

curl http://localhost:8000/polls/1/results/ | jq

'DevOps > Git' 카테고리의 다른 글
[Git] Github Actions job, step 사용하기 (0) | 2024.12.31 |
---|---|
[Git] GitHub Actions 사용해보기 (0) | 2024.12.29 |
[Git] fork & branch (0) | 2024.11.22 |
[Git] local repository와 remote repository의 변경사항이 충돌하는 경우 (0) | 2024.11.19 |
[Git] Git 설치하기 & repository 사용하기 (0) | 2024.11.19 |