Skip to content

Patch: seperated aws deployment from complete cicd + added checks in … #3

Patch: seperated aws deployment from complete cicd + added checks in …

Patch: seperated aws deployment from complete cicd + added checks in … #3

Workflow file for this run

# 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:

Check failure on line 21 in .github/workflows/deploy-aws.yml

View workflow run for this annotation

GitHub Actions / .github/workflows/deploy-aws.yml

Invalid workflow file

secret name `GITHUB_TOKEN` within `workflow_call` can not be used since it would collide with system reserved name
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 ---"