Skip to content

Merge pull request #205 from FunD-StockProject/fix/stock-master-info #115

Merge pull request #205 from FunD-StockProject/fix/stock-master-info

Merge pull request #205 from FunD-StockProject/fix/stock-master-info #115

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 '=== 배포 완료 ==='
"