Skip to content

Merge pull request #25 from warteamx/24-improve-template-docs #14

Merge pull request #25 from warteamx/24-improve-template-docs

Merge pull request #25 from warteamx/24-improve-template-docs #14

Workflow file for this run

name: Deploy Server to EC2
on:
push:
branches: [ main, 22-deploy-to-aws ]
paths:
- 'server/**'
- '.github/workflows/deploy-server.yml'
workflow_dispatch:
jobs:
deploy-server:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- 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: Build and save Docker image
working-directory: ./server
run: |
docker build -t lab1-todoapp-server:latest --target production .
docker save lab1-todoapp-server:latest | gzip > lab1-todoapp-server.tar.gz
- name: Upload Docker image to EC2
uses: appleboy/[email protected]
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: "server/lab1-todoapp-server.tar.gz"
target: "/home/ubuntu/"
- name: Deploy to EC2
uses: appleboy/[email protected]
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script: |
# Update system
sudo apt-get update
# Install Docker if not already installed
if ! command -v docker &> /dev/null; then
sudo apt-get install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
fi
# Install AWS CLI if not already installed
if ! command -v aws &> /dev/null; then
sudo apt-get install -y awscli
fi
# Load Docker image
cd /home/ubuntu
sudo docker load < server/lab1-todoapp-server.tar.gz
# Stop and remove existing container
sudo docker stop lab1-todoapp-server || true
sudo docker rm lab1-todoapp-server || true
# Run new container
sudo docker run -d \
--name lab1-todoapp-server \
--restart unless-stopped \
-p 80:3000 \
-e NODE_ENV=production \
-e PORT=3000 \
-e SUPABASE_DB_URL="${{ secrets.SUPABASE_DB_URL }}" \
-e SUPABASE_KEY="${{ secrets.SUPABASE_KEY }}" \
-e SUPABASE_URL="${{ secrets.SUPABASE_URL }}" \
-e ALLOWED_ORIGINS="http://56.228.14.41,https://lab1.warteamx.com,http://lab1-todoapp.s3-website.eu-north-1.amazonaws.com" \
lab1-todoapp-server:latest
# Clean up old images
sudo docker image prune -f
- name: Health check
run: |
sleep 30
echo "πŸ” Checking Docker container status..."
# Try health check
if curl -f http://${{ secrets.EC2_HOST }}/api/health; then
echo "πŸš€ Server deployed successfully!"
echo "API URL: http://${{ secrets.EC2_HOST }}/api"
else
echo "❌ Health check failed. Attempting to get container logs for debugging..."
# Setup SSH key for debugging (reuse from deploy step)
echo "${{ secrets.EC2_PRIVATE_KEY }}" > /tmp/ec2_key
chmod 600 /tmp/ec2_key
# Get container logs via SSH if health check fails
ssh -o StrictHostKeyChecking=no -i /tmp/ec2_key ubuntu@${{ secrets.EC2_HOST }} << 'EOF'
echo "πŸ“‹ Container status:"
sudo docker ps -a --filter name=lab1-todoapp-server
echo "πŸ“‹ Container logs (last 50 lines):"
sudo docker logs --tail 50 lab1-todoapp-server
echo "πŸ“‹ System resources:"
free -h
df -h
EOF
exit 1
fi