실수 감소
시간 절약
운영 안정성 향상
인수인계와 협업에 유리
배포 자동화는 소스코드 변경 사항을 서버에 반영하는 과정을 자동화하는 것입니다.
수동 배포는 실수가 잦고, 장애 발생 시 어떤 단계에서 문제가 생겼는지 추적하기 어렵습니다.
수동 배포에서 자주 생기는 문제
자동화 예시
#!/bin/bash
echo "배포 시작"
cd /home/ubuntu/app
git pull origin main
npm install
npm run build
pm2 reload app
echo "배포 완료"
DB 백업, 업로드 파일 백업, 서버 설정 백업은 수동으로 하면 빼먹기 쉽습니다.
백업은 반드시 자동화하고, 백업 성공 여부를 확인할 수 있어야 합니다.
자동화 기준
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/db"
DB_NAME="app_db"
mkdir -p $BACKUP_DIR
mysqldump -u root -p$DB_PASSWORD $DB_NAME > $BACKUP_DIR/db_$DATE.sql
aws s3 cp $BACKUP_DIR/db_$DATE.sql s3://my-backup-bucket/db/
find $BACKUP_DIR -type f -mtime +7 -delete
주의할 점
서버를 운영하면 access log, error log, application log 등이 계속 쌓입니다.
로그를 관리하지 않으면 디스크가 가득 차서 서버 장애가 발생할 수 있습니다.
자동화 대상
# 30일 이상 지난 로그 삭제 예시
find /var/log/myapp -type f -name "*.log" -mtime +30 -delete
logrotate를 사용해 로그 파일을 주기적으로 분리하고 압축할 수 있습니다./var/log/myapp/*.log {
daily
rotate 14
compress
missingok
notifempty
}
헬스체크(Health Check)는 서버나 API가 정상적으로 동작하는지 확인하는 기능입니다.
운영 중인 서비스에서는 단순히 서버가 켜져 있는지만 보는 것이 아니라, 실제 API와 DB 연결까지 정상인지 확인하는 것이 좋습니다.
헬스체크 API 예시
import { Controller, Get } from '@nestjs/common';
@Controller('health')
export class HealthController {
@Get()
check() {
return {
status: 'ok',
timestamp: new Date().toISOString(),
};
}
}
확장 가능한 체크 항목
헬스체크 URL은 UptimeRobot, AWS Route 53 Health Check, CloudWatch 등과 연결하면 장애 알림에 활용할 수 있습니다.
Slack
SMS / 카카오 알림
AWS CloudWatch Alarm
Sentry Alert
장애 대응 속도 향상
인수인계 가능
연봉협상과 경력기술서에 활용 가능
반복 질문 감소
## 서버 구성
### Production Server
- Provider: AWS EC2
- OS: Ubuntu
- Role: 웹 서버 + API 서버
- Web Server: Nginx
- Runtime: Node.js
- Process Manager: PM2
- Domain: www.example.com
### Database
- Type: MySQL
- Provider: AWS RDS
- Backup: 자동 백업 7일 보관
포함하면 좋은 항목
## 배포 절차
### 프론트엔드
1. main 브랜치 최신 코드 확인
2. 의존성 설치
3. 빌드 실행
4. 빌드 결과물 서버 업로드
5. Nginx 정적 파일 경로 확인
6. 메인 페이지 접속 확인
### 백엔드
1. main 브랜치 최신 코드 확인
2. 의존성 설치
3. 빌드 실행
4. 환경변수 확인
5. PM2 reload
6. API health check 확인
## 502 오류 대응
### 확인 순서
1. PM2 프로세스 상태 확인
2. 애플리케이션 로그 확인
3. Nginx error log 확인
4. 포트 Listen 상태 확인
5. 최근 배포 내역 확인
### 명령어
pm2 list
pm2 logs
sudo tail -f /var/log/nginx/error.log
sudo lsof -i :3000
## 외부 API 연동 문서
### API 이름
- 서비스명: 문자 발송 API
- 용도: 상담 신청 완료 문자 발송
- 인증 방식: API Key
- 호출 위치: backend/src/sms
- 실패 시 영향: 고객에게 안내 문자 미발송
### 장애 대응
1. API 응답 코드 확인
2. 관리자 콘솔 장애 공지 확인
3. 재시도 가능 여부 확인
4. 실패 건 별도 저장 여부 확인
운영에 필요한 계정과 권한을 정리해야 합니다.
단, 비밀번호나 API 키를 문서에 그대로 적으면 안 됩니다.
문서화할 항목
## 계정 및 권한 관리
### AWS
- 용도: 서버, S3, CloudFront, RDS 관리
- 접근 권한자: 관리자, 개발자
- MFA 적용 여부: 적용 필요
- 비밀번호 저장 위치: 별도 비밀번호 관리 도구
### GitHub
- 용도: 소스코드 관리
- 권한 정책: 최소 권한 부여
- 퇴사자 발생 시 권한 회수 필요
name: Deploy
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@v4
- name: Install dependencies
run: npm install
- name: Build project
run: npm run build
# 프로세스 목록 확인
pm2 list
# 로그 확인
pm2 logs
# 앱 재시작
pm2 restart app
# 서버 재부팅 후 자동 실행 설정
pm2 startup
pm2 save
Docker는 애플리케이션 실행 환경을 컨테이너로 관리하는 도구입니다.
개발 환경과 운영 환경 차이를 줄이고, 배포를 더 일관되게 만들 수 있습니다.
장점
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
CMD ["npm", "run", "start:prod"]
운영 문서는 Notion, Confluence, GitHub Wiki, README 등으로 관리할 수 있습니다.
중요한 것은 도구보다 최신 상태를 유지하는 것입니다.
문서 관리 기준
자동화는 편리하지만, 잘못 작성된 자동화는 빠르게 큰 장애를 만들 수 있습니다.
특히 배포, DB 마이그레이션, 파일 삭제, 백업 삭제 작업은 조심해야 합니다.
주의할 명령어
rm -rfDROP, DELETE, UPDATEAPI Key, DB 비밀번호, JWT Secret, AWS Secret Key 같은 정보는 절대 문서나 Git 저장소에 그대로 남기면 안 됩니다.
관리 방법
.env 사용.env.example만 Git에 포함- 배포 절차를 문서화하고 반복 작업을 스크립트화하여 운영 실수를 줄임
- 서버 장애 대응 체크리스트를 정리하여 장애 원인 파악 시간을 단축
- 백업 및 복구 절차를 정리하고 자동 백업 구조를 개선
- 외부 API 연동 구조와 장애 대응 방식을 문서화하여 유지보수성을 향상