fix: 프록시 뒤 HTTPS 인식을 위한 forward-headers 설정 추가 #11
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: Backend Deploy | |
| on: | |
| push: | |
| branches: [main] | |
| paths: | |
| - 'backend/**' | |
| workflow_dispatch: | |
| concurrency: | |
| group: maru-backend-prod | |
| cancel-in-progress: true | |
| jobs: | |
| deploy: | |
| runs-on: ubuntu-latest | |
| environment: MARU_PROD_ENV | |
| defaults: | |
| run: | |
| working-directory: backend | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Setup Java 21 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '21' | |
| distribution: 'temurin' | |
| cache: 'gradle' | |
| - name: Build with Gradle | |
| run: ./gradlew clean build | |
| - name: Prepare JAR artifact | |
| run: cp build/libs/maru-backend.jar ../maru-backend.jar | |
| - name: Create env file | |
| working-directory: . | |
| run: | | |
| { | |
| printf 'SPRING_DATASOURCE_URL=%s\n' "${{ secrets.SPRING_DATASOURCE_URL }}" | |
| printf 'SPRING_DATASOURCE_USERNAME=%s\n' "${{ secrets.SPRING_DATASOURCE_USERNAME }}" | |
| printf 'SPRING_DATASOURCE_PASSWORD=%s\n' "${{ secrets.SPRING_DATASOURCE_PASSWORD }}" | |
| printf 'JWT_SECRET=%s\n' "${{ secrets.JWT_SECRET }}" | |
| printf 'CORS_ALLOWED_ORIGINS=%s\n' "${{ secrets.CORS_ALLOWED_ORIGINS }}" | |
| printf 'OAUTH_GOOGLE_CLIENT_ID=%s\n' "${{ secrets.OAUTH_GOOGLE_CLIENT_ID }}" | |
| printf 'OAUTH_GOOGLE_CLIENT_SECRET=%s\n' "${{ secrets.OAUTH_GOOGLE_CLIENT_SECRET }}" | |
| printf 'OAUTH_KAKAO_CLIENT_ID=%s\n' "${{ secrets.OAUTH_KAKAO_CLIENT_ID }}" | |
| printf 'OAUTH_KAKAO_CLIENT_SECRET=%s\n' "${{ secrets.OAUTH_KAKAO_CLIENT_SECRET }}" | |
| printf 'OAUTH_REDIRECT_URI_BASE=%s\n' "${{ secrets.OAUTH_REDIRECT_URI_BASE }}" | |
| printf 'SMS_SOLAPI_API_KEY=%s\n' "${{ secrets.SMS_SOLAPI_API_KEY }}" | |
| printf 'SMS_SOLAPI_API_SECRET=%s\n' "${{ secrets.SMS_SOLAPI_API_SECRET }}" | |
| printf 'SMS_SOLAPI_SENDER_NUMBER=%s\n' "${{ secrets.SMS_SOLAPI_SENDER_NUMBER }}" | |
| printf 'DEMO_USER_ID=%s\n' "${{ secrets.DEMO_USER_ID }}" | |
| } > maru-backend.env | |
| - name: Verify artifacts | |
| working-directory: . | |
| run: ls -al maru-backend.jar maru-backend.env | |
| - name: Upload JAR to EC2 | |
| uses: appleboy/scp-action@v0.1.7 | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ec2-user | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| source: maru-backend.jar | |
| target: /tmp/ | |
| - name: Upload env file to EC2 | |
| uses: appleboy/scp-action@v0.1.7 | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ec2-user | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| source: maru-backend.env | |
| target: /tmp/ | |
| - name: Deploy and restart service | |
| uses: appleboy/ssh-action@v1.0.3 | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ec2-user | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| script: | | |
| set -euo pipefail | |
| # env 디렉토리 설정 | |
| sudo mkdir -p /etc/maru | |
| sudo chown root:root /etc/maru | |
| sudo chmod 700 /etc/maru | |
| # env 파일 원자적 교체 | |
| sudo mv -f /tmp/maru-backend.env /etc/maru/maru-backend.env.new | |
| sudo mv -f /etc/maru/maru-backend.env.new /etc/maru/maru-backend.env | |
| sudo chown root:root /etc/maru/maru-backend.env | |
| sudo chmod 600 /etc/maru/maru-backend.env | |
| # JAR 백업 (롤백용) | |
| cp -f /home/ec2-user/maru-backend.jar /home/ec2-user/maru-backend.jar.bak || true | |
| # JAR 원자적 교체 | |
| mv -f /tmp/maru-backend.jar /home/ec2-user/maru-backend.jar.new | |
| mv -f /home/ec2-user/maru-backend.jar.new /home/ec2-user/maru-backend.jar | |
| # 서비스 재시작 | |
| sudo systemctl restart maru-backend | |
| # 스모크 테스트 (최대 60초 대기, 5초 간격 재시도) | |
| echo "Waiting for application to start..." | |
| for i in {1..12}; do | |
| sleep 5 | |
| if curl -sf http://localhost:8080/internal/healthz > /dev/null 2>&1; then | |
| echo "Health check passed on attempt $i" | |
| exit 0 | |
| fi | |
| echo "Attempt $i/12: Application not ready yet..." | |
| done | |
| # 60초 후에도 실패하면 롤백 | |
| echo "Health check failed after 60 seconds. Rolling back..." | |
| mv -f /home/ec2-user/maru-backend.jar.bak /home/ec2-user/maru-backend.jar || true | |
| sudo systemctl restart maru-backend | |
| echo "Rollback complete. Service status:" | |
| sudo systemctl status maru-backend --no-pager | |
| journalctl -u maru-backend -n 50 --no-pager | |
| exit 1 |