이제 정말 배포를 해야만 한다.
사실은 지난주에 했어야 됬는데
팀 프로젝트할 때 배포 담당하셨던 분은 따로 도커사용은 안 하셨던 것 같은데
나는 강의 보면서 따라해야해서 도커를 사용
다음에 또 배포할 일이 생길지 모르니 정리해두자.
발표 당시에 정확하게 원인은 못 찾았지만 사이트가 엄청 느려서 고생했었음
실시간으로 보시던 튜터님이 문제 발생 이유가 둘 중 하나 일 것 같다고 하심
아마 1번일 것 같다고 하셨어서
이번에는 프리티어인 t2.micro보다 높은 단계인 t2.medium으로 생성함.
그 외 설정은 os는 ubuntu, security group은 SSH, HTTPS, HTTP전부 허용해서 생성, storage는 30gb. 강의에서 나온 그대로 따라함.
터미널로 ssh 접속, aws에서 바로 들어가는 방법도 있었던 것 같은데 강의를 그대로 따라해 보았다.
ssh -i {key pair pem파일 주소} ubuntu@{퍼블릭 ipv4 주소}
key pair pem 파일 파인더에서 드래그앤드랍해도 주소 입력되서 너무 편했다
연결하겠냐고 묻는 문구가 나오면 yes 입력!
정상적으로 접속되면 사진처럼 나옴
sudo apt install docker.io -y
제대로 설치되었나 확인
sudo docker --version # 도커 버전 확인
sudo mkdir -p /usr/lib/docker/cli-plugins
sudo curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o /usr/lib/docker/cli-plugins/docker-compose
sudo chmod +x /usr/lib/docker/cli-plugins/docker-compose
sudo docker compose version # 버전이 출력되면 정상!
path : /home/ubuntu/
├── backend
│ ├── Dockerfile
│ └── django # 여기에 프로젝트 코드가 들어감!
├── docker-compose.yml
└── nginx
└── default.conf
nginx 디렉토리 안에 default.conf 파일 생성
mkdir nginx
vi nginx/default.conf # 스펠링 틀리면 에러날 수 있으니 확인!
내용 입력
server {
listen 80;
server_name _; # 모든 도메인 혹은 ip로 들어오는 요청에 대해 처리해 줍니다.
# 이 부분 나중에 도메인 구매 후 수정!!
location / { # nginx로 요청이 들어왔을 때
proxy_pass http://backend:8000/; # backend 컨테이의 8000번 포트로 전달합니다.
}
location /static/ { # 브라우저에서 /static/ 경로로 요청이 들어왔을 때
alias /static/; # /static/ 경로에 있는 파일들을 보여줍니다.
}
location /media/ { # 브라우저에서 /media/ 경로로 요청이 들어왔을 때
alias /media/; # /media/ 경로에 있는 파일들을 보여줍니다.
}
}
vim 컨닝 페이퍼:
i
쓰기모드,esc
읽기모드,:wq
저장하고 나가기,숫자dd
숫자만큼 삭제
vim은 나중에 더 공부해보자
mkdir backend # 디렉토리 생성
cd backend/ # 디렉토리 안으로 이동
git clone {깃헙 주소} ./django # django 디렉토리 안에 클론
# 위 설정을 따르지 않으면 뒤에 많은 파일의 경로들을 수정해야 함
# timezone 한국 시간대로 설정
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
# date 명령어로 UTC -> KST로 변경되었는지 확인 가능
vi backend/django/{프로젝트명}/settings.py
# ex) vi backend/django/teulang/settings.py
settings.py에 아래 내용 추가
# settings.py
# 환경변수에 따라 DEBUG모드 여부를 결정합니다.
DEBUG = os.environ.get('DEBUG', '0') == '1'
# 접속을 허용할 host를 설정합니다.
ALLOWED_HOSTS = ['backend', ]
# postgres 환경변수가 존재 할 경우에 postgres db에 연결을 시도합니다.
POSTGRES_DB = os.environ.get('POSTGRES_DB', '')
if POSTGRES_DB:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': POSTGRES_DB,
'USER': os.environ.get('POSTGRES_USER', ''),
'PASSWORD': os.environ.get('POSTGRES_PASSWORD', ''),
'HOST': os.environ.get('POSTGRES_HOST', ''),
'PORT': os.environ.get('POSTGRES_PORT', ''),
}
}
# 환경변수가 존재하지 않을 경우 sqlite3을 사용합니다.
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# CORS 허용 목록에 EC2 ip를 추가합니다.
CORS_ORIGIN_WHITELIST = ['http://{ec2_public_ip}']
# ex) CORS_ORIGIN_WHITELIST = ['http://43.201.72.190']
# CSRF 허용 목록을 CORS와 동일하게 설정합니다.
CSRF_TRUSTED_ORIGINS = CORS_ORIGIN_WHITELIST
STATIC_ROOT = BASE_DIR / "static" # 이미 있다면 추가 안해도 됨
굳이 vim으로 수정 안하고 미리 깃에 푸시하고 받아도 됨
.env 파일 추가
env파일은 깃에 올려두지 않으니 원래 위치에 직접 생성하기
vi backend/django/.env
vi Dockerfile # backend 디렉토리 안에 만들어야 함! 경로 확인하고 생성
Dockerfile 안에 아래 내용 추가
# python 3.10.8버전 이미지를 사용해 빌드
FROM python:3.10.8
# .pyc 파일을 생성하지 않도록 설정합니다.
ENV PYTHONDONTWRITEBYTECODE 1
# 파이썬 로그가 버퍼링 없이 즉각적으로 출력하도록 설정합니다.
ENV PYTHONUNBUFFERED 1
# /app/ 디렉토리를 생성합니다.
RUN mkdir /app/
# /app/ 경로를 작업 디렉토리로 설정합니다.
WORKDIR /app/
# opencv 설치에러 방지
RUN apt-get update
RUN apt-get -y install libgl1-mesa-glx
# requirments.txt를 작업 디렉토리(/app/) 경로로 복사합니다.
COPY ./django/requirements.txt .
# 프로젝트 실행에 필요한 패키지들을 설치합니다.
RUN pip install --no-cache-dir -r requirements.txt
# gunicorn을 사용하기 위한 패키지를 설치합니다.
RUN pip install gunicorn psycopg2
# psycopg2: python에서 postgresql 연결할 때 쓰이는 패키지
vi docker-compose.yml # 루트 디렉토리에 있어야 함 위치확인하기!
아래 코드 붙여넣기 (프로젝트명 맞춰서 수정 필요!)
version: '3.8'
volumes:
postgres: {}
django_media: {}
django_static: {}
services:
postgres:
container_name: postgres
image: postgres:14.5
volumes:
- postgres:/var/lib/postgresql/data/
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=P@ssw0rd
- POSTGRES_DB=django
restart: always
backend:
container_name: backend
build: ./backend/
entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn 프로젝트명.wsgi --workers=5 -b 0.0.0.0:8000"
volumes:
- ./backend/django/:/app/
- /etc/localtime:/etc/localtime:ro
- django_media:/app/media/ # nginx에서 media를 사용할 수 있도록 volume을 지정해줍니다.
- django_static:/app/static/ # nginx에서 static을 사용할 수 있도록 volume을 지정해줍니다.
environment: # django에서 사용할 설정들을 지정해줍니다.
- DEBUG=1
- POSTGRES_DB=django
- POSTGRES_USER=user
- POSTGRES_PASSWORD=P@ssw0rd
- POSTGRES_HOST=postgres
- POSTGRES_PORT=5432
depends_on:
- postgres
restart: always
nginx:
container_name : nginx
image: nginx:1.23.2
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- django_media:/media/ # django의 media를 사용할 수 있도록 volume을 지정해줍니다.
- django_static:/static/ # django의 static 사용할 수 있도록 volume을 지정해줍니다.
depends_on:
- backend
restart: always
sudo docker compose up --build -d # 컨테이너 실행시키기
sudo docker compose logs -f # 로그 확인하기
❗️❗️❗️ ip 주소로 들어가지는 지 확인! ❗️❗️❗️
🐳 docker 컨닝 페이퍼
sudo docker ps # 활성화된 컨테이너 확인하기 sudo docker ps -a # 컨테이너 전부 확인하기 sudo docker exec -it $container_id /bin/bash # 컨테이너 안으로 들어가기(터미널) sudo docker compose stop # 중지 sudo docker compose down # 삭제 sudo docker compose restart # 재시작
🙃 반쪽 컨닝 페이퍼
로그 확인, vim, shell, 컨테이너 내부 등에서 밖으로 나갈 때
cntrol + c
,:wq
,exit()
,exit
중 하나임
컨테이너 내부로 들어가기
sudo docker exec -it backend /bin/bash
admin 계정 생성
python manage.py createsuperuser
❗️❗️❗️ admin page 로그인 확인해보기! ❗️❗️❗️
python manage.py shell
>>> from django.db import connections
>>> form pprint import pprint
>>> pprint(connections.databases)
다음편 링크 : 도커로 백엔드 장고 배포(2/3) AWS