# 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`