제수기 - 제발 수업내용을 기억해라 / 단순 수업정리 시리즈
GPT 설명 참고
https://chatgpt.com/share/67a46026-11c0-800d-96a2-34d03228ef52
모바액스텀에 sudo apt-get upadate로 최신화를 시켜주고
mysql 서버 깔기
sudo apt-get install mysql-server -y
리눅스 서비스라고 하는 건 윈도우 서비스처럼 일련의 프로그램을 백그라운드에서 돌리기 위함이다.
sudo systemctl status mysql
이때 뜨는 enabled는 컴퓨터 킬 때마다 실행시키겠다는 의미.
루트 계정의 비밀번호 설정은
sudo mysql_secure_installation
접속해보기
sudo mysql -u root -p
show databases; 이러면 상황 볼 수 있고, 여기서 사용자 만들고 디비 만들고 사용자한테 디비 권한주고 하는걸 여기서 해야함.
root는 원격접속을 허용하지 않는다.
이후에 파이참에서 접속정보를 만들면 된다.
이제 consol에서
show databases;
이제 팀원들끼리 ec2 여러개 만들어서
개발용 db/운영용 db/웹서버/ai 추론서버 이런식으로 역할 정해서 활용하면 좋다.
migration 누군가 잘못하면 다 날라가기 때문에, 백업을 해주면 좋다. 하루에 한번씩.
local에 있는 image. push를 dockerhub에 보내고, aws ec2가 이걸 pull 해온다. aws ec1에서는 django가 돌아가고 있다. 그러면 인스턴스를 통해서 url이 있는 곳에서 다 접속할 수 있다. 물론 이때 ec2에 docker가 설치돼 있어야 한다.
아무나 들어오면 push 하면 안 되기 때문에 당연히 인증이 필요하다. 파이참 터미널에 docker login
docker push username/django-wsgi-asgi
다 푸시되고 도커 허브에 가보면 확인할 수 있다. 태그도 할 수 있고. (Repositories에서 확인 가능)
이제 어디서나 pull 로 땡겨서 container로 실행이 가능한 상태가 됐다.
윈도우에서는 docker desktop을 사용해서 docker engine, docker runtime 을 설치했다.
리눅스 계열의 ubuntu로 설치하는 건 무지 간단하다.
지금은 ubuntu로 돼있는데, docker 설치하거나 하려면 관리자 권한이 필요하다.
관리자 로그인
sudo su
이렇게 쓰면 일반 ubuntu 사용자로 로그인을 하고, 관리자로 로그인을 하게 되는 거다. 앞의 글자가 root로 바뀐 걸 확인할 수 있다.
도커를 다운로드 하는 패키지 스크립트가 있어서 그걸 그대로 넣어주면 된다
는 shift insert를 해주면 된다.
curl 로 다운받고, bash로 바로 실행하라는 명령어다.
이제 아까 올린 image를 pull 해보자.
docker run -d -p 8000:8000 username/imagename
docker ps -a
해서 실행 후 확인
host os에 docker 설치 -> 거기에 django-wsgi-asgi 라는 container를 하나 돌리고 있는 거다. 이 노란 박스 하나가 컴퓨터 하나. 그리고 여기서 8000번 포트에 django 서버가 하나 구동 중인 거다.
우리가 p 옵션을 준 건, host os에 8000번으로 접속을 하면 이걸 보고 django에 연결을 해주겠다는 거다. window에서는 host os가 window였고 ubuntu에서는 host os가 ubuntu가 된 것 뿐이다. 작동 방식은 똑같다
이제 public ip 주소에 :8000 을 입력하면 창이 뜰까?
아니다.
ec2 안에 리눅스 내부 보안벽이 있고, aws의 security gruop이 있다. security group이 허가를 해줘야 열린다.
ec2의 security group에서 들어오는 인바운드 요청을 허가하는 설정을 해보자.
add rule을 하고 아래와 같이 지정해준다. 어디서나 접속이 가능하게 하는 anywhere-IPv4를 선택해준다.
규칙 저장을 하면, 8000 포트가 생긴 걸 확인할 수 있다.
그러고 나서 다시 id+:8000 입력해보면 이제 장고의 오류페이지가 뜨게 된다.
이건 왜 이럴까?
그러면 이제 설정이 바뀌었는데, 이 사실을 ec2에게 알려야 한다. image를 다시 말아준다. 터미널에서
docker build -t jovytree/imagename .
docker push username/imagename
이렇게 하고 나면 docker hub에서 push가 된 걸 확인할 수 있다.
지금 돌고 있는 container를 중단하고,
docker pull username/imagename
을 해준다.
아까 했던 run
으로 실행
docker ps -a
으로 확인
에러 메시지 엔딩.. 아직 수업진도 따라가야 할 게 많은데.. django app.zip 까지는 가지도 못했다. -> 오타때문이었다. 해결.
django.app 을 파이참으로 실행
settings.py 에 아래와 같은 설정을 준다.
그렇게 해놓고 index_html에서 static 태그를 줘서 로드를 하면 된다.
gunicorn으로 uvicorn 프로세스를 멀티로 실행하는 구조.
image를 말 때 requirement.txt를 통해서 필요한 python 패키지를 쓴다.
그러면 이제 도커 이미지로 말아서 실행해보면 된다.
docker build -t username/containername .
기존에 돌고 있는 runserver는 꺼주고, run을 돌려보자.
docker run -d -p 8000:8000 username/containername
docker pas -a 로 잘 됐는지 확인
gunicorn은 static 파일에 대한 요청을 무시함. 클라우드상에서 봐도 그렇다.
그래서 whitenoise package를 통해서 정적 파일을 넘길 수 있게 해줘야 한다.
requirements.txt에 whitenoise 추가
그리고 django_env(가상환경)에도 설치해주자.
터미널에 pip install whitenoise
이제 settings.py에 whitenoise 설정하자.
settings.py의 MIDDLEWARE에는
'whitenoise.middleware.WhiteNoiseMiddleware',
추가
settings.py의 STATIC 쪽에는
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
추가
asgi.py 파일에도 추가로 whitenoise 설정
이제 모아주는 작업을 한다.
터미널에 python manage.py collectstatic
그리고 나중에 ec2로 배포할 것까지 생각해서, settings.py의 ALLOWED_HOST에
= [
'localhost',
'ec2 인스턴스 퍼블릭 IP'
]
추가
이제 이대로 한번 이미지 말기
docker build -t username/containername .
docker image 확인
docker ps -a
기존에 만들어둔 거 삭제
이제 방금 만든 이미지를 run하고 확인
접속파일 서빙용으로 whitenoise가 많이 쓰이고 있는데, 이게 보통 WSGI 용이다.
그런데 우리는 ASGI를 동시에 쓰고 있다.
그래서...
ASGI용으로 그냥 만들어졌다.
blacknoise는 whitenoise보다 훨씬 간단하다. 미들웨어, 스테틱 파일 모아주기 등의 작업이 필요가 없다.
터미널에 pip install blacknoise
requirments.txt에 blacknoise 추가
asgi.py에 설정 추가
이미지 빌드하고 하는 건 위와 같음.
파이썬에서 docker 푸시하고,
모바액스텀에서 docker run -d -p 8000:8000 username/containername 적어주면 된다.
근데 이 static 파일들은 서버에서 제공하는 거다. 기본적으로 제공해야 하는 img나 js, css 이런 것만 그렇게 하시고 실제 업로드 하는 사진. 상품 사진. 이런 건 S3에 올려서 해라. AWS의 파일 저장소를 쓰기 때문에 구니콘이나 이런 게 상관이 없다.