Skip to content

Latest commit

ย 

History

History
356 lines (348 loc) ยท 8.54 KB

File metadata and controls

356 lines (348 loc) ยท 8.54 KB

Port Number

๊ฐ๊ฐ์˜ ๊ตฌ์„ฑ์š”์†Œ๋Š” 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

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 run dev
  • Backend
    • ์‚ฌ์šฉํ•˜๋Š” IDE ๋กœ import ํ›„ src/main/java/com/ssafy/api BackendApplication.java ์‹คํ–‰

How To Run in EC2

  • ๊ฐœ์š”
    • ๋ณ‘์•„๋ฆฌ ์„œ๋น„์Šค๋Š” Jenkins ๋ฅผ ์ด์šฉํ•œ CI/CD ์ž๋™ํ™” ํ™˜๊ฒฝ์œผ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ํŒ€ ๊ตฌ์„ฑ์› ๊ฐ์ž ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ Gitlab ์— ํ‘ธ์‰ฌํ•˜๋ฉด Webhook ์„ ํ†ตํ•ด Jenkins ์˜ Pipeline Script ์— ์ž‘์„ฑํ•œ ๋Œ€๋กœ CI/CD ํ๋ฆ„์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค
  • EC2 ๋ฐฐํฌ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ์ˆœ์„œ
    1. ufw (uncomplicated firewall) ๋ฐฉํ™”๋ฒฝ ํฌํŠธ ๊ฐœ๋ฐฉ
    2. Docker ์„ค์น˜
    3. Openvidu ์„ค์น˜, ์„ค์ •, Openvidu ssl ๋ฐœ๊ธ‰
    4. Jenkins ๋„์ปค ์ด๋ฏธ์ง€ ์„ค์น˜ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋ฐ ์„ค์ •
    5. Mysql ๋„์ปค ์ด๋ฏธ์ง€ ์„ค์น˜ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋ฐ ์„ค์ •
    6. frontend ํด๋”์˜ Dockerfile ์„ ์ด์šฉํ•˜์—ฌ ๋„์ปค ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
    7. backend ํด๋”์˜ Dockerfile ์„ ์ด์šฉํ•˜์—ฌ ๋„์ปค ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
    8. Nginx ์„ค์น˜ ๋ฐ ์„ค์ •
  • ufw (uncomplicated firewall) ๋ฐฉํ™”๋ฒฝ ํฌํŠธ ๊ฐœ๋ฐฉ

# 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 ๋ฐœ๊ธ‰
  • 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"]