Host name changed to deploy worker #45
This file contains 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: 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 "/*" |