Dev./Cloud

[Cloud] 배포 - NCP : 클라우드 서버에 올리기

Ivan'show 2023. 8. 13.
728x90
반응형

클라우드 서버로 띄우려면 기존 코드에서 환경설정을 바꿔주어야 한다.

환경변수를 위한 패키지로 os 를 사용한다.

import os

...

LOCAL_IP = os.getenv('LOCAL_IP', '')

ALLOWED_HOSTS = [
    "localhost",
    "127.0.0.1",
    LOCAL_IP,
]

CSRF_TRUSTED_ORIGINS = [
    "<http://localhost:8888>",
    f"http://{LOCAL_IP:8888}",
]

prod.env (docker-compose.yml 파일과 같은 경로)

LOCAL_IP={IP주소}

django.nginx

# 사실상 도메인 정보를 넣어두기 때문에 환경변수로 다루는게 좀 억지이긴 하지만 그래도 개발단계에서~
# 실제로는 파일을 수정하지 않고 Docker.nginx_ubt 로 수정한다.

localhost 로 되어 있는 부분을 해당 공인IP 로 바꾸어 주는 작업

docker-compose exec nginx /bin/bash
root@199b50897e62:/etc/nginx# echo $LOCAL_IP
root@199b50897e62:/etc/nginx# export LOCAL_IP=110.165.17.207
root@199b50897e62:/etc/nginx# echo $LOCAL_IP
110.165.17.207
sed -i "s/localhost/$LOCAL_IP/g" sites-available/django
vi sites-available/django

스크립트로 작성해서 넣어주자

# scripts/nginx_entry

#!/bin/bash

# django site file 변경
sed -i "s/\\$LOCAL_IP/$LOCAL_IP/g" /etc/nginx/sites-available/django
service nginx restart
# docker-compose.yml
# docker-compose 파일의 버전을 명시
version: "3"

services: # 서비스들의 시작
  # 앱 설정
  lion-app:
    container_name: lion-app-dc
    build:
      context: lion_app
      dockerfile: Dockerfile # 사용할 도커 파일의 이름
    image: lion-app:0.5
    ports:
      - "8000:8000" # 앞쪽이 호스트 시스템의 포트 : 뒤쪽이 컨테이너의 포트
    volumes:
      - ./lion_app:/app
      - staticfiles:/var/www/html/static
    command:
      - "/start"
    env_file:
      - ./prod.env

  nginx:
    depends_on:
      - lion-app
    container_name: lion-nginx-dc
    build:
      context: .
      dockerfile: Dockerfile.nginx_ubt
      # args:
      #   LOCAL_IP: "110.165.17.207" # 원래는 도메인 주소 값
    image: lion-nginx
    ports:
      - "8888:80"
    volumes:
      - staticfiles:/var/www/html/static
    env_file: # nginx 컨테이너에도 같은 환경변수가 들어가게 됨
      - ./prod.env

volumes:
  staticfiles:
# django.nginx
server {
	listen 80;
	# server_name http 223.130.133.96;
	server_name localhost $LOCAL_IP;

	location / {
		# 아래의 코드로는 nginx가 실행된 컨테이너의 주소로 보내기 때문에 Bad request 가 뜬다.
		# proxy_pass <http://127.0.0.1:8000>;

		# 그래서 lion-app 즉 장고가 떠있는 컨테이너의 8000포트로 프록시 패스로 넣어주어야 한다.
		proxy_pass <http://lion-app:8000>;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
	}

	location /static/ {
		alias /var/www/html/static/;
	}
}

# request: /static/admin/default.css
# actual path: /var/www/html/static/admin/default.css
# Dockerfile.nginx_ubt
FROM ubuntu:22.04

RUN apt-get update
RUN apt-get install -y nginx vim

RUN echo "\\ndaemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx

# nginx.conf 파일을 컨테이너로 가져가
COPY ./lion_app/lion_app/django.nginx /etc/nginx/sites-available/django
RUN ln -s /etc/nginx/sites-available/django /etc/nginx/sites-enabled/django

WORKDIR /etc/nginx

RUN mkdir /var/www/html/static

COPY ./scripts/nginx_entry /entrypoint

# Shell script COPY 를 할때 무조건 해주어야 하는 설정
# 문자열 줄바꿈과 실행권한 체크
RUN sed -i "s/\\r$//g" /entrypoint
RUN chmod +x /entrypoint

# 무조건 어떤 설정을 하든 컨테이너가 실행될 때 실행됨
ENTRYPOINT [ "/entrypoint" ]
CMD [ "nginx" ]

EXPOSE 80
EXPOSE 443

내용 확인하기

docker-compose up --build -d
docker-compose exec nginx /bin/bash
vi sites-available/django

 

 

 

 

 

 

 

 

 

728x90
반응형

댓글