๊ฐ๊ฐ์ ๊ตฌ์ฑ์์๋ Docker container ๋ก ๊ฒฉ๋ฆฌํ์์ต๋๋ค
Port ์ด๋ฆ 80 HTTP => 443(HTTPS)๋ก ๋ฆฌ๋ค์ด๋ ํธ 443 HTTPS 3000 React, Nginx Docker Container 3306 Mysql Docker Container 8001 nodejs 8081 Jenkins Docker Container 8443 Openvidu Docker Container 9000 SpringBoot Docker Container 9009 Grafana Docker Container 9090 Prometheus 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 run dev
- Backend
- ์ฌ์ฉํ๋ IDE ๋ก import ํ src/main/java/com/ssafy/api BackendApplication.java ์คํ
- ๊ฐ์
- ๋ณ์๋ฆฌ ์๋น์ค๋ Jenkins ๋ฅผ ์ด์ฉํ CI/CD ์๋ํ ํ๊ฒฝ์ผ๋ก ๊ตฌ์ฑํ์ฌ ํ ๊ตฌ์ฑ์ ๊ฐ์ ์์ฑํ ์ฝ๋๋ฅผ Gitlab ์ ํธ์ฌํ๋ฉด Webhook ์ ํตํด Jenkins ์ Pipeline Script ์ ์์ฑํ ๋๋ก CI/CD ํ๋ฆ์ด ์งํ๋ฉ๋๋ค
- EC2 ๋ฐฐํฌ ํ๊ฒฝ ๊ตฌ์ฑ ์์
- ufw (uncomplicated firewall) ๋ฐฉํ๋ฒฝ ํฌํธ ๊ฐ๋ฐฉ
- Docker ์ค์น
- Openvidu ์ค์น, ์ค์ , Openvidu ssl ๋ฐ๊ธ
- Jenkins ๋์ปค ์ด๋ฏธ์ง ์ค์น ๋ฐ ์ปจํ ์ด๋ ์คํ ๋ฐ ์ค์
- Mysql ๋์ปค ์ด๋ฏธ์ง ์ค์น ๋ฐ ์ปจํ ์ด๋ ์คํ ๋ฐ ์ค์
- frontend ํด๋์ Dockerfile ์ ์ด์ฉํ์ฌ ๋์ปค ์ด๋ฏธ์ง ์์ฑ ๋ฐ ์ปจํ ์ด๋ ์คํ
- backend ํด๋์ Dockerfile ์ ์ด์ฉํ์ฌ ๋์ปค ์ด๋ฏธ์ง ์์ฑ ๋ฐ ์ปจํ ์ด๋ ์คํ
- Nginx ์ค์น ๋ฐ ์ค์
# ufw ๋ช ๋ น ๋์๋ง sudo ufw -help # ufw ์ํ ํ์ธ sudo ufw status # ufw ํฌํธ ํ์ฉ sudo ufw allow portnumber
- Docker ์ค์น
# ๋์ปค ๊ณต์ GPG key๋ฅผ ์์ฑ sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release# ํค์ ์ฅ์ ์ถ๊ฐ 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-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- Openvidu ์ค์น, ์ค์ , Openvidu ssl ๋ฐ๊ธ
- https://docs.openvidu.io/en/stable/deployment/ce/on-premises/ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์งํ
- Jenkins ๋์ปค ์ด๋ฏธ์ง ์ค์น ๋ฐ ์ปจํ ์ด๋ ์คํ ๋ฐ ์ค์
# jenkins ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ docker pull jenkins/jenkins:lts # jenkins ์ปจํ ์ด๋ ์คํ docker run --name jenkins-docker -d -p 8889:8080 -p 50000:50000 -v /home/opendocs/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins/jenkins:lts
- Mysql ๋์ปค ์ด๋ฏธ์ง ์ค์น ๋ฐ ์ปจํ ์ด๋ ์คํ ๋ฐ ์ค์
# mysql ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ docker pull mysql # mysql ์ปจํ ์ด๋ ์คํ docker run -d -p 3306:3306 mysql [์ต์ ์ ์์ ๋กญ๊ฒ]
- frontend ํด๋์ Dockerfile ์ ์ด์ฉํ์ฌ ๋์ปค ์ด๋ฏธ์ง ์์ฑ ๋ฐ ์ปจํ ์ด๋ ์คํ
# git repo ๊ฐ์ ธ์ค๊ธฐ git pull [์ฃผ์] # React ๋น๋ npm install -g yarn yarn install yarn 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/test.conf server { location /{ proxy_pass http://localhost:3000; } location /api { proxy_pass http://localhost:9000; } location /socket.io { proxy_pass http://localhost:8001; } location /actuator/prometheus { proxy_pass http://localhost:9000; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/i8b207.p.ssafy.io/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/i8b207.p.ssafy.io/privkey.pem; # managed by Certbot } server { if ($host = i8b207.p.ssafy.io) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name i8b207.p.ssafy.io; return 404; # managed by Certbot }
- jenkins frontend pipeline
pipeline { agent any tools { nodejs "nodejs" } stages { stage('Pull') { steps { script{ git branch: 'front-end', credentialsId: 'jaeuk', url: 'https://lab.ssafy.com/s08-webmobile1-sub2/S08P12B207' } } } stage('React Build') { steps { script { script { sh 'npm install -g yarn' sh 'yarn --cwd ./frontend install --network-timeout 100000' sh 'yarn --cwd ./frontend build' } } } } stage('Build') { steps { script { sh 'docker build -t basepage/nginx ./frontend/' } } } stage('Deploy') { steps { script { sh 'docker stop nginx' sh 'docker rm nginx' sh 'docker run -d --name nginx -p 3000:80 -u root basepage/nginx' } } } } }
- jenkins backend pipeline
pipeline { agent any tools { gradle "gradle7.6" } stages { stage('Pull') { steps { script{ git branch: 'back-end', credentialsId: 'jaeuk', url: 'https://lab.ssafy.com/s08-webmobile1-sub2/S08P12B207' } } } stage('React Build') { steps { script { dir('backend') { sh 'chmod +x ./gradlew' sh './gradlew build' } } } } stage('Build') { steps { script { sh 'docker build -t basepage/nginx ./frontend/' } } } stage('Deploy') { steps { script { sh 'docker stop nginx' sh 'docker rm nginx' sh 'docker run -d --name nginx -p 3000:80 -u root basepage/nginx' } } } } }
- Frontend
- DockerFile
## Dockerfile(client) # nginx ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค์ tag๊ฐ ์์ผ๋ฉด latest ๋ฅผ ์ฌ์ฉํฉ๋๋ค. FROM nginx:latest # root ์ app ํด๋๋ฅผ ์์ฑ RUN mkdir /app # work dir ๊ณ ์ WORKDIR /app # work dir ์ dist ํด๋ ์์ฑ /app/dist RUN mkdir ./dist # host pc์ ํ์ฌ๊ฒฝ๋ก์ dist ํด๋๋ฅผ workdir ์ dist ํด๋๋ก ๋ณต์ฌ ADD ./dist ./dist # nginx ์ default.conf ๋ฅผ ์ญ์ RUN rm /etc/nginx/conf.d/default.conf # host pc ์ default.conf ๋ฅผ ์๋ ๊ฒฝ๋ก์ ๋ณต์ฌ COPY ./nginx.conf /etc/nginx/conf.d # 80 ํฌํธ ์คํ EXPOSE 80 # container ์คํ ์ ์๋์ผ๋ก ์คํํ command. nginx ์์ํจ CMD ["nginx", "-g", "daemon off;"]
- nginx.conf
server { listen 80; listen [::]:80; server_name i8b207.p.ssafy.io; location / { root /app/dist; index index.html; try_files $uri $uri/ /index.html; } }
- Backend DockerFile
- DockerFile
FROM openjdk:11 ARG JAR_FILE=build/libs/backend-0.0.1-SNAPSHOT.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java", "-jar", "app.jar"]