Gestión de Entidades en la DPE (parte 5 - despliegue)
Published: 2024-04-30 22:54:43

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

**Paso 1: Aprovisionamiento e inicialización de la base de datos PostgreSQL**

- Crear base de datos PostreSQL Flexible Server en Azure y asegurarse de habilitar el check para permitir conexiones desde servicios Azure, así como habilitar la IP Pública en el firewall para las conexiones desde PGADMIN.

- Conectarse a la base PostgreSQL vía PGADMIN con las credenciales creadas y crear la base de datos `gestor_entidades`.

- Conectar a la base de datos desde el proyecto Django (reemplazando las variables de conexión) y aplicar migraciones `poetry run python manage.py migrate`

- Aplicar scripts con carga de archivos de data inicial:
```
poetry run python manage.py runscript tipos_organizaciones_feeder
poetry run python manage.py runscript tipos_entidades_feeder
poetry run python manage.py runscript funciones_feeder
poetry run python manage.py runscript ambitos_accion_feeder
poetry run python manage.py runscript tipos_gad_feeder
poetry run python manage.py runscript zonales_feeder
poetry run python manage.py runscript provincia_feeder
poetry run python manage.py runscript canton_feeder
poetry run python manage.py runscript parroquia_feeder
```

- Crear superuser `poetry run python manage.py createsuperuser`

**Paso 2: Configurar proyecto Django para pase a producción**

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

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

```
DEBUG
ALLOWED_HOSTS
CSRF_TRUSTED_ORIGINS
AZURE_ACCOUNT_NAME
AZURE_ACCOUNT_KEY
AZURE_CUSTOM_DOMAIN
```

```
DEBUG = env('DEBUG') == 'True'
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
CSRF_TRUSTED_ORIGINS = env.list('CSRF_TRUSTED_ORIGINS')

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/'
```

- 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
    },
}
```

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

**Paso 3: Enviar todos los cambios pendientes al repositorio Github**

```
git add .
git commit -m "Commit inicial"
git push origin main
```
**Paso 4: 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

**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 }}
```

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