728x90
빅뱅 배포를 하게 된 배경
1. 수요의 변화
- 초기에는 서버에 SSH로 접속해서 일일이 세팅하는 수준이었지만,
- 수동 서버 세팅 → 자동화된 DevOps 환경 필요 배포 빈도와 서비스 복잡도가 올라가면서
- "한 번에 준비하고, 실수가 없어야 한다"는 요구가 생겼습니다.
2. 서비스 신뢰성 확보
- 외부 사용자는 서비스가 완전히 준비된 상태에서 접속해야 합니다.
- 서버 띄우다가 에러나 SSL 문제(HTTP 경고) 같은 걸 노출하면, 서비스 신뢰를 잃게 됩니다.
- 그래서 서비스 오픈 전에 완전히 안정된 구조를 구성하고 바로 제공할 필요가 있었습니다.
"서비스 오픈할 때 최소 요건이 완성된 상태로 맞춰져야 한다."
"중간에 불완전한 상태를 외부에 노출하면 안 된다."
빅뱅 배포를 하는 이유
1. 초기 서비스 오픈을 위한 인프라 환경 일괄 구축
- 새로운 서비스는 최소한 로그인, 회원가입, 콘텐츠 제공 기능을 외부 사용자에게 완성된 형태로 제공해야 합니다.
- 이 기능들이 돌아가기 위해서는 단순한 코드 배포가 아니라,
- 서버, 네트워크, 보안(HTTPS), 데이터베이스, API 통신 구조까지 통합된 환경이 갖춰져야 합니다.
- 그래서 한 번에 모든 인프라와 필수 소프트웨어를 설정하고 서비스 기능을 정상적으로 제공하는 "최초 풀 세팅"을 해야 했습니다.
즉, 단순히 웹서버 띄우는 수준이 아니라,
"초기 서비스에 필요한 모든 시스템을 맞춰서 한 번에 세팅"하는 것이 필요했습니다.
"사용자가 접근했을 때 완성된 모습만 보이게 하고, 이후 운영자도 안정적으로 관리할 수 있도록
서비스의 첫 단추를 제대로 꿰기 위해 빅뱅 배포를 한다."
빅뱅 배포 방식의 특징
모든 시스템 일괄 구성 | 서버, 웹서버(Nginx), SSL 인증서, DB, API 서버, 파일스토리지 등 한 번에 세팅 |
무중단 오픈 목표 | 사용자가 서비스를 접속할 때 장애나 에러를 보지 않도록 준비 |
수정사항 최소화 | 초기 세팅이 끝나면 운영 단계에서는 소규모 수정만 진행 |
비용과 시간 절감 | 이후 수정을 줄이기 위해 처음부터 최적화된 구성을 세팅 |
단계별 빅뱅 배포 체크리스트
1단계. 서버 준비
- [ ] 서버 인프라 준비
- AWS EC2 (풀스택 서버), 온프레미스 서버 (데이터베이스 서버)
→ 역할에 따라 필요한 서버를 각각 준비하고, 네트워크 연결 확인.
- 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 수정하여 리버스 프록시 적용
- EC2 서버에 Nginx 설치
- [ ] Certbot 설치 및 SSL 인증서 발급 요청
- Certbot 설치
sudo apt install certbot python3-certbot-nginx -y
- SSL 인증서 발급 및 자동 설정
sudo certbot --nginx -d koco.com -d www.koco.com
- Certbot 설치
- [ ] SSL 인증서 자동 갱신 설정
- certbot 자동 갱신을 crontab에 등록그리고 마지막 줄에 추가
- 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)에도 이중 백업하여 장애 대비
- DB 백업 파일 준비
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)로 복원
- 서버 상태가 정상적으로 수집/표시되는지 확인
- DB 복구 테스트
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
'카카오테크 부트캠프 > 프로젝트' 카테고리의 다른 글
백준 문제 데이터 크롤링 트러블슈팅 (0) | 2025.05.08 |
---|---|
MYSQL 9.2 버전 선정한 근거 (0) | 2025.05.08 |
클라우드 도입 근거 (0) | 2025.04.23 |
서비스 계획 문서 (0) | 2025.04.23 |
서비스 기획 문서 (0) | 2025.04.23 |