Merge pull request #205 from FunD-StockProject/fix/stock-master-info #115
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Deploy to EC2 (DockerHub) | |
| on: | |
| push: | |
| branches: [ "main" ] | |
| concurrency: | |
| group: deploy | |
| cancel-in-progress: true | |
| jobs: | |
| build-and-deploy: | |
| runs-on: ubuntu-latest | |
| env: | |
| IMAGE_NAME: muuigong/stock-app | |
| DEPLOY_DIR: /srv/stock | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} | |
| - name: Build & Push image | |
| run: | | |
| docker build -t "$IMAGE_NAME:latest" . | |
| docker push "$IMAGE_NAME:latest" | |
| - name: SSH Agent | |
| uses: webfactory/ssh-agent@v0.9.0 | |
| with: | |
| ssh-private-key: ${{ secrets.EC2_SSH_KEY }} | |
| - name: Add known_hosts (robust) | |
| shell: bash | |
| env: | |
| EC2_HOST: ${{ secrets.EC2_HOST }} | |
| run: | | |
| set -euo pipefail | |
| mkdir -p ~/.ssh | |
| HOST="${EC2_HOST#*@}" # strip user@ | |
| HOST="${HOST%%:*}" # strip :port if any | |
| HOST="$(printf '%s' "$HOST" | tr -d '\r\n')" | |
| if [ -z "$HOST" ]; then | |
| echo "❌ EC2_HOST invalid. Expected 'user@host'." >&2 | |
| exit 1 | |
| fi | |
| echo "→ adding $HOST to known_hosts" | |
| ssh-keyscan -T 15 -H "$HOST" >> ~/.ssh/known_hosts 2>/dev/null | |
| chmod 644 ~/.ssh/known_hosts | |
| - name: Upload compose & create .env from secret | |
| shell: bash | |
| env: | |
| EC2_HOST: ${{ secrets.EC2_HOST }} | |
| DEPLOY_DIR: /srv/stock | |
| JASYPT_ENCRYPTOR_PASSWORD: ${{ secrets.JASYPT_ENCRYPTOR_PASSWORD }} | |
| run: | | |
| set -euo pipefail | |
| # 로그 디렉토리 생성 (볼륨 마운트용) | |
| ssh -o StrictHostKeyChecking=no "$EC2_HOST" "mkdir -p $DEPLOY_DIR/logs" | |
| # config 디렉토리 생성 | |
| ssh -o StrictHostKeyChecking=no "$EC2_HOST" "mkdir -p $DEPLOY_DIR/config" | |
| # 항상 최신 docker-compose.yml 업로드 (로그 볼륨 설정 등 최신 변경사항 반영) | |
| scp -o StrictHostKeyChecking=no docker-compose.yml "$EC2_HOST:$DEPLOY_DIR/docker-compose.yml" | |
| # GitHub 시크릿에서 .env 파일 생성 | |
| if [ -n "${JASYPT_ENCRYPTOR_PASSWORD:-}" ]; then | |
| printf "JASYPT_ENCRYPTOR_PASSWORD=%s\n" "$JASYPT_ENCRYPTOR_PASSWORD" | ssh -o StrictHostKeyChecking=no "$EC2_HOST" "cat > $DEPLOY_DIR/config/.env && chmod 600 $DEPLOY_DIR/config/.env" | |
| # .env 파일 생성 확인 | |
| ssh -o StrictHostKeyChecking=no "$EC2_HOST" "ls -la $DEPLOY_DIR/config/.env && echo '파일 내용 확인 (비밀번호 제외):' && cat $DEPLOY_DIR/config/.env | sed 's/=.*/=***/'" | |
| echo "✅ .env 파일 생성 완료" | |
| else | |
| echo "⚠️ JASYPT_ENCRYPTOR_PASSWORD 시크릿이 설정되지 않았습니다" | |
| exit 1 | |
| fi | |
| - name: Pull & Restart on EC2 | |
| env: | |
| EC2_HOST: ${{ secrets.EC2_HOST }} | |
| DEPLOY_DIR: /srv/stock | |
| run: | | |
| ssh -o StrictHostKeyChecking=no "$EC2_HOST" " | |
| set -e | |
| cd $DEPLOY_DIR | |
| echo '=== 기존 컨테이너 정리 중 ===' | |
| # restart: unless-stopped를 우회하기 위해 먼저 명시적으로 정지 | |
| docker compose stop || true | |
| # 기존 컨테이너 중지 및 제거 (orphan 포함) | |
| docker compose down --remove-orphans || true | |
| # 남아있는 stockproject 컨테이너 강제 제거 | |
| docker ps -a --filter 'name=stockproject' --format '{{.ID}}' | while read container_id; do | |
| [ -n \"\$container_id\" ] && docker rm -f \"\$container_id\" 2>/dev/null || true | |
| done || true | |
| # 포트 해제를 위한 짧은 대기 | |
| sleep 2 | |
| echo '=== 최신 이미지 Pull ===' | |
| # 최신 이미지 pull | |
| docker compose pull | |
| echo '=== 환경 변수 확인 ===' | |
| # .env 파일 존재 확인 | |
| if [ -f config/.env ]; then | |
| echo '✅ config/.env 파일 존재' | |
| echo '환경 변수 확인 (비밀번호 제외):' | |
| cat config/.env | sed 's/=.*/=***/' | |
| else | |
| echo '❌ config/.env 파일이 존재하지 않습니다!' | |
| exit 1 | |
| fi | |
| echo '=== 컨테이너 시작 ===' | |
| # 컨테이너 시작 | |
| docker compose up -d | |
| echo '=== 정리 및 상태 확인 ===' | |
| # 사용하지 않는 이미지 정리 | |
| docker image prune -f | |
| # 상태 확인 | |
| docker ps | |
| echo '=== 배포 완료 ===' | |
| " |