Deploy FastAPI #184
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 FastAPI | |
| on: | |
| push: | |
| branches: | |
| - fix/** | |
| workflow_run: | |
| workflows: ["CI (Python/FastAPI)"] | |
| types: [completed] | |
| jobs: | |
| deploy: | |
| name: Deploy to AWS FastAPI EC2 | |
| runs-on: ubuntu-latest | |
| if: | | |
| github.event.workflow_run.conclusion == 'success' && | |
| startsWith(github.event.workflow_run.head_branch, 'pre-processing-v') | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Create env file | |
| run: | | |
| echo "DB_HOST=${{ secrets.DB_HOST }}" > .env.prod | |
| echo "DB_PORT=${{ secrets.DB_PORT }}" >> .env.prod | |
| echo "DB_USER=${{ secrets.DB_USER }}" >> .env.prod | |
| echo "DB_PASS=${{ secrets.DB_PASS }}" >> .env.prod | |
| echo "DB_NAME=${{ secrets.DB_NAME }}" >> .env.prod | |
| echo "LOKI_HOST=${{ secrets.LOKI_HOST }}" >> .env.prod | |
| echo "LOKI_USERNAME=${{ secrets.LOKI_USERNAME }}" >> .env.prod | |
| echo "LOKI_PASSWORD=${{ secrets.LOKI_PASSWORD }}" >> .env.prod | |
| echo "ENV_NAME=${{ secrets.ENV_NAME }}" >> .env.prod | |
| echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }}" >> .env.prod | |
| echo "MODE=prd" >> .env.prod | |
| echo "APP_NAME=pre-processing" >> .env.prod | |
| echo "GRAFANA_CLOUD_PROMETHEUS_URL=${{ secrets.GRAFANA_CLOUD_PROMETHEUS_URL }}" >> .env.prod | |
| echo "GRAFANA_CLOUD_PROMETHEUS_USER=${{ secrets.GRAFANA_CLOUD_PROMETHEUS_USER }}" >> .env.prod | |
| echo "GRAFANA_CLOUD_API_KEY=${{ secrets.GRAFANA_CLOUD_API_KEY }}" >> .env.prod | |
| echo "AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}" >> .env.prod | |
| echo "AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> .env.prod | |
| echo "S3_BUCKET_NAME=${{secrets.S3_BUCKET_NAME }}" >> .env.prod | |
| echo "AWS_REGION=${{ secrets.AWS_REGION }}" >> .env.prod | |
| echo "S3_BASE_FOLDER=${{ secrets.S3_BASE_FOLDER }}" >> .env.prod | |
| echo "S3_UPLOAD_ENABLED=${{ secrets.S3_UPLOAD_ENABLED }}" >> .env.prod | |
| echo "IMAGE_DOWNLOAD_TIMEOUT=${{ secrets.IMAGE_DOWNLOAD_TIMEOUT }}" >> .env.prod | |
| echo "MAX_IMAGE_SIZE_MB=${{ secrets.MAX_IMAGE_SIZE_MB }}" >> .env.prod | |
| echo "MECAB_PATH=${{ secrets.MECAB_PATH }}" >> .env.prod | |
| echo "MECABRC=${{ secrets.MECABRC }}" >> .env.prod | |
| - name: Set repo lowercase | |
| run: echo "REPO_LC=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV | |
| - name: Copy docker compose files to FastAPI EC2 | |
| uses: appleboy/[email protected] | |
| with: | |
| host: ${{ secrets.FASTAPI_SERVER_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.SERVER_SSH_KEY }} | |
| source: "docker/production-fastapi/docker-compose.yml" | |
| target: "~/app" | |
| - name: Copy .env.prod file to FastAPI EC2 | |
| uses: appleboy/[email protected] | |
| with: | |
| host: ${{ secrets.FASTAPI_SERVER_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.SERVER_SSH_KEY }} | |
| source: ".env.prod" | |
| target: "~/app/docker/production-fastapi/" | |
| overwrite: true | |
| - name: Copy promtail-config to FastAPI EC2 | |
| uses: appleboy/[email protected] | |
| with: | |
| host: ${{ secrets.FASTAPI_SERVER_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.SERVER_SSH_KEY }} | |
| source: "docker/production-fastapi/promtail-config.yml" | |
| target: "~/app" | |
| overwrite: true | |
| - name: Copy agent-config to FastAPI EC2 | |
| uses: appleboy/[email protected] | |
| with: | |
| host: ${{ secrets.FASTAPI_SERVER_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.SERVER_SSH_KEY }} | |
| source: "docker/production-fastapi/agent-config.yml" | |
| target: "~/app" | |
| overwrite: true | |
| - name: Deploy on EC2 | |
| uses: appleboy/[email protected] | |
| with: | |
| host: ${{secrets.FASTAPI_SERVER_HOST}} | |
| username: ubuntu | |
| key: ${{secrets.SERVER_SSH_KEY}} | |
| script: | | |
| cd ~/app/docker/production-fastapi | |
| echo "${{secrets.GITHUB_TOKEN}}" | docker login ghcr.io -u ${{github.actor}} --password-stdin | |
| docker-compose pull | |
| docker-compose down | |
| docker-compose up -d | |
| sleep 5 | |
| docker-compose ps | |
| echo "Waiting for containers to become healthy..." | |
| for i in {1..30}; do | |
| unhealthy=$(docker ps --filter "health=unhealthy" --format "{{.Names}}") | |
| starting=$(docker ps --filter "health=starting" --format "{{.Names}}") | |
| if [ -z "$unhealthy" ] && [ -z "$starting" ]; then | |
| echo "All containers are healthy!" | |
| break | |
| fi | |
| echo "Waiting... ($i/30)" | |
| sleep 2 | |
| done | |
| docker image prune -f | |
| - name: Send Discord notification - Success | |
| if: success() | |
| uses: Ilshidur/action-discord@master | |
| env: | |
| DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL }} | |
| with: | |
| args: | | |
| **배포 성공** | |
| **Repository:** ${{ env.REPO_LC }} | |
| **Tag:** ${{ github.ref_name }} | |
| **Server:** ${{ secrets.FASTAPI_SERVER_HOST }} | |
| **Status:** Success! | |
| - name: Send Discord notification - Failure | |
| if: failure() | |
| uses: Ilshidur/action-discord@master | |
| env: | |
| DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_URL }} | |
| with: | |
| args: | | |
| **배포 실패** | |
| **Repository:** ${{ env.REPO_LC }} | |
| **Tag:** ${{ github.ref_name }} | |
| **Error:** 배포 중 오류가 발생했습니다. | |
| **Check:** ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} |