Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save kilamaelie/441a67c3dd643c5893e992b9ee3e6ab5 to your computer and use it in GitHub Desktop.
Save kilamaelie/441a67c3dd643c5893e992b9ee3e6ab5 to your computer and use it in GitHub Desktop.
Django, a high-level Python web framework, is a popular choice for building RESTful APIs. Once your Django Rest API has been developed and tested, deploying it becomes a crucial step in making it accessible to users. In this blog post, we'll guide you through the process of deploying a Django Rest API on AWS EC2 using Docker for containerization…
name: Continuous Integration and Delivery
on: [push]
env:
#
DJANGO_TUTORIAL_API_IMAGE: ghcr.io/$(echo $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')/store
DJANGO_TUTORIAL_NGINX_IMAGE: ghcr.io/$(echo $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')/nginx
REGISTRY: ghcr.io
jobs:
build:
name: Build the Docker Image
runs-on: ubuntu-latest
steps:
- name: checkout main
uses: actions/checkout@v3
- name: Set environment variables to .env
run: |
echo "DJANGO_TUTORIAL_API_IMAGE=$(echo ${{env.DJANGO_TUTORIAL_API_IMAGE}} )" >> $GITHUB_ENV
echo "DJANGO_TUTORIAL_NGINX_IMAGE=$(echo ${{env.DJANGO_TUTORIAL_NGINX_IMAGE}} )" >> $GITHUB_ENV
- name: Log in to GitHub Packages
env:
PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
run: echo ${PERSONAL_ACCESS_TOKEN} | docker login ghcr.io -u ${{ secrets.NAMESPACE }} --password-stdin
- name: Pull images
run: |
docker pull ${{ env.DJANGO_TUTORIAL_API_IMAGE }} || true
docker pull ${{ env.DJANGO_TUTORIAL_NGINX_IMAGE }} || true
- name: Build images
id: build-images
run: |
docker-compose -f docker-compose.ci.yml build
- name: Push images
run: |
docker push ${{ env.DJANGO_TUTORIAL_API_IMAGE }}
docker push ${{ env.DJANGO_TUTORIAL_NGINX_IMAGE }}
checking-secrets:
name: Checking secrets
runs-on: ubuntu-latest
needs: build
outputs:
secret_key_exists: ${{steps.check_secrets.outputs.defined}}
steps:
- name: Check for Secrets availabilities
id: check_secrets
shell: bash
run: |
if [[ -n "${{ secrets.PRIVATE_KEY }}" && -n "${{secrets.AWS_EC2_IP_ADDRESS}}" && -n "${{secrets.AWS_HOST_USER}}" ]]; then
echo "defined=true" >> $GITHUB_OUTPUT;
else
echo "defined=false" >> $GITHUB_OUTPUT;
fi
deploy:
name: Deploy to AWS EC2
runs-on: ubuntu-latest
needs: checking-secrets
if: needs.checking-secrets.outputs.secret_key_exists == 'true'
steps:
- name: Checkout main
uses: actions/checkout@v3
- name: Add environment variables to .env
run: |
echo DJANGO_TUTORIAL_API_IMAGE=${{ env.DJANGO_TUTORIAL_API_IMAGE }} >> .env
echo DJANGO_TUTORIAL_NGINX_IMAGE=${{ env.DJANGO_TUTORIAL_NGINX_IMAGE }} >> .env
echo NAMESPACE=${{ secrets.NAMESPACE }} >> .env
echo PERSONAL_ACCESS_TOKEN=${{ secrets.PERSONAL_ACCESS_TOKEN }} >> .env
- name: Add the private SSH key to the ssh-agent
env:
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
run: |
mkdir -p ~/.ssh
ssh-agent -a $SSH_AUTH_SOCK > /dev/null
ssh-keyscan github.com >> ~/.ssh/known_hosts
ssh-add - <<< "${{ secrets.PRIVATE_KEY }}"
- name: Deploy images on AWS EC2
env:
SSH_AUTH_SOCK: /tmp/ssh_agent.sock
run: |
scp -o StrictHostKeyChecking=no -r ./.env ./docker-compose.prod.yml ${{secrets.AWS_HOST_USER}}@${{ secrets.AWS_EC2_IP_ADDRESS }}:
ssh -o StrictHostKeyChecking=no ${{secrets.AWS_HOST_USER}}@${{ secrets.AWS_EC2_IP_ADDRESS }} << EOF
docker-compose down --rmi all -v
docker login ghcr.io -u ${{secrets.NAMESPACE}} -p ${{secrets.PERSONAL_ACCESS_TOKEN}}
docker pull $DJANGO_TUTORIAL_API_IMAGE
docker pull $DJANGO_TUTORIAL_NGINX_IMAGE
docker-compose --env-file=.env -f docker-compose.prod.yml up -d --build
docker logout
EOF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment