Skip to content

Latest commit

 

History

History
298 lines (294 loc) · 7.65 KB

포팅메뉴얼.md

File metadata and controls

298 lines (294 loc) · 7.65 KB

Port Number

각각의 구성요소는 Docker container 로 격리하였습니다

Port 이름
80 HTTP => 443(HTTPS)로 리다이렉트
443 HTTPS
3000 Vue, Nginx Docker Container
3306 Mysql
9000 SpringBoot Docker Container
9090 Jenkins Docker Container

ssl 인증서 발급

  • nginx 설치
sudo apt-get install nginx
  • letsencrypt 설치
sudo apt-get install letsencrypt

sudo systemctl stop nginx

sudo letsencrypt certonly --standalone -d 도메인

# 발급 경로
cd /etc/letsencrypt/live/도메인/
# 발급 확인
ls

How To Run in Local

  • Frontend
npm install

npm start
  • Backend
  • 사용하는 IDE 로 import 후 src/main/java/com/ssafy/Application.java 실행

How To Run in EC2

  • 개요
  • CURI@US 서비스는 Jenkins 를 이용한 CI/CD 자동화 환경으로 구성하여 팀 구성원 각자 작성한 코드를 Gitlab 에 푸쉬하면 Webhook 을 통해 Jenkins 의 build project 에 작성한 script 대로 CI/CD 흐름이 진행됩니다
  • EC2 배포 환경 구성 순서
  1. ufw (uncomplicated firewall) 방화벽 포트 개방
  2. 도커 설치
  3. JDK 및 NPM 설치
  4. Jenkins 도커 이미지 설치 및 컨테이너 실행 및 설정
  5. Nginx 설치 및 설정
  6. frontend 폴더의 Dockerfile 을 이용하여 도커 이미지 생성 및 컨테이너 실행
  7. backend 폴더의 Dockerfile 을 이용하여 도커 이미지 생성 및 컨테이너 실행
  8. Mysql 도커 이미지 설치 및 컨테이너 실행 및 설정
  • ufw (uncomplicated firewall) 방화벽 포트 개방
# ufw 명령 도움말
sudo ufw -help

# ufw 상태 확인
sudo ufw status verbose

# ufw 포트 허용
sudo ufw allow portnumber
ex) sudo ufw allow 80

# 방화벽 올리기
sudo ufw enable

# 방화벽 내리기
sudo ufw disable  
  • Docker 및 Docker compose 설치
# 업데이트 및 HTTP 패키지 설치
sudo apt-get install -y ca-certificates \ 
   curl \
   software-properties-common \
   apt-transport-https \
   gnupg \
   lsb-release

# GPG 키 및 저장소 추가
sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 도커 엔진 설치
sudo apt install docker-ce docker-ce-cli containerd.io
  • JDK 및 NPM 설치
# JDK 11 설치
apt-get install openjdk-11-jre-headless

# 설치 확인
java -version

# NPM 설치
sudo apt install npm 

# 설치 확인
sudo npm install -g n latest
  • Jenkins docker-compose를 활용하여 jenkins container 생성
# docker compose file 생성
vim docker-compose.yml

# docker compose file을 container로 띄우기
sudo docker-compose up -d

# container 확인
sudo docker ps
  • jenkins docker compose.yml file
version: '3'

services:
   jenkins:
       image: jenkins/jenkins:lts
       container_name: jenkins
       volumes:
           - /var/run/docker.sock:/var/run/docker.sock
           - /jenkins:/var/jenkins_home
       ports:
           - "9090:8080"
       privileged: true
       user: root
  • Mysql 설치 및 설정
# Mysql 설치
sudo apt install mysql-server -y

# mysql 접속 // root
sudo mysql -u root -p

# user 계정 생성
create user '{username}'@'{host}' identified by '{비밀번호}';

# 권한 부여
grant all on {DB명}.* to '{username}'@'{host}';

# 권한 확인
show grants for '{username}'@'{host}';
  • frontend 폴더의 Dockerfile 을 이용하여 도커 이미지 생성 및 컨테이너 실행
# git repo 가져오기
git pull [주소]

# Vue 빌드
RUN npm run build

# Docker 이미지 생성
docker build [이미지 이름]

# Docker Container 실행
docker run -d [이미지 이름]
  • backend 폴더의 Dockerfile 을 이용하여 도커 이미지 생성 및 컨테이너 실행
# git repo 가져오기
git pull [주소]

# SpringBoot 빌드
gradlew build

# SpringBoot 이미지 생성
docker build [이미지 이름]

# Docker Container 실행
docker run -d [이미지 이름]
  • Nginx 설치 및 설정
# Nginx 설치
sudo apt-get install nginx
  • ec2 nginx
# /etc/nginx/sites-available/default
server {
       listen 80 default_server;
       listen [::]:80 default_server;

       server_name k7b107.p.ssafy.io;

       if ($http_x_forwarded_proto = 'http'){
          return 301 https://$host$request_uri;
       }

      location / {
              proxy_ssl_server_name on;
              proxy_pass https://127.0.0.1:3000;
      }
}

server{

       listen 443 ssl;
       server_name k7b107.p.ssafy.io;
       ssl_certificate      /etc/letsencrypt/live/k7b107.p.ssafy.io/cert.pem;
       ssl_certificate_key  /etc/letsencrypt/live/k7b107.p.ssafy.io/privkey.pem;

       location /api/ {
               proxy_ssl_server_name on;
               proxy_pass https://127.0.0.1:9000/api/swagger-ui.html;
       }

       location / {
               proxy_ssl_server_name on;
               proxy_pass https://127.0.0.1:3000;
       }

}
  • jenkins shell script
docker container prune --force
docker image prune --force

mkdir -p /var/jenkins_home/images_tar


cd /var/jenkins_home/workspace/deployProject/back/metroverse
cp /var/jenkins_home/yml/application.yml /var/jenkins_home/workspace/deployProject/back/metroverse/src/main/resources/application.yml
cp /var/jenkins_home/yml/keystore.p12 /var/jenkins_home/workspace/deployProject/back/metroverse/src/main/resources/keystore.p12

docker stop spring_deploy
docker rm spring_deploy

chmod +x gradlew
./gradlew clean build -x test
docker build -t spring_deploy .
docker save spring_deploy > /var/jenkins_home/images_tar/spring_deploy.tar
docker run -d -p 9000:8080 --name spring_deploy spring_deploy -u root spring_deploy

docker stop vue_deploy
docker rm vue_deploy

cd /var/jenkins_home/workspace/deployProject/front
docker build -t vue_deploy .
docker save vue_deploy > /var/jenkins_home/images_tar/vue_deploy.tar
docker run -d --name vue_deploy -p 3000:443 -v /etc/letsencrypt/archive:/etc/letsencrypt/archive -u root vue_deploy
  • Frontend
  • DockerFile
FROM node:lts-alpine as builder
WORKDIR /var/jenkins_home/workspace/deployProject/front
COPY package*.json ./
RUN npm install

COPY . .
RUN npm run build
FROM nginx:stable-alpine
RUN rm -rf /etc/nginx/conf.d/default.conf
COPY --from=builder /var/jenkins_home/workspace/deployProject/front/nginx/default.conf /etc/nginx/conf.d/default.conf

RUN rm -rf /usr/share/nginx/html/*
COPY --from=builder /var/jenkins_home/workspace/deployProject/front/dist /usr/share/nginx/html

EXPOSE 80
EXPOSE 443
ENTRYPOINT ["nginx", "-g", "daemon off;"]
  • nginx/default.conf
server {
 location / {
 	root /usr/share/nginx/html;
 	index index.html index.htm;
 	try_files $uri $uri/ /index.html;
 	}
}
  • Backend DockerFile
  • DockerFile
FROM openjdk:11
WORKDIR /var/jenkins_home/workspace/deployProject/back/metroverse.
COPY . .
EXPOSE 8080
ARG JAR_FILE=build/libs/metroverse-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java" , "-jar" , "app.jar"]
ENV TZ=Asia/Seoul
RUN apt-get install -y tzdata