devops

수동 배포하기

ri5 2023. 3. 9. 10:05

배포하기

프로젝트 형태

├── docker
│   ├── app_test.dockerfile
│   ├── docker.sh
│   └── source
│       ├── backend
│       │   ├── package.json
│       │   └── server.js
│       ├── frontend
│       │   ├── package.json
│       │   ├── public
│       │   │   ├── favicon.ico
│       │   │   ├── index.html
│       │   │   └── manifest.json
│       │   └── src
│       │       ├── App.css
│       │       ├── App.js
│       │       ├── App.test.js
│       │       ├── index.css
│       │       ├── index.js
│       │       ├── logo.svg
│       │       ├── serviceWorker.js
│       │       └── setupTests.js
│       └── nginx
│           └── default.conf
└── docker-compose.yml

위와 같은 프로젝트 형태의 프로젝트를 배포를 한다고 했을 때 아래와 과정 같이 진행할 수 있다.

1. 프론트 빌드

1.1: 리액트의 의존성 패키지 다운로드
아래와 같은 명령어를 통해 npm pakage를 다운로드한다.

npm install

1.2: 리액트 빌드

npm run build

2. 리액트의 빌드파일과 nginx와의 연동

2.1: nginx conf 파일 생성

server {
    listen 80;

    location / {
        root   /home/front;
        index  index.html;
        try_files $uri /index.html;
    }
}

2.2: 도커 컴포즈 정의

version: "3.5"

services:
  nginx:
    container_name: nginx_test
    image: nginx:1.23-alpine
    volumes:
      - ./docker/source/frontend/build:/home/jscode
      - ./docker/source/nginx:/etc/nginx/conf.d
    command: sh -c "nginx && tail -f /dev/null"
    ports:
      - 80:80

3. 백엔드 빌드

3.1: 이미지로 만들 도커파일 정의

FROM node:16

WORKDIR /home/backend

COPY source/backend .

ENTRYPOINT [ "npm", "run", "start" ]

3.2: 도커 이미지 생성

docker build -t app_test:prod -f app_test.dockerfile 

4. 도커 컴포즈를 활용한 리버스 프록시 환경 구성

4.1: nginx 리버스 프록시 구성

server {
    listen 80;

    upsteam app_text {
        server app_test:3001;
    }

    location / {
        root   /home/front;
        index  index.html;
        try_files $uri /index.html;
    }

    {
        proxy_pass http://app_text:3001;
        proxy_http_version 1.1;
        proxy_set_header Host $host
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4.2: 도커 컴포즈 수정

version: "3.5"

services:
  app:
    container_name: app_test
    image: app_test:prod
    ports:
      - 3001:3001

  nginx:
    container_name: nginx_test
    image: nginx:1.23-alpine
    volumes:
      - ./docker/source/frontend/build:/home/jscode
      - ./docker/source/nginx:/etc/nginx/conf.d
    command: sh -c "nginx && tail -f /dev/null"
    ports:
      - 80:80

4.3: 도커 컴포즈 실행

docker-compose -d up

프론트 수동배포

만약 수정이 일어나고 수동배포를 진행한다고 했을 때에는 아래와 같다.
1.2(패키지가 추가되었다면 1.1을 실행) -> nginx 컨테이너와는 볼륨으로 정적파일이 공유되므로 정적파일만 갈아끼워주면 된다. mv ~

백엔드 수동배포

3.2 -> 4.3 (새로운 환경으로 하고 싶다면 docker-compose -p test up -d로 새로운 이름으로 정의하면된다.)

느낀점

생각보다 손이 많이가고 한두번은 해볼 수 있을 것 같은데 불필요한 반복작업으로 인해 시간을 낭비하게 된다. IT에서 가장 돈이 많이 나간다는 비용을 뽑는다면 바로 개발자일 것이다. 그렇기 때문에 개발자의 생산성은 매우 중요시되기 때문에 반복되는 작업은 자동화하여 시간을 절약하는 경우가 많다. 그리고 배포같은 경우 사람이 계속 반복하다보면 실수하는 경우가 발생하게 되는데 이러한 문제는 큰 장애를 가져올 수 도 있다. 배포와 테스트 같이 반복되는 업무는 자동화하여야 휴먼에러를 줄이고 개발자의 단순업무에 투자하는 시간을 절약시켜줘야 안정적인 소프트웨어를 운영할 수 있다.