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
- 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
- Frontend
npm install npm start
- Backend
- 사용하는 IDE 로 import 후 src/main/java/com/ssafy/Application.java 실행
- 개요
- CURI@US 서비스는 Jenkins 를 이용한 CI/CD 자동화 환경으로 구성하여 팀 구성원 각자 작성한 코드를 Gitlab 에 푸쉬하면 Webhook 을 통해 Jenkins 의 build project 에 작성한 script 대로 CI/CD 흐름이 진행됩니다
- EC2 배포 환경 구성 순서
- ufw (uncomplicated firewall) 방화벽 포트 개방
- 도커 설치
- JDK 및 NPM 설치
- Jenkins 도커 이미지 설치 및 컨테이너 실행 및 설정
- Nginx 설치 및 설정
- frontend 폴더의 Dockerfile 을 이용하여 도커 이미지 생성 및 컨테이너 실행
- backend 폴더의 Dockerfile 을 이용하여 도커 이미지 생성 및 컨테이너 실행
- 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