보안그룹 설정
인바운드 규칙 추가 > SSH, HTTP, HTTPS
Linux 환경에서 작업할 때는 일반적으로 서버에 직접 접근하는 것이 아니라, ssh 연결을 하여 작업한다.
ssh 연결을 위해서 인스턴스 생성 시 저장해두었던 .pem 파일이 필요하다.
# git bash에 작성
ssh -i <.pem경로> ubuntu @ <인스턴스 퍼블릭IPv4주소>
.pem 경로는 파일을 드래그해서 터미널에 붙이면 자동으로 써진다.
정상적으로 접속했다면 backend 코드를 clone해오면 된다.
✔ private repository clone 방법
현재 github의 아이디와 패스워드로 clone해오는 방법은 사용할 수 없다.
github > settings > developer settings > personal access tokens > Tokens(classic)
토큰 발급 후 터미널에 아래와 같이 작성해준다.https://{nickname}:{token}@github.com/your-nickname/your-repository.git
✔ timezone 설정
date명령어를 입력하면 UTC로 설정되어 있는 것을 확인할 수 있다.
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
기존 timezone 설정을 Asia/Seoul 로 덮어써준 후date를 확인하면
KST로 바뀐 것을 볼 수 있다.
#docker패키지 설치
sudo apt install docker.io -y
# docker.io 에러 발생 시
sudo apt update
#docker 설치 확인
sudo docker --version
# /usr/lib/docker 경로에 cli-plugins라는 디렉토리를 생성합니다.
# -p : 만약 상위 디렉토리가 없다면 함께 생성합니다.
sudo mkdir -p /usr/lib/docker/cli-plugins
# github에 release 된 docker-compose 파일 다운로드
sudo curl -SL https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-x86_64 -o /usr/lib/docker/cli-plugins/docker-compose
# 다운받은 docker-compose 파일에 실행 권한을 부여해 줍니다.
sudo chmod +x /usr/lib/docker/cli-plugins/docker-compose
# docker-compose 설치 확인
sudo docker compose version
.env 파일이 같은 경로에 있어야 한다.
version: '3.8'
volumes:
postgres: {}
django_media: {}
django_static: {}
services:
postgres:
container_name: postgres
image: postgres:14.5
volumes:
- postgres:/var/lib/postgresql/data/
environment: #.env 파일에 선언
- POSTGRES_USER
- POSTGRES_PASSWORD
- POSTGRES_DB
restart: always
redis:
container_name: redis
image: redis
ports:
- 6379:6379
backend:
container_name: backend
build: ./backend/
entrypoint: sh -c "python manage.py collectstatic --no-input && gunicorn config.wsgi --workers=5 -b 0.0.0.0:8000"
volumes:
- ./backend/django/:/app/
- /etc/localtime:/etc/localtime:ro
- django_media:/app/media/
- django_static:/app/static/
environment:
- DEBUG
- POSTGRES_DB
- POSTGRES_USER
- POSTGRES_PASSWORD
- POSTGRES_HOST
- POSTGRES_PORT
- SECRET_KEY
- NAVER_ACCESS_KEY
- NAVER_SECRET_KEY
- SERVICE_ID
- PHONE_NUMBER
depends_on:
- postgres
- redis
restart: always
nginx:
container_name : nginx
image: nginx:1.23.2
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
- django_media:/media/
- django_static:/static/
depends_on:
- backend
restart: always
FROM python:3.10.8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN mkdir /app/
WORKDIR /app/
COPY ./django/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
RUN pip install gunicorn psycopg2
# 현재 디렉토리 구조
path : /home/ubuntu/
├── backend
│ ├── Dockerfile
│ └── django # project directory
├── docker-compose.yml
└── nginx
└── default.conf
nginx 폴더를 만들고 그 안에 default.conf 를 작성한다.
server {
listen 80;
server_name _;
location / {
proxy_pass http://backend:8000/;
}
location /static/ {
alias /static/;
}
location /media/ {
alias /media/;
}
}
#: 환경변수에 따라 DEBUG모드 여부를 결정합니다.
DEBUG = os.environ.get('DEBUG', '0') == '1'
# 접속을 허용할 host를 설정합니다.
ALLOWED_HOSTS = ['backend', ]
# postgres 환경변수가 존재 할 경우에 postgres db에 연결
POSTGRES_DB = os.environ.get('POSTGRES_DB', '')
if POSTGRES_DB:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': POSTGRES_DB,
'USER': os.environ.get('POSTGRES_USER', ''),
'PASSWORD': os.environ.get('POSTGRES_PASSWORD', ''),
'HOST': os.environ.get('POSTGRES_HOST', ''),
'PORT': os.environ.get('POSTGRES_PORT', ''),
}
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# CORS 허용 목록에 ec2 ip를 추가
CORS_ORIGIN_WHITELIST = ['http://$ec2_public_ip']
CSRF_TRUSTED_ORIGINS = CORS_ORIGIN_WHITELIST