개발한 vue-django 프로젝트를 실제 운영서버에 띄우는 과정을 정리합니다!
개발서버에서 구축했던 방법이 운영서버에서 적용할 때 조금씩 다른 부분도 있었고,
여러 단계를 거쳐야 했기 때문에 잊어 버리지 않기 위해 기록해봅니다 스타트..!
🐾 단계
- 인스턴스 생성
- 보안규칙 생성
DB ACL 허용 요청- 도커 설치 - v23.0.3
- Jenkins 도커 서버 띄우기 - v2.399
- Jenkins 컨테이너 생성 및 실행
- Jenkins 컨테이너 내부에 DooD 구성하기
- 패키지 설치 및 환경 구성
- 웹 서버 띄우기
- 백그라운드로 웹 서버 띄우기
1. 인스턴스 생성
개발서버
ssh -i {pem키} ubuntu@{ip}
- OS : Ubuntu Server 20.04 LTS
- 타입 : r2.c4m16 (4vCPU, 16GB)
- 스토리지 : 300GB
운영서버
- OS : Ubuntu Server 20.04 LTS
- ssh {id}@{domain}
- (kinit)
- ssh {user}@{host}
😃 커버로스을 이용해 티켓이 발급된 사용자만 접속할 수 있도록 보안 단계를 거치게 됩니다!
2. 보안규칙 생성
보안 그룹에서 필요한 포트 열어주기
젠킨스 기본 포트는 8080이지만 장고에서 사용하고 있기 때문에 겹치지 않게 7070으로 변경!
- 7070 : 젠킨스
- 8080 : 장고
- 8000 : 뷰
3. DB ACL 허용
4. Docker 설치
- Docker Latest : v23.0.3
개발서버
# dependency library download
sudo apt-get update
sudo apt-get install -y curl apt-transport-https ca-certificates gnupg-agent software-properties-common
# Docker 다운로드 링크 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Docker Repository 등록
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker 설치
sudo apt-cache policy docker-ce
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# docker 그룹에 사용자 추가
sudo usermod -aG docker $USER
# 그룹 변경사항 활성화
sudo newgrp docker
운영서버
# sudo 권한을 위해 아래 계정으로 접속
ssh {user}@{host}
# dependency library download
sudo apt-get update
sudo apt-get install -y curl apt-transport-https ca-certificates gnupg-agent software-properties-common
# Docker 다운로드 링크 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Docker Repository 등록
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 의존성 문제 해결
curl -O http://archive.ubuntu.com/ubuntu/pool/main/libs/libseccomp/libseccomp2_2.5.1-1ubuntu1~20.04.2_amd64.deb
sudo dpkg -i libseccomp2_2.5.1-1ubuntu1~20.04.2_amd64.deb
# Docker 설치
sudo apt-cache policy docker-ce
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# docker 그룹에 사용자 추가
sudo usermod -aG docker $USER
5. Jenkins 서버 띄우기
Jenkins 컨테이너 생성 및 실행
- Jenkins 제공 공식 도커 이미지 사용 (Jenkins 2.399)
- Jenkins 컨테이너 생성 시 --privileged 옵션 필요
- Variable Parsing 시 PostgreSQL는 yum으로 설치되므로 systemctl 명령어 사용 필요
- 프로젝트 내 폴더 생성 후 실행할 스크립트 파일 모으기 (/home/ubuntu/variable-comparison/script/<DBMS명>)
- 인스턴스와 컨테이너 폴더 위치 마운트하기 (/root/script)
sudo docker run --privileged -d --name jenkins -p 7070:8080 -v /home1/{user}/variable-comparison/script:/root/script -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins
젠킨스 초기 비밀번호 확인
docker exec -i jenkins bash <<< "cat /var/jenkins_home/secrets/initialAdminPassword"
Jenkins 컨테이너 내부에 DooD 구성하기
# jenkins 컨테이너에 루트 권한으로 접속
docker exec -it -u root jenkins bash
# docker 그룹 생성
groupadd docker
# docker 그룹에 jenkins 사용자 추가
usermod -G docker -a jenkins
# 호스트의 docker 그룹 ID(998)로 지정된 그룹명을 docker로 변경
# docker 그룹 ID는 /etc/group 파일에서 확인 가능
groupmod -g 499 docker
# 컨테이너 내부 사용자가 호스트의 파일에 접근 가능하도록 호스트 사용자 아이디(500)로 변경
usermod -u 500 jenkins
apt-get update
apt-get -y install lsb-release apt-transport-https ca-certificates curl gnupg2 software-properties-common
apt-get -y upgrade apt-transport-https
# Docker 다운로드 링크 추가
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey
apt-key add /tmp/dkey
# Docker Repository 등록
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable"
# Docker 설치
apt-get update
apt-get -y install docker-ce docker-ce-cli containerd.io
6. 패키지 설치 및 환경 구성
1. 프로젝트 Git clone
안될 경우, 사내 게이트웨이 신청 필요할 수 있음
git clone {repository url}
2. pyenv 설치 (python 3.9.10)
sudo apt update
sudo apt install -y git sqlite3 build-essential libedit-dev make
# pyenv 설치를 위한 패키지 다운로드
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev
# pyenv 다운로드
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
# ~/.bashrc에 환경변수 추가
cat >> ~/.bashrc << 'EOF'
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export PYENV_VIRTUALENV_DISABLE_PROMPT=1
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
EOF
# ~/.bashrc 적용
source ~/.bashrc
# pyenv로 python 3.9.10 버전 다운로드
#sudo apt install -y lzma
pyenv install 3.9.10
# py39라는 이름의 가상환경 생성
pyenv virtualenv 3.9.10 py39
# py39 활성화
pyenv activate py39
3. requirements.txt 설치
pip install -r requirements.txt
# setuptools가 먼저 설치되어야 mysqlclient 설치가 정상적으로 진행됨
# 설치 순서도 중요!
4. secret key 발급
5. 필요한 패키지
- Redis
sudo apt-get install -y libssl-dev default-mysql-server default-mysql-client default-libmysqlclient-dev
sudo apt-get install -y python3-pip
pip3 install requests bs4 sqlalchemy pymysql mysqlclient pandas redis
- PostgreSQL
apt-get update && apt-get -y install sudo
sudo apt-get install -y postgresql-client
sudo apt-get install -y postgresql-client-common
sudo apt install pip
sudo apt install default-libmysqlclient-dev
pip install sqlalchemy requests bs4 psycopg2-binary mysqlclient numpy pandas
- 설치가 잘 안 될 경우
# ModuleNotFoundError: No module named '_ctypes' 에러
sudo apt-get install libffi-dev
# 가상환경 파이썬 제거
pyenv uninstall 3.9.10
# 가상환경 파이썬 재설치
pyenv install 3.9.10
# py39라는 이름의 가상환경 생성
pyenv virtualenv 3.9.10 py39
# py39 활성화
pyenv activate py39
6. npm, vue, nvm 설치
node 버전을 잘 맞춰 주는 것이 매우 중요하다! 안 맞으면 띄워지지가 않음..
# npm 설치
sudo apt install npm
# vue-cli 설치
sudo npm install -g @vue/cli
vue --version #@vue/cli 5.0.8
# nvm 설치
sudo apt-get install build-essential libssl-dev
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
source ~/.bashrc
# 원하는 버전 설치
nvm install 16.14.2
# 실행
# nvm use default 16.14.2
# 버전 확인
node -v # v16.14.2
npm -v # 8.5.0
7. vue.config.js 변경
publicPath: process.env.NODE_ENV === 'production' ? '/static/dist/' : 'http://{ip}:{port}',
.public('http://{ip}:{port}')
7. 서버 띄우기
* 주의
로컬을 띄운 상태에서 실행할 경우 로컬 화면이 나오는 것이기 때문에 로컬을 끈 상태에서 진행해야 진정한 서버를 볼 수 있다!
운영서버
백그라운드에서 띄우기!
- nohup node ./node_modules/@vue/cli-service/bin/vue-cli-service serve --port 18080 &
- nohup python manage.py runserver {ip}:{port} --settings=main.config.settings.debug
- 15361번 포트, 18080번 포트 사용
드디어 메인 화면이 예쁘게 뜬 것을 확인할 수 있다~!!
이렇게 정식으로 서버를 띄워본 것은 처음이어서 한 단계를 알아 갈 때마다 너무 재밌고 이런 시간을 보낼 수 있어서 감사했다!
관련 내용은 더 반복하고, 모르는 내용은 스터디해서 잘 정리해두어야겠다 :)