From 524ae200b0d7d6ef44e81461f0d51d96d86d841f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dean=5B=EB=B0=B1=EB=B3=91=EB=82=A8=5D?= Date: Tue, 3 Mar 2026 08:44:31 +0900 Subject: [PATCH] prod --- DEPLOY.md | 415 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 415 insertions(+) create mode 100644 DEPLOY.md diff --git a/DEPLOY.md b/DEPLOY.md new file mode 100644 index 0000000..56f4673 --- /dev/null +++ b/DEPLOY.md @@ -0,0 +1,415 @@ +# KAMCO Training API 배포 가이드 (RedHat 9.6) + +## 빠른 배포 (Quick Start) + +이 문서는 RedHat 9.6 환경에서 HTTPS로 KAMCO Training API를 배포하는 방법을 설명합니다. + +**접속 URL**: +- `https://api.train-kamco.com` +- `https://train-kamco.com` + +## 사전 요구사항 + +- [x] Docker & Docker Compose 설치 +- [x] Git 설치 +- [x] sudo 권한 +- [x] 포트 80, 443 사용 가능 + +## 1단계: /etc/hosts 설정 + +```bash +# root 권한으로 도메인 추가 +echo "127.0.0.1 api.train-kamco.com train-kamco.com" | sudo tee -a /etc/hosts + +# 확인 +cat /etc/hosts | grep train-kamco +``` + +**예상 결과**: +``` +127.0.0.1 api.train-kamco.com train-kamco.com +``` + +## 2단계: 방화벽 설정 (필요시) + +```bash +# 방화벽 상태 확인 +sudo firewall-cmd --state + +# HTTP/HTTPS 포트 개방 +sudo firewall-cmd --permanent --add-port=80/tcp +sudo firewall-cmd --permanent --add-port=443/tcp + +# 방화벽 재로드 +sudo firewall-cmd --reload + +# 확인 +sudo firewall-cmd --list-ports +``` + +**예상 결과**: `80/tcp 443/tcp` + +## 3단계: 프로젝트 디렉토리로 이동 + +```bash +cd /path/to/kamco-train-api + +# 현재 위치 확인 +pwd +# 예상: /home/username/kamco-train-api +``` + +## 4단계: 파일 구조 확인 + +배포 전 필수 파일이 모두 있는지 확인하세요: + +```bash +# SSL 인증서 확인 +ls -la nginx/ssl/ + +# 예상 결과: +# train-kamco.com.crt (인증서) +# train-kamco.com.key (개인 키) +# openssl.cnf (설정 파일) +``` + +```bash +# Docker Compose 파일 확인 +ls -la docker-compose-prod.yml nginx/nginx.conf + +# 예상: 두 파일 모두 존재 +``` + +## 5단계: Docker 네트워크 생성 (최초 1회) + +```bash +# kamco-cds 네트워크가 있는지 확인 +docker network ls | grep kamco-cds + +# 없으면 생성 +docker network create kamco-cds +``` + +## 6단계: Docker Compose 배포 + +```bash +# 기존 컨테이너 중지 (있는 경우) +docker-compose -f docker-compose-prod.yml down + +# 새로운 이미지 빌드 및 실행 +docker-compose -f docker-compose-prod.yml up -d --build + +# 컨테이너 상태 확인 +docker-compose -f docker-compose-prod.yml ps +``` + +**예상 결과**: +``` +NAME STATUS +kamco-cd-nginx Up (healthy) +kamco-cd-training-api Up (healthy) +``` + +## 7단계: 배포 확인 + +### 컨테이너 로그 확인 + +```bash +# Nginx 로그 +docker logs kamco-cd-nginx --tail 50 + +# API 로그 +docker logs kamco-cd-training-api --tail 50 + +# 실시간 로그 (Ctrl+C로 종료) +docker-compose -f docker-compose-prod.yml logs -f +``` + +### HTTP → HTTPS 리다이렉트 테스트 + +```bash +# HTTP 접속 시 HTTPS로 리다이렉트되는지 확인 +curl -I http://api.train-kamco.com +curl -I http://train-kamco.com + +# 예상 결과: 301 Moved Permanently +# Location: https://api.train-kamco.com/ 또는 https://train-kamco.com/ +``` + +### HTTPS 헬스체크 + +```bash +# -k 플래그: 사설 인증서 경고 무시 +curl -k https://api.train-kamco.com/monitor/health +curl -k https://train-kamco.com/monitor/health + +# 예상 결과: {"status":"UP","components":{...}} +``` + +### 브라우저 테스트 + +브라우저에서 다음 URL에 접속: + +- `https://api.train-kamco.com/monitor/health` +- `https://train-kamco.com/monitor/health` + +**사설 인증서 경고**: +- "안전하지 않음" 경고가 표시되면 **"고급"** → **"계속 진행"** 클릭 + +## 8단계: SSL 인증서 확인 (선택사항) + +```bash +# 인증서 정보 확인 +openssl x509 -in nginx/ssl/train-kamco.com.crt -text -noout | head -30 + +# 유효 기간 확인 (100년) +openssl x509 -in nginx/ssl/train-kamco.com.crt -noout -dates + +# SAN (멀티 도메인) 확인 +openssl x509 -in nginx/ssl/train-kamco.com.crt -text -noout | grep -A1 "Subject Alternative Name" + +# 예상 결과: +# X509v3 Subject Alternative Name: +# DNS:api.train-kamco.com, DNS:train-kamco.com +``` + +## 트러블슈팅 + +### 문제 1: "Connection refused" + +**원인**: 컨테이너가 실행되지 않음 + +**해결**: +```bash +# 컨테이너 상태 확인 +docker ps -a | grep kamco-cd + +# 컨테이너 재시작 +docker-compose -f docker-compose-prod.yml restart + +# 로그 확인 +docker logs kamco-cd-nginx +docker logs kamco-cd-training-api +``` + +### 문제 2: "502 Bad Gateway" + +**원인**: Nginx는 실행 중이지만 API 컨테이너가 준비되지 않음 + +**해결**: +```bash +# API 컨테이너 상태 확인 +docker logs kamco-cd-training-api + +# API 헬스체크 (컨테이너 내부에서) +docker exec kamco-cd-nginx wget -qO- http://kamco-changedetection-api:8080/monitor/health + +# API 컨테이너 재시작 +docker-compose -f docker-compose-prod.yml restart kamco-changedetection-api +``` + +### 문제 3: "Name or service not known" + +**원인**: /etc/hosts에 도메인이 설정되지 않음 + +**해결**: +```bash +# /etc/hosts 확인 +cat /etc/hosts | grep train-kamco + +# 없으면 추가 +echo "127.0.0.1 api.train-kamco.com train-kamco.com" | sudo tee -a /etc/hosts +``` + +### 문제 4: 포트 80 또는 443이 이미 사용 중 + +**원인**: 다른 프로세스가 포트를 사용 중 + +**해결**: +```bash +# 포트 사용 확인 +sudo lsof -i :80 +sudo lsof -i :443 + +# 사용 중인 프로세스 종료 (예: httpd, nginx) +sudo systemctl stop httpd +sudo systemctl stop nginx + +# Docker Compose 재시작 +docker-compose -f docker-compose-prod.yml restart +``` + +### 문제 5: SELinux 권한 오류 + +**원인**: SELinux가 Docker 볼륨 마운트를 차단 + +**해결**: +```bash +# SELinux 상태 확인 +getenforce + +# Permissive 모드로 임시 변경 (재부팅 시 초기화됨) +sudo setenforce 0 + +# 영구 변경 (권장하지 않음) +sudo vi /etc/selinux/config +# SELINUX=permissive 또는 SELINUX=disabled로 변경 +``` + +## 컨테이너 관리 명령어 + +### 시작/중지/재시작 + +```bash +# 시작 +docker-compose -f docker-compose-prod.yml up -d + +# 중지 +docker-compose -f docker-compose-prod.yml down + +# 재시작 +docker-compose -f docker-compose-prod.yml restart + +# 특정 서비스만 재시작 +docker-compose -f docker-compose-prod.yml restart nginx +docker-compose -f docker-compose-prod.yml restart kamco-changedetection-api +``` + +### 로그 확인 + +```bash +# 전체 로그 +docker-compose -f docker-compose-prod.yml logs + +# 특정 서비스 로그 +docker-compose -f docker-compose-prod.yml logs nginx +docker-compose -f docker-compose-prod.yml logs kamco-changedetection-api + +# 실시간 로그 +docker-compose -f docker-compose-prod.yml logs -f + +# 마지막 N줄만 보기 +docker logs kamco-cd-nginx --tail 100 +``` + +### 컨테이너 상태 확인 + +```bash +# 실행 중인 컨테이너 +docker-compose -f docker-compose-prod.yml ps + +# 상세 정보 +docker inspect kamco-cd-nginx +docker inspect kamco-cd-training-api + +# 리소스 사용량 +docker stats kamco-cd-nginx kamco-cd-training-api +``` + +### 컨테이너 내부 접속 + +```bash +# Nginx 컨테이너 내부 접속 +docker exec -it kamco-cd-nginx sh + +# API 컨테이너 내부 접속 +docker exec -it kamco-cd-training-api sh + +# 내부에서 빠져나오기 +exit +``` + +## 업데이트 및 재배포 + +### 코드 업데이트 후 재배포 + +```bash +# 1. Git pull (코드 업데이트) +git pull origin develop + +# 2. JAR 파일 빌드 (Jenkins에서 수행하는 경우 생략) +./gradlew clean build -x test + +# 3. 컨테이너 재빌드 및 재시작 +docker-compose -f docker-compose-prod.yml down +docker-compose -f docker-compose-prod.yml up -d --build + +# 4. 로그 확인 +docker-compose -f docker-compose-prod.yml logs -f +``` + +### 설정 파일만 변경한 경우 + +```bash +# nginx.conf 또는 docker-compose-prod.yml 변경 시 +docker-compose -f docker-compose-prod.yml down +docker-compose -f docker-compose-prod.yml up -d + +# 또는 +docker-compose -f docker-compose-prod.yml restart nginx +``` + +## 모니터링 + +### 헬스체크 엔드포인트 + +```bash +# API 헬스체크 +curl -k https://api.train-kamco.com/monitor/health + +# 예상 결과: +# { +# "status": "UP", +# "components": { +# "db": {"status": "UP"}, +# "diskSpace": {"status": "UP"} +# } +# } +``` + +### 시스템 리소스 + +```bash +# 디스크 사용량 +df -h + +# 메모리 사용량 +free -h + +# Docker 이미지 및 컨테이너 용량 +docker system df +``` + +## 보안 권장 사항 + +1. **사설 인증서**: 현재 사설 인증서를 사용 중입니다. 프로덕션 환경에서는 **Let's Encrypt** 또는 **GlobalSign** 같은 공인 인증서 사용을 권장합니다. + +2. **방화벽**: 필요한 포트(80, 443)만 개방하고, 불필요한 포트는 차단하세요. + +3. **정기 업데이트**: Docker 이미지와 시스템 패키지를 정기적으로 업데이트하세요. + +4. **로그 모니터링**: 정기적으로 로그를 확인하여 비정상적인 활동을 감지하세요. + +5. **백업**: SSL 인증서 키 파일(`train-kamco.com.key`)과 데이터베이스를 정기적으로 백업하세요. + +## 참고 문서 + +- **SSL 인증서 설정**: [nginx/SSL_SETUP.md](nginx/SSL_SETUP.md) +- **프로젝트 개요**: [README.md](README.md) +- **CLAUDE.md**: [CLAUDE.md](CLAUDE.md) + +## 지원 + +문제가 발생하면 다음을 확인하세요: +1. 컨테이너 로그: `docker-compose -f docker-compose-prod.yml logs` +2. 컨테이너 상태: `docker-compose -f docker-compose-prod.yml ps` +3. /etc/hosts 설정: `cat /etc/hosts | grep train-kamco` +4. 방화벽 상태: `sudo firewall-cmd --list-ports` + +--- + +**배포 완료!** 🎉 + +접속 URL: +- `https://api.train-kamco.com` +- `https://train-kamco.com`