Fix: 과도한 요청 방지를 위한 전역 레이트 리밋 적용 관련 수정 #445
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 Spring Boot APP to Amazon Linux 2023 | |
| on: | |
| push: | |
| branches: | |
| - main | |
| jobs: | |
| deploy: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v3 | |
| - name: Set up JDK 21 | |
| uses: actions/setup-java@v2 | |
| with: | |
| java-version: '21' | |
| distribution: 'temurin' | |
| - name: Build Spring Boot app with Gradle | |
| run: ./gradlew build -Dspring.profiles.active=common,prod | |
| - name: Build Docker image | |
| run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/boardbuddy:backend-latest -f Dockerfile . | |
| - name: Docker Login | |
| run: echo ${{ secrets.DOCKERHUB_ACCESS_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin | |
| - name: Push Docker image | |
| run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/boardbuddy:backend-latest | |
| - name: Add SSH Key | |
| uses: webfactory/ssh-agent@v0.5.3 | |
| with: | |
| ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} | |
| - name: Create Spring APP environment variables file | |
| run: | | |
| cat > env.list <<EOF | |
| SPRING_DATASOURCE_URL=${{ secrets.PROD_DB_URL }} | |
| SPRING_DATASOURCE_USERNAME=${{ secrets.PROD_DB_USERNAME }} | |
| SPRING_DATASOURCE_PASSWORD=${{ secrets.PROD_DB_PASSWORD }} | |
| SPRING_CLOUD_AWS_CREDENTIALS_ACCESS_KEY=${{ secrets.PROD_AWS_ACCESS_KEY }} | |
| SPRING_CLOUD_AWS_CREDENTIALS_SECRET_KEY=${{ secrets.PROD_AWS_SECRET_KEY }} | |
| SPRING_CLOUD_AWS_S3_BUCKET_NAME=${{ secrets.PROD_S3_BUCKET_NAME }} | |
| SPRING_CLOUD_AWS_S3_BUCKET_REGION=${{ secrets.PROD_S3_BUCKET_REGION }} | |
| SPRING_DATA_REDIS_HOST=${{ secrets.PROD_REDIS_HOST }} | |
| SPRING_DATA_REDIS_PORT=${{ secrets.PROD_REDIS_PORT }} | |
| SPRING_DATA_REDIS_PASSWORD=${{ secrets.PROD_REDIS_PASSWORD }} | |
| SPRING_COOL_SMS_API_KEY=${{ secrets.PROD_SMS_API_KEY }} | |
| SPRING_COOL_SMS_API_SECRET=${{ secrets.PROD_SMS_API_SECRET }} | |
| SPRING_COOL_SMS_SENDER_NUMBER=${{ secrets.PROD_SMS_SENDER_NUMBER }} | |
| SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_NAVER_CLIENT_ID=${{ secrets.NAVER_CLIENT_ID }} | |
| SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_NAVER_CLIENT_SECRET=${{ secrets.NAVER_CLIENT_SECRET }} | |
| SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }} | |
| SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }} | |
| SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }} | |
| SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_KAKAO_CLIENT_SECRET=${{ secrets.KAKAO_CLIENT_SECRET }} | |
| SPRING_CLOUD_AWS_CLOUD_FRONT_DOMAIN=${{ secrets.PROD_CLOUD_FRONT_DOMAIN}} | |
| SPRING_CLOUD_AWS_CLOUD_FRONT_KEY_PAIR_ID=${{ secrets.PROD_CLOUD_FRONT_KEY_PAIR_ID}} | |
| SPRING_CLOUD_AWS_CLOUD_FRONT_URL_EXPIRATION_MINUTES=${{ secrets.PROD_CLOUD_FRONT_URL_EXPIRATION_MINUTES}} | |
| SPRING_CLOUD_AWS_CLOUD_FRONT_SECRET_REGION=${{ secrets.PROD_CLOUD_FRONT_SECRET_REGION}} | |
| SPRING_CLOUD_AWS_CLOUD_FRONT_SECRET_NAME=${{ secrets.PROD_CLOUD_FRONT_SECRET_NAME}} | |
| SPRING_CLOUD_AWS_CLOUD_FRONT_SECRET_KEY_VALUE_NAME=${{ secrets.PROD_CLOUD_FRONT_SECRET_KEY_VALUE_NAME}} | |
| SPRING_PROFILES_ACTIVE=common,prod | |
| EOF | |
| - name: Create nginx environment variables file | |
| run: | | |
| cat > nginx.env.list <<EOF | |
| NGINX_SSL_CERT_PATH=${{ secrets.NGINX_SSL_CERT_PATH }} | |
| NGINX_SSL_KEY_PATH=${{ secrets.NGINX_SSL_KEY_PATH }} | |
| EOF | |
| - name: Render nginx config | |
| run: | | |
| set -o allexport | |
| source nginx.env.list | |
| envsubst '${NGINX_SSL_CERT_PATH} ${NGINX_SSL_KEY_PATH}' < nginx.template.conf > default.conf | |
| - name: Create Redis configuration | |
| run: | | |
| cat > redis.conf <<EOF | |
| bind ${{ secrets.PROD_REDIS_BIND_PORT }} | |
| port ${{ secrets.PROD_REDIS_PORT }} | |
| requirepass ${{ secrets.PROD_REDIS_PASSWORD }} | |
| protected-mode no | |
| EOF | |
| - name: Transfer files to EC2 | |
| run: | | |
| scp -o StrictHostKeyChecking=no src/main/resources/application-common.yml ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/application-common.yml | |
| scp -o StrictHostKeyChecking=no src/main/resources/application-prod.yml ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/application-prod.yml | |
| scp -o StrictHostKeyChecking=no env.list ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/env.list | |
| scp -o StrictHostKeyChecking=no docker-compose.prod.yml ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/docker-compose.yml | |
| scp -o StrictHostKeyChecking=no redis.conf ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/redis.conf | |
| scp -o StrictHostKeyChecking=no default.conf ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/home/ec2-user/default.conf | |
| - name: Deploy to EC2 | |
| run: | | |
| ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=60 ec2-user@${{ secrets.EC2_PUBLIC_IP }} << 'EOF' | |
| # Docker 로그인 및 이미지 업데이트 | |
| sudo docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_ACCESS_TOKEN }} | |
| sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/boardbuddy:backend-latest | |
| # Docker 네트워크 생성 | |
| sudo docker network create spring-boot-app-network || true | |
| # Redis 컨테이너 재시작 | |
| if sudo docker ps -a -q -f name=redis; then | |
| sudo docker stop redis && sudo docker rm redis | |
| fi | |
| sudo docker run -d --name redis \ | |
| -v /home/ec2-user/redis.conf:/usr/local/etc/redis/redis.conf \ | |
| --network spring-boot-app-network \ | |
| -e REDIS_PASSWORD=${{ secrets.PROD_REDIS_PASSWORD }} \ | |
| -p 6379:${{ secrets.PROD_REDIS_PORT }} redis:latest redis-server /usr/local/etc/redis/redis.conf | |
| # Spring Boot 애플리케이션 컨테이너 재시작 | |
| if sudo docker ps -a -q -f name=spring-boot-app; then | |
| sudo docker stop spring-boot-app && sudo docker rm spring-boot-app | |
| fi | |
| sudo docker run -d --name spring-boot-app \ | |
| --env-file /home/ec2-user/env.list \ | |
| -v /home/ec2-user/application-common.yml:/config/application-common.yml \ | |
| -v /home/ec2-user/application-prod.yml:/config/application-prod.yml \ | |
| --network spring-boot-app-network \ | |
| -p 8080:8080 ${{ secrets.DOCKERHUB_USERNAME }}/boardbuddy:backend-latest \ | |
| --spring.config.location=/config/application-common.yml,/config/application-prod.yml | |
| # Nginx 설정 반영 | |
| sudo mv /home/ec2-user/default.conf /etc/nginx/conf.d/default.conf | |
| sudo nginx -t | |
| sudo systemctl restart nginx | |
| # Certbot 설치 및 인증서 갱신 | |
| sudo dnf install -y certbot python3-certbot-nginx | |
| sudo certbot renew --nginx --quiet | |
| # 상태 확인 | |
| sudo docker ps -a | |
| sudo docker logs spring-boot-app | |
| EOF |