아마존 웹 서비스(AWS)에서 제공하는 클라우드 컴퓨팅 서비스
클라우드 컴퓨팅이란? 인터넷(클라우드)을 통해 서버, 스토리지, 데이터베이스 등의 컴퓨팅 서비스를 제공해주는 것
-> AWS에서 원격으로 제어할 수 있는 가상의 컴퓨터를 한 대 빌리는 것
클라우드 컴퓨팅을 통해 실제 서버를 구축하는 것보다 훨씬 간편하고 효율적이고 비용도 절감할 수 있음 !
EC2에 대해 더 자세히 알고 싶다면 아래 사이트 참고 !
이번 미니 프로젝트에서 활용할 EC2 서버는 강사님께서 준비해주셨다!
그래서 리눅스 기반 서버에 접속하려면, putty를 다운받고 강사님께서 주신 ip주소와 .ppk 파일을 활용해야 했고, 이를 통해 쉽게 서버에 접속할 수 있었다.
putty로 ec2 서버 접속하는 방법은 아래 블로그를 참고 !
자 이제 putty로 열린 서버에서 웹사이트를 구동하기 위해서 내가 할 일은 !
adduser(내 계정 만들기)
파이썬 설치하기
가상환경 만들기
장고 설치하기
도커 설치하기
git clone으로 깃 허브 연결하기
서버 id_rsa.pub(public key)받아서 깃 허브 ssh key에 추가
git pull, push 등 실행 잘 되는지 확인
장고 settings.pydml allowhost 수정해서 서버 ip로 홈페이지 열리게 구현하기
도커 sql컨테이너 생성해서 장고 db로 연결하기(이때, 컨테이너가 삭제된다고 해서 안의 db data가 날라가지 않도록 도커 볼륨으로 서버 내 지정한 디렉터리로 동일한 data 저장되게 함)
mysqlclinet 설치하기
mysql 컨테이너 안에 장고와 연결할 database 만들기
장고 settings.py의 databases (sqlite -> mysql로 수정)
➡️ 위의 과정들을 통해 최종적으로 서버ip:8000 웹사이트가 제대로 실행되는지 여부와
웹사이트에서 계정을 생성하고, 글을 쓰거나 댓글을 달면 mysql db에서 데이터가 확인되는지 !
이 두가지를 구현하는 것을 목표로 했다 !!!
처음 서버에 접속하면 위의 사진처럼 login as: 가 뜰거다. 이때 나는 ubuntu를 사용할 것이므로, ubuntu를 입력해줌. ubuntu를 입력하면 어쩌구저쩌구 길게 쭉~~ 뜨면서 서버 안의 정보가 뜸 (걍 넘기자)
sudo adduser [id]
su [id]
ubuntu 계정으로 다시 돌아와 아래 명령어 실행
sudo visudo
예) # User privilege specification
root ALL=(ALL:ALL) ALL
hey9 ALL=(ALL:ALL) ALL
-> 이렇게 수정하면 앞으로 내 계정에서도 sudo 명령어를 쓸 수 있게 권한이 부여됨 !
sudo apt update
sudo apt install python3.10
sudo apt python3-pip
이건 이전의 VSCODE의 WSL에서 가상환경 만든 것과 동일하다.
sudo apt install python3.10-venv
sudo python3 -m venv venv
(venv라는 가상환경 생성하는 명령어)
source venv/bin/activate
로 가상환경 잘 실행되는지 확인
vi start.sh
(shell 생성)
i 누르고(insert 모드 변경)
상단에 #!/bin/bash
라인 추가
. 가상 환경 경로 입력(source 가상 환경 경로도 가능)
esc 누르고 :wq 입력 후 enter
deactivate
한 후 . /start.sh
입력 시 가상환경에 진입하는지 확인
pip install django
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker your_username
sudo apt install git
sudo git clone (깃허브주소)
cd .ssh
-> ssh-keygen -t rsa
-> cat id_rsa.pub
-> 화면에 나오는 ssh key를 git hub의 ssh key에 추가(서버는 로컬과 또다른 컴퓨터라고 생각하면됨, 그래서 서버의 ssh key를 등록해야 git hub 레포지토리에 접근이 가능해짐)
git pull origin main
git add .
git commit -m "test"
git push origin main
등의 명령어로 git이 잘 실행되는지 확인
서버에서 sudo python3 manage.py runserver 0.0.0.0:8000
를 입력하고
웹페이지의 주소를 서버ip:8000
으로 입력하면 페이지가 실행되지 않음 !
이유는 서버에서 장고를 host하려고 하는데, 이를 허용해주지 않았기 때문
따라서 장고의 settings.py에 들어가서 allowedhost 이 부분을 수정해주어야 한다.
allowed_host 이 부분안을 ip주소로 대체하거나 아예 전체의 주소로 host를 허용한다는 의미의 "*"
을 넣어도 된다.
그럼 다시 웹페이지의 주소를 서버ip:8000
으로 입력하면 제대로 실행되는 것을 볼 수 있다 !!
도커의 컨테이너를 띄워서 하는 이유: 서버내에서 mysql을 설치하고 db를 생성하는 것에 비해 한번에 관리하기 편하기 때문 ! (자세한건 ..더보기)
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=비밀번호 --name django_db -v /home/mysql/data:/var/lib/mysql mysql:8.0.32 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower_case_table_names=2
docker run
: 도커 컨테이너를 실행하는 명령어
-d
: 컨테이너를 백그라운드에서 실행하도록 지정하는 옵션
-p 4000:3306
: 호스트의 포트 3306을 컨테이너의 포트 3306에 연결하는 옵션(mysql의 기본 포트는 3306)
-e MYSQL_ROOT_PASSWORD=1234
: MySQL 루트 사용자의 비밀번호를 "비밀번호"로 설정하는 환경 변수
--name django_db
: 컨테이너의 이름을 django_db로 지정하는 옵션
-v /home/mysql/data:/var/lib/mysql
: 호스트의 home/mysql/data 디렉토리와 컨테이너의 /var/lib/mysql 디렉토리를 데이터 볼륨으로 연결하는 옵션! 이를 통해 호스트와 컨테이너 간의 데이터를 공유(컨테이너가 삭제되어도 서버 디렉토리 내에 data가 남아있음)
mysql:8.0.32
: 실행할 도커 이미지의 이름과 버전
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --lower_case_table_names=2: MySQL
서버의 문자셋, 콜레이션, 테이블 이름의 대소문자 처리를 설정하는 옵션으로, UTF-8 (utf8mb4) 문자셋과 대소문자를 구분하지 않는 콜레이션, 대소문자를 구분하는 테이블 이름 설정을 지정
따라서 위의 명령어는 MySQL 8.0.32 버전을 실행하고, 호스트의 3306 포트를 통해 컨테이너 내의 MySQL 서버에 접근할 수 있도록 설정하며, 데이터를 호스트의 home/mysql/data 디렉토리와 컨테이너의 /var/lib/mysql 디렉토리 간에 공유함. MySQL 서버는 UTF-8 문자셋을 사용하며, 대소문자를 구분하지 않는 콜레이션과 대소문자를 구분하는 테이블 이름 설정을 가짐 !
mysqlclient를 설치해주는 이유: 안설치하고 계속 장고 runserver하려고 하면 서버에서 Did you install mysqlclient?
라고 물어봄 .. -> 이유는 ... 아직 잘 모르겠네요 ...
암튼 mysqlclient 설치하는 법은 https://pypi.org/project/mysqlclient/ 공식 홈페이지를 참고함 !
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
pip install mysqlclient
그럼 이제 사진처럼 열심히 설치완료됨 !
도커의 mysql 컨테이너 안에 아직 아무 database가 없으므로 장고와 연결할 database를 만들어줘야 함
1) MySQL 컨테이너에 쉘 접속: 아래 명령어를 사용하여 MySQL 컨테이너에 쉘 접속
docker exec -it <container_name_or_id> bash
우리는 위에서 컨테이너 이름을 django_db라고 지어서 docker exec -it django_db bash
2) MySQL 클라이언트 실행
mysql -u <mysql_username> -p
우리의 경우는 mysql -u root -p
3) MySQL 비밀번호 입력: 위의 명령어를 실행하면 비밀번호를 입력하라는 메시지가 표시됨. MySQL 비밀번호를 입력하고 엔터 키를 누르기 !
4) 데이터베이스 생성: MySQL 클라이언트에서 아래 명령어를 사용하여 데이터베이스를 생성
CREATE DATABASE <database_name>;
나의 경우 database_name은 django_db로 했음
5) 데이터베이스 확인: 데이터베이스가 성공적으로 생성되었는지 확인하기 위해 아래 명령어를 사용
SHOW DATABASES;
장고 프로젝트와 도커 mysql 컨테이너를 연결하기 위해서는 장고의 settings.py 파일의 databases 부분을 수정해야 함 !
DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DATABASE 명',
'USER': 'DB접속 계정명',
'PASSWORD': 'DB접속용 비밀번호',
'HOST': '서버 ip,
'PORT': '3306',
}
}
나의 경우는 위 사진과 같이 수정했다 !
^^ 이제 진짜 찐으로 장고의 서버 작업이 완료되었다 !
장고가 웹에서 잘 구현되는지 확인하기 위해 runserver를 해주기에 앞서
python3 manage.py migrate
를 통해 장고의 수정사항을 업데이트 해주자.
마지막으로 python3 manage.py runserver 0.0.0.0:8000
를 통해 웹페이지를 구동해주면 ~~
이제 더이상 localhost가 아닌, 서버ip 주소로 외부 사람들도 접속가능한 웹페이지를 구현하는데 성공했다 !!!
++ mysql workbench를 다운받아 나의 장고 db를 확인할 수 있고, database의 erd 또한 확인 가능하다. 이는 나도 타 블로그를 참고하였으므로, 아래 블로그의 주소를 남겨두었다.
(아래는 위 홈페이지 database의 erd)
mysql database erd 관련 블로그 참고 !