카카오테크 부트캠프/프로젝트

빅뱅 배포 도입 근거

bubhyun 2025. 4. 29. 15:57
728x90

빅뱅 배포를 하게 된 배경

1. 수요의 변화

  • 초기에는 서버에 SSH로 접속해서 일일이 세팅하는 수준이었지만,
  • 수동 서버 세팅 → 자동화된 DevOps 환경 필요 배포 빈도와 서비스 복잡도가 올라가면서
  • "한 번에 준비하고, 실수가 없어야 한다"는 요구가 생겼습니다.

2. 서비스 신뢰성 확보

  • 외부 사용자는 서비스가 완전히 준비된 상태에서 접속해야 합니다.
  • 서버 띄우다가 에러나 SSL 문제(HTTP 경고) 같은 걸 노출하면, 서비스 신뢰를 잃게 됩니다.
  • 그래서 서비스 오픈 전에 완전히 안정된 구조를 구성하고 바로 제공할 필요가 있었습니다.

 "서비스 오픈할 때 최소 요건이 완성된 상태로 맞춰져야 한다."

 "중간에 불완전한 상태를 외부에 노출하면 안 된다."

 


빅뱅 배포를 하는 이유

1. 초기 서비스 오픈을 위한 인프라 환경 일괄 구축

  • 새로운 서비스는 최소한 로그인, 회원가입, 콘텐츠 제공 기능을 외부 사용자에게 완성된 형태로 제공해야 합니다.
  • 이 기능들이 돌아가기 위해서는 단순한 코드 배포가 아니라,
  • 서버, 네트워크, 보안(HTTPS), 데이터베이스, API 통신 구조까지 통합된 환경이 갖춰져야 합니다.
  • 그래서 한 번에 모든 인프라와 필수 소프트웨어를 설정하고 서비스 기능을 정상적으로 제공하는 "최초 풀 세팅"을 해야 했습니다.

즉, 단순히 웹서버 띄우는 수준이 아니라,

"초기 서비스에 필요한 모든 시스템을 맞춰서 한 번에 세팅"하는 것이 필요했습니다.

"사용자가 접근했을 때 완성된 모습만 보이게 하고, 이후 운영자도 안정적으로 관리할 수 있도록
서비스의 첫 단추를 제대로 꿰기 위해 빅뱅 배포를 한다."


빅뱅 배포 방식의 특징

모든 시스템 일괄 구성 서버, 웹서버(Nginx), SSL 인증서, DB, API 서버, 파일스토리지 등 한 번에 세팅
무중단 오픈 목표 사용자가 서비스를 접속할 때 장애나 에러를 보지 않도록 준비
수정사항 최소화 초기 세팅이 끝나면 운영 단계에서는 소규모 수정만 진행
비용과 시간 절감 이후 수정을 줄이기 위해 처음부터 최적화된 구성을 세팅

단계별 빅뱅 배포 체크리스트

1단계. 서버 준비

  • [ ] 서버 인프라 준비
    • AWS EC2 (풀스택 서버), 온프레미스 서버 (데이터베이스 서버)
      → 역할에 따라 필요한 서버를 각각 준비하고, 네트워크 연결 확인.
  • [ ] 서버 OS 업데이트서버에 접속하여 기본 운영체제(우분투 22.04)를 최신 상태로 업데이트.
sudo apt update && sudo apt upgrade -y
→ 보안 패치 및 필수 소프트웨어 업데이트 적용.

 

  • [ ] 필수 패키지 설치
    • 서버에 기본적으로 필요한 툴과 언어 실행환경 설치.
    • 설치 목록
sudo apt install -y git nginx python3-pip openjdk-17-jdk nodejs npm

2단계. 도메인 및 SSL 인증서 세팅

  • [ ] Route 53 도메인 구입 및 관리
    • Route 53 콘솔에서 도메인 등록
    • 등록 시 자동으로 Hosted Zone 생성
  • [ ] 서버 IP를 도메인에 연결 (A 레코드 등록)
    • Route 53에서 A 레코드 추가
    • 타입: A / 값: EC2 퍼블릭 IP
  • [ ] Nginx 설치 및 리버스 프록시 설정
    • EC2 서버에 Nginx 설치
       
    • /etc/nginx/sites-available/default 수정하여 리버스 프록시 적용
  • [ ] Certbot 설치 및 SSL 인증서 발급 요청
    • Certbot 설치
       
      sudo apt install certbot python3-certbot-nginx -y
    • SSL 인증서 발급 및 자동 설정
       
      sudo certbot --nginx -d koco.com -d www.koco.com
  • [ ] SSL 인증서 자동 갱신 설정
    • certbot 자동 갱신을 crontab에 등록그리고 마지막 줄에 추가
       
0 3 * * * /usr/bin/certbot renew --quiet
sudo crontab -e

3단계. 애플리케이션 배포 준비

  • [ ] git clone으로 코드 가져오기
    • 서버에 소스코드를 내려받아야 애플리케이션을 실행할 수 있음.
    • 이후 Backend, Frontend, AI 브랜치로 이동해 최신 코드를 pull해서 유지.
  • [ ] .env 환경변수 파일 작성
    • 서버별 민감한 설정값(OPENAI API 키, DB 비밀번호)을 별도 관리하기 위해 사용
    • env 파일을 작성해 서버 환경에 맞는 값을 채워넣음.
    • .gitignore에 등록하여 Git에는 올리지 않음.
  • [ ] 패키지 기반 앱 실행 확인
    • 필요한 패키지들을 설치하고 애플리케이션이 정상 실행되는지 확인.
    • 파이썬(venv) 가상환경 활성화 후 requirements.txt 기반으로 패키지 설치.
    • 서버를 실행하고 deploy.sh 파일로 자동 배포를 확인.
  • [ ] 백업 파일 준비
    • DB 백업 파일 준비
      • MySQL 데이터베이스의 스냅샷을 주기적으로 생성 (mysqldump 이용)
      • db_backup.sql과 같은 형태로 별도 저장
    • 코드 백업 파일 준비
      • 현재 배포된 서버 코드 기준으로 tar.gz 등의 압축 파일 생성
      • tar -czvf app_backup_$(date +%Y%m%d).tar.gz ./app_directory/
      • 문제가 생겼을 때 빠르게 복원할 수 있도록 준비
    • env 파일 백업
      • .env 파일은 서버 내 별도 안전한 경로(/home/ubuntu/backup/)에 암호화 저장
      • 절대 외부에 노출되면 안 됨
    • 백업 위치 분리
      • 서버 디스크뿐 아니라 외부 스토리지(S3)에도 이중 백업하여 장애 대비

4단계. 백엔드 (API 서버) 세팅

  • [ ] FastAPI 또는 Spring Boot 서버 실행
    • FastAPI: uvicorn main:app --host 0.0.0.0 --port 8000
    • Spring Boot: ./gradlew build 후 JAR 실행
  • [ ] API 정상 작동 검증
    • Postman 혹은 curl을 사용해 API 테스트
    • 로그인, 회원가입, 데이터 조회 등 주요 엔드포인트 확인

5단계. 데이터베이스 세팅

  • [ ] 데이터베이스 설치
    • MySQL을 온프레미스 물리 서버에 직접 설치
    • 클라우드에 위치한 API 서버(FastAPI, Spring Boot 등)와 연동하여 사용.
  • [ ] 필요한 스키마 및 테이블 생성
    • 초기 테이블 생성 스크립트 실행
    • 기본 데이터(Master Data) 입력 필요시 함께 구성
  • [ ] 백업/복구 스크립트 준비
    • mysqldump을 이용해 주기적인 백업 스크립트 작성
    • 복구 테스트도 미리 진행하여 사고 대응 준비
      • DB 복구 테스트
        • 현재 데이터베이스(MySQL)에서 mysqldump로 백업 파일 생성
        • 임시로 별도 디비 인스턴스에 복구 시도
        • 복구 후 테이블/데이터 무결성 확인
      • 애플리케이션 복구 테스트
        • 현재 서버 코드 (git pull)와 .env 파일로 새 서버에 재배포
        • 정상 구동 및 API 응답 확인
      • 모니터링 복구 테스트
        • Prometheus, Grafana를 새 인스턴스에 재설치 후 백업된 설정 파일(import/export)로 복원
        • 서버 상태가 정상적으로 수집/표시되는지 확인

6단계. 모니터링 시스템 구축

  • [ ] Prometheus 설치
    • 서버, 애플리케이션 메트릭 수집
    • node_exporter 설치
  • [ ] Grafana 설치
    • Prometheus 데이터 소스 연결
    • 시스템 리소스(CPU, 메모리, 디스크), API 서버 응답 시간을 보여주는 대시보드 생성
  • [ ] Loki + Fluent Bit 설치
    • Fluent Bit: 서버 로그 수집
    • Loki: 수집된 로그 저장 및 Grafana에서 조회 가능
  • [ ] AlertManager 설치해서 서버 상태 알람 세팅
    • 서버 리소스 임계치 초과(CPU 90% 초과) 시 알림 발송
    • Slack 연동하여 실시간 알람 수신

7단계. 최종 점검

  • [ ] nginx 리버스 프록시 정상 작동 확인 (HTTP → HTTPS 강제 리디렉션)
  • [ ] 프론트엔드 화면 정상 호출 확인
  • [ ] 백엔드 API 정상 응답 확인
  • [ ] SSL 인증서 정상 적용 여부 확인
  • [ ] 서버 리부팅해도 서비스 자동 시작되는지 확인 (systemd 등록)

빅뱅 수동 배포 시 클라우드(서버) 상태

인스턴스 상태 서버(EC2 등)가 미리 정상 기동되어 있어야 함
보안 그룹 필요한 포트(HTTP, HTTPS, SSH, API 포트 등)가 열려 있어야 함
스토리지 디스크 공간이 충분해야 함 (코드, 로그)
네트워크 도메인 연결이 정상이어야 함
인증 관리 SSH 키, 서버 접속 계정 정리되어 있어야 함
서비스 준비 MySQL, Nginx 등의 필요한 미들웨어 설치되어 있어야 함
모니터링 기본적인 CPU, 메모리, 디스크 모니터링 가능해야 함
백업 중요한 데이터 (DB 등) 백업 준비되어 있어야 함 (실패 대비)

 


빅뱅 배포 실패 시 대응 방법 (롤백 시나리오)

1. 기본 전략

단계 설명
1 배포 전 "백업" 확보 (코드, DB, 설정 파일)
2 배포 실패 징후 포착 (API 500 에러, 트래픽 급감)
3 신속하게 "롤백 플랜" 실행
4 모니터링 → 정상화 확인 후 종료

2. 구체적 롤백 방법

코드 롤백

  • 방법: git 레포지토리에서 바로 이전 버전으로 되돌리기
git checkout [직전 커밋 해시]
source venv/bin/activate
pip install -r requirements.txt
systemctl restart fastapi
  • 특징: 빠르고 간단함. 가장 일반적인 롤백 방법.

데이터베이스 롤백

  • 방법: 배포 전 미리 떠놓은 DB 백업 복원
mysql -u root -p testdb < db_backup.sql
  • 특징: DB 스키마나 데이터가 바뀌었을 경우 반드시 필요.

환경 설정 롤백

  • 방법: nginx 설정, 환경변수(env 파일) 변경 시, 이전 버전으로 복원
cp /backup/nginx.conf /etc/nginx/nginx.conf
sudo systemctl reload nginx

 

→ 빅뱅 배포는 반드시 "백업→배포→모니터링→롤백 플랜"까지 준비

 

자동 롤백 스크립트(rollback.sh)

#!/bin/bash

# 오류 발생 시 스크립트 즉시 중단
set -e

echo "롤백 스크립트 시작합니다..."

# 1. 코드 롤백
echo "1. 코드 롤백 (Git checkout)"
cd /home/ubuntu/your_project   # 프로젝트 경로로 이동
git fetch origin
git checkout [직전 커밋 해시]  # 여기에 롤백할 커밋 해시를 입력하세요

# 가상환경 활성화
echo "2. 가상환경 활성화 및 패키지 설치"
source venv/bin/activate
pip install -r requirements.txt

# FastAPI 서버 재시작
echo "3. FastAPI 서버 재시작"
sudo systemctl restart fastapi.service

# 2. 데이터베이스 롤백
echo "4. 데이터베이스 롤백 (MySQL 복구)"
mysql -u root -p'your_db_password' koco_database < /home/ubuntu/backups/db_backup.sql

# 3. 환경설정 롤백
echo "5. 환경 설정 롤백 (Nginx, .env 복원)"

# Nginx 설정 파일 복구
sudo cp /home/ubuntu/backups/nginx_backup/nginx.conf /etc/nginx/nginx.conf
sudo systemctl reload nginx

# .env 파일 복구
cp /home/ubuntu/backups/env_backup/.env /home/ubuntu/koco/.env

echo "롤백 완료!"
728x90