[Django] Django Google Cloud Platform를 이용하여 배포하기(SSH shell에 python 최신버전 다운)
오늘은 django에서 진행한 프로젝트를 google cloud platform에 배포를 진행 해볼 예정이다. @@
필자는 이미 만들어놓은 django 프로젝트에 대해서 GCP에 배포를 할것이며 Git을 통해 레포지토리에 있는 장고 프로젝트를 서버에 클론을 해서 배포를 진행할 예정이다.
모든 인스턴스 이름 SSH키의 title과 같이 이름이 들어가는 곳은 모두 django-deploy로 통일을 하고 진행을 했다.
아마도 서로 다르게 해도 크게 문제 될것은 없어보이나 혹시 몰라서 이름을 모두 통일을 했다.
GCP에 들어와서 새로운 프로젝트 생성
- 새로운 프로젝트를 설정
- Compute Engine API 사용을 클릭
- 새로운 VM인스턴스 생성
- 부팅 디스크는 Ubuntu로 변경하고 엑세스 범위는 모든 API에 대해서 허용을 해주고 방화벽 또한 모두 풀어준다.
VM인스턴스 설정 완료
네트워크 세부정보 보기로 이동한 다음에 방화벽에 대한 설정을 진행
- 방화벽 규칙만들기 클릭
- 방화벽 규칙에 대한 설정을 아래와 같이 진행해준다.
방화벽 생성!!!!
- VPC네트워크에서 외부 IP주소를 고정
외부 IP주소를 고정해준다.
SSH Shell에 들어간 후 Git과 연동하기 위한 SSH키 생성
- SSH키를 생성하기 위한 코드를 SSH창에 입력을 한다.
- 위치는 home/{your id} 이다.
ssh-keygen -t rsa -b 4096 -C "your_github_email.com"
- 패키지를 업데이트
sudo apt-get update && sudo apt-get dist-upgrade
- 중간에 아래와 같은 메세지가 떳을 때 Y를 누르고 진행
Need to get 91.5 MB of archives.
After this operation, 169 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
- 파이썬의 버전과 pip의 버전을 확인해본다.
- 파이썬은 기본적으로 3.8버전이 다운되어 있고 pip는 설치가 되어있지 않은것을 볼 수 있다.
- 필자는 파이썬이 3.11버전이라 업데이트를 해주려 했더니 ubuntu에서는 안되는 것 같다. 이것은 좀 더 알아봐야 겠다.
- pip를 설치를 진행한다.
sudo apt install python3-pip
가상환경 설치
필자가 아는 가상환경 설치는 일단 2가지 이다.
- 첫번째 virtualenv를 통한 가상환경 셋팅
- 두번째 anaconda, miniconda를 통한 가상환경 셋팅
여기서 가상환경을 설치하기 위해서 필자는 miniconda를 설치하고 가상환경을 만들었지만 virtualenv를 통해서 가상환경을 셋팅을 할 수 있다.
miniconda를 설치하고 miniconda로 가상환경을 셋팅한다면 python의 버전도 최신 버전으로 다운되며 Ubuntu버전에서 기본으로 제공되는 3.8버전의 python을 바꾸기 위해 다른 sudo apt install python3.9를 진행하고 그에 따라 python이 실행될 때 3.8버전이 아닌 3.9버전을 켜주기 위한 환경변수 설정도 하지 않아도 된다. 매우편함!!!!(직접 느낌)@@++
miniconda를 통한 가상환경 셋팅(django에서는 사용안함)
- 끝이나면 이제 가상환경을 셋팅을 위해 miniconda를 다운받는다.
- 경로를 이동해준다.
cd ../../opt/
- miniconda를 설치
- Miniconda Linux 설치 : https://docs.anaconda.com/free/miniconda/
mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm -rf ~/miniconda3/miniconda.sh
- 설치가 끝난 후 새로 설치한 미니콘다를 초기화 해준다. 다음 명령은 bash 및 zsh 셸을 초기화해주는 명령어이다.
- 하나하나씩 GCP shell에 입력한다.
~/miniconda3/bin/conda init bash
~/miniconda3/bin/conda init zsh
- 코드를 넣었다면 이제 메세지로 shell창을 껏다 키라고 하는 메세지가 보인다. shell창을 껏다 키자.
- 위와 같이 base라는 가상환경이 설정되어있는 것을 볼 수 있다.
가상환경을 나갈때에는 아래 코드를 작성
conda deactivate
Virtualenv를 통한 가상환경 셋팅
django의 프로젝트 파일 경로로 들어간다.
근데 여기서 문제점이 발견되었다.
ssh 서버에서 python의 버전이 3.8.10이 최대였다.
필자가 개발환경에서 사용하는 파이썬의 버전이 3.11이기에 라이브러리나 다른 부분에서 오류가 발생할 확률이 존재 했다.
그렇기에 python의 버전을 3.11로 올려서 virtualenv로 가상환경을 만드는 방법에 대해서 찾아 보았다.
2가지의 방법이 존재하는데
- Python 공식 홈페이지에서 소스 코드를 다운로드하여 빌드한다.
- 우분투의 PPA(Personal Package Archive)를 사용하여 설치할 수 있다.
필자는 PPA를 활용하여 python을 3.11버전으로 가상환경을 만들어 보겠다.
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.11
PPA를 다운받아준다. 그리고 패키지를 다운 받앗기에 sudo apt-get update를 실행해준다.
이제 shell에 which python3.11을 써보면 python3.11이 어디에 저장되어있는지 알 수 있다.
위에 코드는 무슨 shell을 사용하는지 찾아보는 리눅스 명령어이다.
우리는 python3.11버전을 다운 받았고 이제 python이 저절로 3.11버전이 사용 되어지게끔 환경변수를 설정을 해주어야 한다.
vi 편집기에서 shell에 따라 환경변수를 설정하는 코드가 바뀐다.
vi ~/.bashrc # shell이 bash일 때
vi ~/.zshrc # shell이 zsh일 때
필자는 위에서 ubuntu의 shell이 무엇인지 확인했기에 아래코드를 사용한다.
vi ~/.bashrc
이제 python3의 환경변수를 python3.11이 기본으로 설정되게끔 환경변수를 바꿔주자
vi편집기를 이용해서 들어간 후에
export PATH="/usr/bin/python3.11:$PATH"
alias python='/usr/bin/python3.11'
맨 밑에 줄에 아무 곳이나 추가를 해주면 된다.
여기서 vi편집기에 insert를 하기 위해서는 vi편집기를 들어가서 i를 눌러주면 insert모드가 되고 esc를 누르면 insert모드가 꺼지게 된다.
그 후에 밑에 코드를 넣어주면 바꿔준 설정이 저장이 되면서 vi편집기가 꺼지게 된다.
:wq!
이제 아래의 코드를 넣어서 바뀐 환경변수에 대해서 저장을 해주게 된다.
source ~/.bashrc
그러고 python --version을 작성하면 3.11.9가 설정되어 있는것을 볼 수 있다.
만약 가상환경을 만들어 주는 virtualenv가 존재하지 않는다면 아래의 코드로 virtualenv를 다운받아준다.
sudo apt install python3-virtualenv
근데 여기서 문제는 virtualenv로 가상환경을 만들려고 하니 계속 아래와 같은 에러가 떳다. 이거를 해결을 못하고 있다.ㅠㅠㅠㅠ
그냥 virtualenv를 사용하지 말자!!
그래서 결국에는 python의 내장 가상환경 설정인 python3 -m venv {가상환경}을 사용해서 만들어 주었다.
그런데 아래와 같은 에러가 떠서 에러가 알려준 대로 관리자 권한으로 아래의 install 코드를 실행해주었다.
sudo apt install python3.11-venv
그랫더니 아래와 같이 venv의 가상환경이 만들어 지는 것을 볼 수 있다.
python3.11 -m venv venv
# python -m venv venv 이렇게 작성해도 된다. 환경변수를 설정해주었기 때문에
이것으로 python3.11을 설치하고 python3.11버전으로 python의 내장 venv기능으로 가상환경을 만드는 방법을 알아보았다.
@@@@
GIT과 서버를 연동하기
기본적으로 SSh shell에는 git이 깔려있다.
git이 깔려있는지는 버전 확인을 통해서 확인이 가능하며 만약 깔려있지 않다면 설치를 하는 코드를 밑에 적어 놓겠다.
- sudo apt-get update -y는 다운받는 패키지들 중에 최신 버전이 있는지를 확인하는 코드이다.
- sudo apt-get upgrade -y는 sudo apt-get update -y 코드로 최신 버전이 존재한다고 확인이 된 패키지를 최신 버전으로 업그레이드 해주는 코드이다.
- -y는 무언가를 설치할 때 물어보지 않고 진행을 하겠다는 의미이다. @@++
sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt-get install git
git --version
필자는 git을 따로 깔지 않았어도 git --version을 찍어보면 버전이 뜨는 것을 확인 할 수 있다.
Git을 서버에 연동을 시켜준다.
- git config를 사용한다.
git config --global user.email "your_id@email.com"
git config --global user.name "yourname"
이렇게 진행을 하면 git과 서버에 연결은 끝이 났다.
이전에 발급을 받은 Public SSH 키를 git에 연결을 해보자.
cat .ssh/id_rsa.pub
위에 코드는 발급받은 Public SSH키를 볼 수 있는 코드이다. shell에 입력을 해준다.
그러면 public ssh키가 뜨는 것을 볼 수 있다.
이제 이것을 git에 setting에 SSH and GPG keys부분의 설정을 해주자
밑에 그림과 같이 django-deploy라는 SSH키가 생긴것을 볼 수 있다.
이제 GCP창으로 넘어와서 서버에 SSH키에 대한 설정을 진행해주자.
GCP창에서 Compute Engine에서 쭉 내리다 보면 메타데이터라는 콘솔이 존재한다. 그곳을 클릭해서 들어간다.
그러면 SSH키를 등록할 수 있는데 그곳에 Public SSH키를 등록해주자.
이로써 git과 서버에 연결은 끝이 났다.
GIT clone을 통해 로컬과 서버에 같은 repository를 만들어주기
필자는 이미 예전에 장고에 대해 공부하면서 git에 올려놓은 레포지토리가 있기에 그것을 서버에 clone하고 배포를 진행해 보겠다.
git clone은 서버에만 했다. 왜냐하면 이미 로컬에는 clone이 되어있기 때문에
서버를 열고 git clone을 해준다 이때 git에서는 SSH의 코드를 복사해서 clone을 진행해주어야 한다.
clone을 해주면 아래와 같이 서버에 clone이 되어있는것을 볼 수 있다.
이때 경로는 아래와 같다.
/home/srilankakim66
로컬에 또한 clone이 되어있는 것을 볼 수 있다.
필자는 예전에 해놨기 때문에 따로 하지는 않았지만 새로운 프로젝트를 시작한다면 로컬에도 git clone을 진행해주어야 한다.
이로써 git과 로컬 그리고 서버에 연결은 끝이났다.
이제 프로젝트에 들어가서 서버를 실행해보자.
Django project
장고 프로젝트에 들어와서 manage.py가 있는 경로까지 진입한다.
아 django를 설치하는 것을 까먹었다. django를 설치해주자.
경로를 잘 확인하고 django를 설치한 후 다시 manage.py가 있는 경로로 진입을 해보자.
장고에서는 새로운 models.py이 생겼거나 models.py가 바뀌면 꼭 마이그레이션을 진행을 해주어야 한다.
그렇기에 새로운 models.py에 대한 마이그레이션을 진행을 해야한다.
서버에서 마이그레이션을 진행하자.
이제 모든 것이 끝났다.
여기서 확인해야 할점은 django에서 배포를 진행할 때 setting에서 확인을 해야 할것이 있다.
setting에 Debug와 Host를 설정을 해주어야 한다.
Django의 공식문서 참조
Writing your first Django app, part 1 | Django documentation
The web framework for perfectionists with deadlines.
docs.djangoproject.com
setting.py가 있는 경로에 들어간 후 cat명령어를 실행해서 setting에 어떤것이 설정되어있는지 보자.
필자는 이미 설정을 진행을 해놨기 때문에 문제는 없겠지만 원래는 DEBUG와 ALLOWED_HOST부분이 지금과는 다르게 설정되어있을 것이다.
- DEBUG는 True에서 FALSE로 바꿔준다.
- ALLOWED_HOST는 원래 빈칸인데 GCP의 외부IP를 적어준다.
위에 행동은 로컬에서 진행을 해도 되고 서버에서 해도 된다. 하지만 로컬이든 서버든 바뀐사항이 있다면 git push와 git pull을 진행해주어야 한다.
이제 모든 준비가 끝났으므로 django의 서버를 실행해보자.
경로를 manage.py가 존재하는 곳으로 이동후 SSH 서버창에서 아래코드를 입력
python manage.py runserver 0.0.0.0:8000
실행창이 뜨고 도메인에는 외부 IP:8000을 작성해주면 된다.
엥 404 에러가 떳다 이게 무슨 일이지 했는데 아 기억나는게 있다.
이전에 필자가 미리 연습하면서 외부IP주소를 다른것으로 지정을 해놓고 다른 VM인스턴스로 다시 실행하니 ALLOWED_HOST가 맞지 않는 이슈가 생겻던 것이다.
그렇기에 로컬에서 외부 IP를 바꿔주고 git push를 진행
이제 SSH shell에서 git pull을 받으면 잘 돌아갈 것이다
git pull을 받은 후에 cat으로 setting.py를 확인해보니 로컬에서 바꾼 ALLOWED_HOST가 pull이 되어진 것을 볼 수 있다.
로컬에서 git push한 것이 SSH shell에서도 pull이 잘 되는것을 보니 일단 SSH서버와 git은 연동이 잘되어있다는 증거이다!!!
각설하고 다시 서버를 켜본다.
서버가 잘 돌아가는 것을 확인 할 수 있다.
여기까지 오늘은 git을 통해 SSH서버와 로컬을 연결하고 그리고 django로 만든 프로젝트를 배포하는 방법까지 블로그를 작성을 했다.
여기까지 했을 때 이제는 CI/CD에서 고민을 해야된다. 결국에는 개발자는 개발에만 신경쓰기 위해서 CI/CD를 할줄 알아야 한다. 로컬에서 개발을 진행하고 항상 서버에 들어가서 pull을 하기에는 시간이 낭비되기 때문이다.
그렇기에 다음 블로그는 github-action을 공부하고 그에 따라 CI/CD까지 하는 블로그를 작성을 해야겠다.
그리고 여기서 또한가지 드는 생각은 자동화를 함에 따라 로컬에서 다운받은 라이브러리가 서버에서는 다운이 되지 않아 뭔가 에러가 생길것 같다는 예감이 든다.
필자는 이것을 requirements.txt를 만들어서 다운을 받아 줄려고 했는데 이것은 라이브러리를 다운받을 때마다 로컬에서 리스트화 해주고 이것을 push를 하고 서버에 들어가서 이 리스트를 다운받아야 하는 아주 번거로운 일일 것이라는 생각이든다.
그렇기에 위에 방법보다 친구한테 주워들은 Docker를 사용해서 로컬에서 라이브러리를 다운받았을 때 저절로 서버에서도 다운이 되어지는 방법에 대해서 공부를 해봐야 겠다.
@@@@