Patch: seperated aws deployment from complete cicd + added checks in … #3
This file contains hidden or 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
| # ABOUTME: AWS deployment workflow that handles only the deployment to EC2 instances via Docker Compose | ||
| # ABOUTME: This workflow expects Docker images to already be built and available in the container registry | ||
| name: Deploy to AWS | ||
| on: | ||
| workflow_call: | ||
| secrets: | ||
| AWS_EC2_PRIVATE_KEY: | ||
| required: true | ||
| POSTGRES_USER: | ||
| required: true | ||
| POSTGRES_PASSWORD: | ||
| required: true | ||
| OPENAI_API_KEY: | ||
| required: true | ||
| KEYCLOAK_ADMIN_USER: | ||
| required: true | ||
| KEYCLOAK_ADMIN_PASSWORD: | ||
| required: true | ||
| GITHUB_TOKEN: | ||
| required: true | ||
| workflow_dispatch: | ||
| jobs: | ||
| deploy: | ||
| runs-on: ubuntu-latest | ||
| environment: | ||
| name: oopoops | ||
| url: 'https://client.${{ vars.EC2_PUBLIC_IP }}.nip.io' | ||
| steps: | ||
| - name: Checkout Code | ||
| uses: actions/checkout@v4 | ||
| - name: Debug Environment Variables | ||
| run: | | ||
| echo "EC2_PUBLIC_IP: ${{ vars.EC2_PUBLIC_IP }}" | ||
| echo "AWS_EC2_USER: ${{ vars.AWS_EC2_USER }}" | ||
| echo "SSH Key length: ${#AWS_EC2_PRIVATE_KEY}" | ||
| env: | ||
| AWS_EC2_PRIVATE_KEY: ${{ secrets.AWS_EC2_PRIVATE_KEY }} | ||
| - name: Test Network Connectivity | ||
| run: | | ||
| echo "=== Network Connectivity Tests ===" | ||
| echo "Testing ping to EC2 instance..." | ||
| ping -c 3 ${{ vars.EC2_PUBLIC_IP }} || echo "Ping failed" | ||
| echo "Testing port 22 connectivity..." | ||
| timeout 10 telnet ${{ vars.EC2_PUBLIC_IP }} 22 || echo "Port 22 not accessible" | ||
| echo "Testing with nmap..." | ||
| nmap -p 22 ${{ vars.EC2_PUBLIC_IP }} || echo "nmap failed" | ||
| echo "Getting GitHub runner IP..." | ||
| curl -s https://httpbin.org/ip | ||
| - name: Setup SSH Key | ||
| run: | | ||
| mkdir -p ~/.ssh | ||
| echo "${{ secrets.AWS_EC2_PRIVATE_KEY }}" > ~/.ssh/id_rsa | ||
| chmod 600 ~/.ssh/id_rsa | ||
| ssh-keyscan -t rsa ${{ vars.EC2_PUBLIC_IP }} >> ~/.ssh/known_hosts || echo "SSH keyscan failed" | ||
| - name: Test SSH Connection | ||
| run: | | ||
| ssh -o ConnectTimeout=30 -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa ${{ vars.AWS_EC2_USER }}@${{ vars.EC2_PUBLIC_IP }} "echo 'SSH connection successful'; uptime; docker --version" || echo "SSH test failed" | ||
| - name: Copy Docker Compose File to EC2 (Enhanced) | ||
| uses: appleboy/scp-action@v0.1.7 | ||
| with: | ||
| host: ${{ vars.EC2_PUBLIC_IP }} | ||
| username: ${{ vars.AWS_EC2_USER }} | ||
| key: ${{ secrets.AWS_EC2_PRIVATE_KEY }} | ||
| source: "./compose.aws.yml,./create-multiple-dbs.sh,./keycloak" | ||
| target: /home/${{ vars.AWS_EC2_USER }} | ||
| timeout: 60s | ||
| command_timeout: 120s | ||
| debug: true | ||
| overwrite: true | ||
| - name: Fallback - Manual File Copy | ||
| if: failure() | ||
| run: | | ||
| echo "Primary SCP failed, trying manual copy..." | ||
| scp -o ConnectTimeout=60 -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa \ | ||
| ./compose.aws.yml ${{ vars.AWS_EC2_USER }}@${{ vars.EC2_PUBLIC_IP }}:/home/${{ vars.AWS_EC2_USER }}/ | ||
| scp -o ConnectTimeout=60 -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa \ | ||
| ./create-multiple-dbs.sh ${{ vars.AWS_EC2_USER }}@${{ vars.EC2_PUBLIC_IP }}:/home/${{ vars.AWS_EC2_USER }}/ | ||
| scp -r -o ConnectTimeout=60 -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa \ | ||
| ./keycloak ${{ vars.AWS_EC2_USER }}@${{ vars.EC2_PUBLIC_IP }}:/home/${{ vars.AWS_EC2_USER }}/ | ||
| - name: Create .env file on EC2 | ||
| uses: appleboy/ssh-action@v1.0.3 | ||
| with: | ||
| host: ${{ vars.EC2_PUBLIC_IP }} | ||
| username: ${{ vars.AWS_EC2_USER }} | ||
| key: ${{ secrets.AWS_EC2_PRIVATE_KEY }} | ||
| timeout: 60s | ||
| command_timeout: 120s | ||
| script: | | ||
| set -e | ||
| echo "--- Creating .env file ---" | ||
| > .env | ||
| echo "CLIENT_HOST=client.${{ vars.EC2_PUBLIC_IP }}.nip.io" >> .env | ||
| echo "API_HOST=api.${{ vars.EC2_PUBLIC_IP }}.nip.io" >> .env | ||
| echo "PUBLIC_API_URL=https://api.${{ vars.EC2_PUBLIC_IP }}.nip.io/docs" >> .env | ||
| echo "POSTGRES_USER=${{ secrets.POSTGRES_USER }}" >> .env | ||
| echo "POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }}" >> .env | ||
| echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }}" >> .env | ||
| echo "KEYCLOAK_ADMIN_USER=${{ secrets.KEYCLOAK_ADMIN_USER }}" >> .env | ||
| echo "KEYCLOAK_ADMIN_PASSWORD=${{ secrets.KEYCLOAK_ADMIN_PASSWORD }}" >> .env | ||
| echo ".env file created successfully." | ||
| echo "--- Updating Keycloak realm configuration ---" | ||
| CLIENT_HOST_VAR="client.${{ vars.EC2_PUBLIC_IP }}.nip.io" | ||
| sed -i "s|http://localhost:3000|https://${CLIENT_HOST_VAR}|g" ./keycloak/myrealm.json | ||
| echo "Keycloak realm configuration updated." | ||
| - name: Deploy with Docker Compose | ||
| uses: appleboy/ssh-action@v1.0.3 | ||
| with: | ||
| host: ${{ vars.EC2_PUBLIC_IP }} | ||
| username: ${{ vars.AWS_EC2_USER }} | ||
| key: ${{ secrets.AWS_EC2_PRIVATE_KEY }} | ||
| timeout: 300s | ||
| command_timeout: 600s | ||
| script: | | ||
| set -ex | ||
| echo "--- Verifying Docker installation ---" | ||
| docker --version | ||
| docker compose version | ||
| echo "--- Checking disk space before cleanup ---" | ||
| df -h | ||
| echo "--- Logging into Docker registry (GHCR) ---" | ||
| echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin | ||
| echo "--- Stopping any running services to avoid conflicts ---" | ||
| docker compose -f compose.aws.yml down || echo "No running containers to stop. Continuing." | ||
| echo "--- Cleaning up Docker resources to free space ---" | ||
| docker container prune -f || echo "No containers to prune" | ||
| docker image prune -a -f || echo "No images to prune" | ||
| docker volume prune -f || echo "No volumes to prune" | ||
| docker network prune -f || echo "No networks to prune" | ||
| docker builder prune -f || echo "No build cache to prune" | ||
| echo "--- Checking disk space after cleanup ---" | ||
| df -h | ||
| echo "--- Starting Docker Compose services ---" | ||
| docker compose -f compose.aws.yml --env-file .env up --pull always -d | ||
| echo "--- Deployment initiated. Waiting 15 seconds for services to stabilize... ---" | ||
| sleep 15 | ||
| echo "--- Checking status of running containers ---" | ||
| docker compose -f compose.aws.yml ps | ||
| echo "--- Displaying recent logs for troubleshooting ---" | ||
| docker compose -f compose.aws.yml logs --tail=50 | ||
| echo "--- AWS Deployment completed successfully ---" | ||