TIL. 최종프로젝트(12) 배포와 docker, poetry
[오늘 한일]
- 배포 진행
우리 팀은 3주차 도입부터는 배포를 병행하여 진행하기로 했다.
전체적인 분위기도 3주차부터는 배포를 시도하는 것 같았다.
[오늘 배운점]
<docker로 서버 구성하기>
AWS를 이용하여 배포를 하며, 백엔드 서버와 프론트 서버를 양분하는 것까지는,
이전 프로젝트들과 동일하게 했다.
이전에 도메인과 SSL인증서를 구매하고 받아놓은게 있었기 때문에
위와 같은 연결은 금방 구축했고, 프론트 서버는 배포가 완료가 되었다.
백엔드 서버 인스턴스를 구축하는 건 지금까지는 해보지 않은 방법을 시도했다.
바로 docker를 온전히 이용하는 방법이다.
(docker사용에 대해서는 프로젝트 바로 전주에 강의로 배웠다.)
우리팀은 개발단계에서부터 docker를 사용해야 했다.
Django channels를 위해서 redis를 동작시킬 필요가 있었는데,
docker destop을 이용해 각자 로컬환경에서도 redis 콘테이너를 돌리고 있었다.
그래서 실제 배포도 docker콘테이너의 사용이 적절한 선택지일수 밖에 없었다.
나는 강의에서 배웠던 대로 docker compose를 이용해
장고, postgresql, nginx, gunicorn을 구동시키기로 방향을 잡았다.
postgresql또한 개발 단계에서 이미 연결하고 있었기 때문에,
서버에서 구축만 한다면 바로 자연스럽게 연결할수 있는 상태였다.
먼저 위의 기반들이 돌아간다면 최종적으로 redis를 구동시킬 계획이였다.
docker compose 콘테이너를 구성하는게 꽤 난관이였다.
1. 먼저 장고와 postgresql을 동시에 연결하는 것 부터 시도했다.
이 과정에서 배운건,
docker-compose.yml 파일내에서 두 콘테이너에 대해 환경변수를 잘 넣어줘야 한다는 것이다.
우리팀은 환경변수를 .env 파일로 합쳐 관리했다보니
서버에도 이 .env를 그대로 만들어 줬다.
그리고 docker-compose.yml에서는 두 파일에 대한 환경변수를 파일로 지정하게 처리했다.
(docker-compose파일 위치 기반으로 상대위치를 정확히 지정한다.)
유의할점은, postgreSQL은 3가지 정해진 환경변수를 요구한다.
장고는 settings.py에 우리가 어떻게 적어줬느냐에 따라 환경변수명이 달라져도 된다.
즉, postgreSQL은 환경변수명이 정해져있고 장고는 정하기 나름이다.
그래서 환경변수명을 postgreSQL것으로 바꾸고 장고쪽을 맞춰줬다.
(각각 설정 할수 있겠지만 그러면 복잡할 것이다.)
2. 장고 콘테이너는 모듈설치가 잘 될수 있게끔한다.
장고를 구축할때는 Dockerfile이라는 파일이 중요한 역할을 하게된다.
콘테이너가 올라가면서 거기에 필요한 동작을 추가해준다.
장고가 올라갈때는 기본적 장고 세팅이 몇개 들어간 후
내가 옮겨넣은 장고 프로젝트 폴더를,
콘테이너 내부로 복사해가는 동작이 추가된다.
그 뒤로는 라이브러리 설치가 실행되야 한다.
강의에서 requirements를 pip으로 설치했던것과는 다르게
우리는 poetry를 사용했기에,
poetry 설치부터 poetry를 이용한 라이브러리, 모듈 설치까지 동작하게끔 설정한다.
이때 poetry를 설치하는 방법이 내가 알아본것만 3종류다.
이 방법을 모두 시도해봤는데 한가지 방법이 잘 동작했다.
- sudo apt install python3-poetry
- curl -sSL https://install.python-poetry.org | python3 - --version 1.5.1
- pip install poetry
이중 세번째 방법이다.
위의 두 방법에 비해 가장 문제 여지가 있어 보이는 방법이 콘테이너 설치에서는 깔끔하게 동작했다.
실제 서버에 직접 poetry를 깔아서 동작시킬때는
첫번째 방법이 제일 깔끔했다.
두번째 방법도 좋은데 설치가 된 이후 bash설정을 하나 바꿔줘야 한다.
3. nginx 콘테이너는 바로 잘 얹어졌다.
지금 돌아보면 결론적으론 그랬다.
세개를 동시에 올리려고 할때 예기치 않은 문제가 생겼는데,
django.db.utils.OperationalError: FATAL: password authentication failed for user "user
postgres | 2023-06-19 09:12:15.462 UTC [44] FATAL: password authentication failed for user "user"
postgres | 2023-06-19 09:12:15.462 UTC [44] DETAIL: Connection matched pg_hba.conf line 100: "host all all all scram-sha-256"
위는 docker compose logs의 내용이다.
장고에러와 postgres에러인데 비슷한 내용을 말하고 있다.
이 부분은 위에서 말한대로 환경변수를 잘 맞춰주니까 발생하지 않았다.
4. 위의 부분을 해결하기 위해 시도하던중, nginx를 다시 떼고
postgresql과 django만 구동했을때, 알게된 다른 문제가 있었다.
django 프로젝트 폴더내 아무런 migrations파일이 없는 상태에서 migrate를 실행하면
아무 것도 migrate하지 못하고 넘어가게 된다.
이럴 경우 두 컨테이너간의 연결성이 아무 문제 없더라도 동작에 문제가 생긴다.
이런 부분은 3중으로 올렸을때는 파악이 잘 안되었다.
2중으로 먼저 올려서 장고와 postgresql의 연결을 먼저 체크하는게 좋겠다.
(다만 그러기 위해선 장고 setting파일에 있는 다른 콘테이너를 호출하는 부분이 없어야 한다.
나는 주석처리로 일시 제외시키는 방법을 이용했다.)
장고프로젝트 파일에 migrations파일을 넣어주어 이문제를 해결했다.
(당연히 있었어야 했지만.. 빠트렸었다)
즉, 장고와 postgresql이 서로 연결이 잘 안되는 데는 크게 환경변수와 migrations파일 여부가 원인일 수 있다.
5. gunicorn까지 포함하여 웹서비스를 잘 동작시킬수 있었다.
※ 서버 디렉토리 구성도
root
~ /backend /han(프로젝트폴더) /.env
/Dockerfile
/docker-compose.yml
/nginx /default.conf
※ Dockerfile의 작성 모습이다.
#파이썬 3.8.6버전 이미지를 사용해 빌드
FROM python:3.8.6
# .pyc 파일을 생성하지 않도록 설정합니다.
ENV PYTHONDONTWRITEBYTECODE 1
# 파이썬 로그가 버퍼링 없이 즉각적으로 출력하도록 설정합니다.
ENV PYTHONUNBUFFERED 1
# /app/ 디렉토리를 생성합니다.
RUN mkdir /app/
# /app/ 경로를 작업 디렉토리로 설정합니다.
WORKDIR /app/
# poetry 파일을 작업 디렉토리(/app/) 경로로 복사합니다.
COPY ./han/poetry.lock .
COPY ./han/pyproject.toml .
# 프로젝트 실행에 필요한 패키지들을 설치합니다.
RUN pip install poetry
RUN poetry config virtualenvs.create false
RUN poetry install
(다른 파일은 추후 변경된 내역이 있어 다음 일차에 공유했습니다.)