name: Deploy Prod (NATIVE) on: push: branches: - main jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout Code uses: https://github.com/actions/checkout@v4 - name: Generate CloudWatch Config Locally run: | mkdir -p tmp cat << 'EOF' > tmp/amazon-cloudwatch-agent.json { "agent": { "metrics_collection_interval": 60, "run_as_user": "root" }, "metrics": { "metrics_collected": { "disk": { "measurement": ["used_percent"], "metrics_collection_interval": 60, "resources": ["/"] }, "mem": { "measurement": ["mem_used_percent"], "metrics_collection_interval": 60 } } }, "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/home/ubuntu/emailservice/logs/app.log", "log_group_name": "/emailservice/app", "log_stream_name": "{instance_id}", "retention_in_days": 30 }, { "file_path": "/home/ubuntu/emailservice/logs/error.log", "log_group_name": "/emailservice/error", "log_stream_name": "{instance_id}", "retention_in_days": 30 }, { "file_path": "/home/ubuntu/emailservice/logs/requests.log", "log_group_name": "/emailservice/requests", "log_stream_name": "{instance_id}", "retention_in_days": 30 }, { "file_path": "/home/ubuntu/emailservice/logs/gunicorn-access.log", "log_group_name": "/emailservice/gunicorn-access", "log_stream_name": "{instance_id}", "retention_in_days": 30 }, { "file_path": "/home/ubuntu/emailservice/logs/gunicorn-error.log", "log_group_name": "/emailservice/gunicorn-error", "log_stream_name": "{instance_id}", "retention_in_days": 30 } ] } } } } EOF - name: Package Application run: | tar -czf app.tar.gz --exclude=.git --exclude=tmp . - name: Deploy to Prod EC2 run: | apk add --no-cache openssh-client aws-cli mkdir -p ~/.ssh echo "${{ secrets.EC2_SSH_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa # Copy app archive and configuration files scp -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa app.tar.gz tmp/amazon-cloudwatch-agent.json emailservice.service ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }}:/tmp/ # Execute deployment commands on remote server ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }} << 'EOF' set -e # ── 2. Install Host Dependencies ────────────────────────────── sudo apt-get update sudo apt-get install -y python3-pip python3-venv python3-dev default-libmysqlclient-dev pkg-config libpq-dev build-essential # ── 3. Extract codebase to target directory ─────────────────── sudo mkdir -p /home/ubuntu/emailservice sudo chown -R ubuntu:ubuntu /home/ubuntu/emailservice tar -xzf /tmp/app.tar.gz -C /home/ubuntu/emailservice # ── 4. Set up python virtual environment & dependencies ──────── cd /home/ubuntu/emailservice mkdir -p logs python3 -m venv venv ./venv/bin/pip install --upgrade pip ./venv/bin/pip install -r requirements.txt # ── 5. Configure environment variables ───────────────────────── echo "DEBUG=0" > .env echo "DB_USER=vignesh" >> .env echo "DB_PASSWORD=vtechnosoft@123A" >> .env echo "DB_HOST=127.0.0.1" >> .env echo "DB_PORT=5432" >> .env # ── 6. Run Database Migrations ───────────────────────────────── ./venv/bin/python manage.py migrate --noinput # ── 7. Configure and restart Systemd service ─────────────────── sudo mv /tmp/emailservice.service /etc/systemd/system/emailservice.service sudo systemctl daemon-reload sudo systemctl enable emailservice sudo systemctl restart emailservice # ── 8. Configure CloudWatch Agent ────────────────────────────── sudo mv /tmp/amazon-cloudwatch-agent.json /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \ -a fetch-config -m ec2 -s \ -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json # ── 9. Cleanup tmp files ─────────────────────────────────────── rm -f /tmp/app.tar.gz EOF