Skip to content

Deploy FastAPI

Deploy FastAPI #184

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 }}