Skip to content

fix: 프록시 뒤 HTTPS 인식을 위한 forward-headers 설정 추가 #11

fix: 프록시 뒤 HTTPS 인식을 위한 forward-headers 설정 추가

fix: 프록시 뒤 HTTPS 인식을 위한 forward-headers 설정 추가 #11

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