Skip to content

Worker deployment check #43

Worker deployment check

Worker deployment check #43

Workflow file for this run

name: Build and Deploy to Docker Hub
on:
push:
branches:
- main
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Check Out Repo
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push Backend Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile.backend
push: true
tags: puneetnj/course-app-be:latest
platforms: linux/amd64,linux/arm64
cache-from: type=registry,ref=puneetnj/course-app-be:latest
cache-to: type=inline,mode=max
build-args: |
CDN_LINK=${{ secrets.CDN_LINK }}
- name: Verify Backend Image
run: |
docker pull puneetnj/course-app-be:latest
docker image inspect puneetnj/course-app-be:latest
- name: Deploy to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_KEY }}
script: |
CF_PUBLIC=$(echo '${{ secrets.CF_PUBLIC_KEY }}' | sed 's/\\n/\n/g')
CF_PRIVATE=$(echo '${{ secrets.CF_PRIVATE_KEY }}' | sed 's/\\n/\n/g')
sudo docker pull puneetnj/course-app-be:latest
if [ "$(sudo docker ps -aq -f name=course-app-be)" ]; then
sudo docker stop course-app-be
sudo docker rm course-app-be
fi
sudo docker run -d --name course-app-be -p 4000:4000 \
-e DATABASE_URL="${{ secrets.DATABASE_URL }}" \
-e USER_JWT_PASSWORD="${{ secrets.USER_JWT_PASSWORD }}" \
-e ADMIN_JWT_PASSWORD="${{ secrets.ADMIN_JWT_PASSWORD }}" \
-e AWS_ACCESS_KEY_ID="${{ secrets.AWS_ACCESS_KEY_ID }}" \
-e AWS_SECRET_ACCESS_KEY="${{ secrets.AWS_SECRET_ACCESS_KEY }}" \
-e CF_PUBLIC_KEY="$CF_PUBLIC" \
-e CF_PRIVATE_KEY="$CF_PRIVATE" \
puneetnj/course-app-be:latest
deploy-worker:
runs-on: ubuntu-latest
steps:
- name: Check Out Repo
uses: actions/checkout@v4
- name: Create SSH key file
run: |
mkdir -p ~/.ssh/
echo "${{ secrets.T2_SMALL_SSH_KEY }}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
- name: Copy worker files to EC2
run: |
scp -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no -r ./worker/* ${{ secrets.T2_SMALL_SSH_USERNAME }}@${{ secrets.T2_SMALL_SSH_HOST }}:/home/${{ secrets.T2_SMALL_SSH_USERNAME }}/worker/
- name: Deploy Worker to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.T2_SMALL_SSH_HOST }}
username: ${{ secrets.T2_SMALL_SSH_USERNAME }}
key: ${{ secrets.T2_SMALL_SSH_KEY }}
script: |
# Install PM2 if not already installed
if ! command -v pm2 &> /dev/null; then
npm install -g pm2
fi
cd /home/${{ secrets.T2_SMALL_SSH_USERNAME }}/worker
# Set environment variables
cat > .env << EOL
REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}
REDIS_HOST=${{ secrets.REDIS_HOST }}
S3=${{ secrets.S3 }}
AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}
BACKEND_URL=${{ secrets.BACKEND_URL }}
AWS_S3_BUCKET=${{ secrets.AWS_S3_BUCKET }}
AWS_S3_BUCKET_TEMP=${{ secrets.AWS_S3_BUCKET_TEMP }}
EOL
# Install dependencies and build
npm install
npm run build
# Stop existing PM2 process if exists
pm2 delete worker || true
# Start with PM2
pm2 start npm --name "worker" -- run start
# Save PM2 process list
pm2 save
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: "18"
- name: Install Frontend Dependencies
working-directory: ./frontend
run: npm install
- name: Build Frontend
working-directory: ./frontend
run: npm run build
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Deploy to S3
run: |
aws s3 sync frontend/dist s3://${{ secrets.S3_BUCKET }} --delete
aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} --paths "/*"