DEV Community

Gabriel Villacis
Gabriel Villacis

Posted on • Edited on

Despliegue de proyecto Django en Azure Web App

Este tutorial tratará el despliegue del proyecto al entorno cloud de Microsoft Azure:

Paso 1: Configurar proyecto Django para pase a producción

  • Agregar dependencias:
    poetry add django-environ
    poetry add azure-storage-blob
    poetry add django-storages[azure]

  • Crear variables de entorno y configurarlas dentro de settings.py:

SECRET_KEY
DEBUG
DATABASE_HOST
DATABASE_PORT
DATABASE_NAME
DATABASE_USER
DATABASE_PASS
ALLOWED_HOSTS
CSRF_TRUSTED_ORIGINS
AZURE_ACCOUNT_NAME
AZURE_ACCOUNT_KEY
Enter fullscreen mode Exit fullscreen mode
...
...
import environ

env = environ.Env()
environ.Env.read_env()

SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG') == 'True'

ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
CSRF_TRUSTED_ORIGINS = env.list('CSRF_TRUSTED_ORIGINS')

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': env('DATABASE_NAME'),
        'HOST': env('DATABASE_HOST'),
        'USER': env('DATABASE_USER'),
        'PASSWORD': env('DATABASE_PASS'),
        'PORT': env('DATABASE_PORT')
    }
}

MEDIA_ROOT = BASE_DIR / 'media'
STATICFILES_DIRS = (BASE_DIR / 'static',)

AZURE_ACCOUNT_NAME = env('AZURE_ACCOUNT_NAME')
AZURE_ACCOUNT_KEY = env('AZURE_ACCOUNT_KEY')
AZURE_CUSTOM_DOMAIN = f'{AZURE_ACCOUNT_NAME}.blob.core.windows.net'

if DEBUG:    
    STATIC_URL = '/static/'
    MEDIA_URL = '/media/'
else:
    STORAGES = {
        'default': {
            'BACKEND': 'storages.backends.azure_storage.AzureStorage',
            'OPTIONS': {
                'azure_container': 'media'                
            },
        },
        'staticfiles': {
            'BACKEND': 'storages.backends.azure_storage.AzureStorage',
            'OPTIONS': {
                'azure_container': 'static'
            },
        },
    }

    STATIC_URL = f'https://{AZURE_CUSTOM_DOMAIN}/static/'
    MEDIA_URL = f'https://{AZURE_CUSTOM_DOMAIN}/media/'
Enter fullscreen mode Exit fullscreen mode
  • Agregar configuración de logging de Django en settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'root': {
        'handlers': ['console'],
        'level': 'ERROR',  # Nivel de registro que se desea ver
    },
}
Enter fullscreen mode Exit fullscreen mode

Paso 2: Crear base de datos PostreSQL Flexible Server en Azure y conectar el proyecto

  • Aprovisionar una instancia de base de datos de PostgreSQL
  • Asegurarse de habilitar el check para permitir conexiones desde servicios Azure
  • Conectar desde el PGAdmin
  • Conectar el proyecto, aplicar migraciones y cargar datos iniciales

Paso 3: Crear una Azure Storage Account para los archivos media y static

  • Crear el azure storage account
  • En las configuraciones habilitarle el permiso para acceso anónimo
  • Crear dos blob containers: media y static con el nivel de permiso Anonymous Access Level -> Container

  • Colectar archivos estáticos con poetry run python manage.py collectstatic

Paso 4: Enviar todos los cambios pendientes al repositorio Github

git add .
git commit -m "Commit inicial"
git push origin main
Enter fullscreen mode Exit fullscreen mode

Paso 5: Desplegar una Azure WebApp

  • Crear una Azure Web App en la cual se vincule el código fuente del proyecto a través del repositorio Github

  • Enlazar la cuenta y el repo Github, habilitando la opción de despliegue continuo y autenticación básica

  • Crear y establecer las variables de entorno

  • Editar los jobs del workflow de Github Actions en base a la siguiente plantilla:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Set up Python version
        uses: actions/setup-python@v1
        with:
          python-version: '3.11'

      - name: Install Poetry
        run: pip install poetry

      - name: Create a virtual environment and install the dependencies
        run: poetry install

      - name: Upload artifact for deployment jobs
        uses: actions/upload-artifact@v3
        with:
          name: python-app
          path: .

  deploy:
    runs-on: ubuntu-latest
    needs: build
    environment:
      name: 'Production'
      url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}

    steps:
      - name: Download artifact from build job
        uses: actions/download-artifact@v3
        with:
          name: python-app
          path: .

      - name: 'Deploy to Azure Web App'
        uses: azure/webapps-deploy@v2
        id: deploy-to-webapp
        with:
          app-name: 'change-app-name'
          slot-name: 'Production'
          publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_F17335B111134CAAA9F88E8CBAF0E7DB }}
Enter fullscreen mode Exit fullscreen mode

Y listo, de esta manera cada vez que se hagan confirmaciones en el repositorio se desplegarán los cambios de forma automática.

Top comments (0)