> ## Documentation Index
> Fetch the complete documentation index at: https://docs.casebender.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Distribuzione su Azure

> Distribuisci CaseBender su Microsoft Azure

## Panoramica

Questa guida ti accompagna attraverso la distribuzione di CaseBender su Azure utilizzando immagini Docker precostruite con Azure Container Apps e servizi gestiti.

## Prerequisiti

1. [Account Azure](https://azure.microsoft.com/)
2. [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) installato
3. [Docker](https://docs.docker.com/get-docker/) installato

## Passo 1: Configurazione Iniziale

### Installa e Configura Azure CLI

<CodeGroup>
  ```bash macOS theme={null}
  # Usando Homebrew
  brew install azure-cli

  # Accedi ad Azure
  az login

  # Configura Docker per ACR
  az acr login --name casebenderacr
  ```

  ```bash Linux theme={null}
  # Installa Azure CLI
  curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

  # Accedi ad Azure
  az login

  # Configura Docker per ACR
  az acr login --name casebenderacr
  ```

  ```powershell Windows theme={null}
  # Usando winget
  winget install -e --id Microsoft.AzureCLI

  # Accedi ad Azure
  az login

  # Configura Docker per ACR
  az acr login --name casebenderacr
  ```
</CodeGroup>

### Inizializza Progetto

```bash theme={null}
# Imposta variabili
RESOURCE_GROUP="casebender-rg"
LOCATION="eastus"

# Crea gruppo di risorse
az group create --name $RESOURCE_GROUP --location $LOCATION

# Abilita servizi richiesti
az provider register --namespace Microsoft.ContainerRegistry
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.Storage
```

## Passo 2: Configura l'Infrastruttura Azure

### Crea Account di Storage

```bash theme={null}
# Crea account di storage
az storage account create \
  --name casebenderstorage \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --sku Standard_LRS \
  --encryption-services blob

# Crea container blob
az storage container create \
  --name casebender \
  --account-name casebenderstorage \
  --auth-mode key \
  --public-access off

# Ottieni chiave account di storage
STORAGE_KEY=$(az storage account keys list \
  --account-name casebenderstorage \
  --resource-group $RESOURCE_GROUP \
  --query '[0].value' -o tsv)

# Crea identità gestita per accesso storage
az identity create \
  --name casebender-storage-identity \
  --resource-group $RESOURCE_GROUP

# Ottieni ID identità gestita
IDENTITY_ID=$(az identity show \
  --name casebender-storage-identity \
  --resource-group $RESOURCE_GROUP \
  --query id -o tsv)

# Assegna ruolo Storage Blob Data Contributor
az role assignment create \
  --assignee-object-id $(az identity show --name casebender-storage-identity --resource-group $RESOURCE_GROUP --query principalId -o tsv) \
  --role "Storage Blob Data Contributor" \
  --scope $(az storage account show --name casebenderstorage --resource-group $RESOURCE_GROUP --query id -o tsv)
```

### Configura Azure Database per PostgreSQL

```bash theme={null}
# Crea server PostgreSQL
az postgres flexible-server create \
  --resource-group $RESOURCE_GROUP \
  --name casebender-db \
  --admin-user superadmin \
  --admin-password <your-secure-password> \
  --sku-name Standard_B2s \
  --storage-size 32 \
  --version 14

# Crea database
az postgres flexible-server db create \
  --resource-group $RESOURCE_GROUP \
  --server-name casebender-db \
  --database-name casebender
```

### Configura Azure Cache per Redis

```bash theme={null}
# Crea cache Redis
az redis create \
  --resource-group $RESOURCE_GROUP \
  --name casebender-redis \
  --sku Basic \
  --vm-size c0 \
  --location $LOCATION
```

## Passo 3: Crea e Configura Container Registry

```bash theme={null}
# Crea Azure Container Registry
az acr create \
  --resource-group $RESOURCE_GROUP \
  --name casebenderacr \
  --sku Standard \
  --admin-enabled true

# Ottieni credenziali registry
ACR_USERNAME=$(az acr credential show --name casebenderacr --query username -o tsv)
ACR_PASSWORD=$(az acr credential show --name casebenderacr --query "passwords[0].value" -o tsv)

# Scarica immagini CaseBender
docker pull casebender/casebender:latest
docker pull casebender/workflow-processor:latest
docker pull casebender/misp-processor:latest

# Tagga immagini per ACR
docker tag casebender/casebender:latest casebenderacr.azurecr.io/casebender/app:latest
docker tag casebender/workflow-processor:latest casebenderacr.azurecr.io/casebender/workflow-processor:latest
docker tag casebender/misp-processor:latest casebenderacr.azurecr.io/casebender/misp-processor:latest

# Carica immagini su ACR
docker push casebenderacr.azurecr.io/casebender/app:latest
docker push casebenderacr.azurecr.io/casebender/workflow-processor:latest
docker push casebenderacr.azurecr.io/casebender/misp-processor:latest
```

## Passo 4: Distribuisci Servizi

### Crea Ambiente Container Apps

```bash theme={null}
# Crea ambiente Container Apps
az containerapp env create \
  --name casebender-env \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION

# Crea applicazione principale
az containerapp create \
  --name casebender-app \
  --resource-group $RESOURCE_GROUP \
  --environment casebender-env \
  --image casebenderacr.azurecr.io/casebender/app:latest \
  --target-port 3000 \
  --ingress external \
  --registry-server casebenderacr.azurecr.io \
  --registry-username $ACR_USERNAME \
  --registry-password $ACR_PASSWORD \
  --user-assigned-identity $IDENTITY_ID \
  --env-vars \
    AUTH_SECRET=<your-auth-secret> \
    AUTH_SALT=<your-auth-salt> \
    POSTGRES_PRISMA_URL="postgresql://superadmin:<password>@casebender-db.postgres.database.azure.com:5432/casebender" \
    REDIS_URL="redis://casebender-redis.redis.cache.windows.net:6380?ssl=true&password=<redis-key>" \
    AZURE_STORAGE_ACCOUNT="casebenderstorage" \
    AZURE_STORAGE_CONTAINER="casebender" \
    AZURE_STORAGE_CONNECTION_STRING="DefaultEndpointsProtocol=https;AccountName=casebenderstorage;AccountKey=${STORAGE_KEY};EndpointSuffix=core.windows.net"

# Crea processore workflow
az containerapp create \
  --name workflow-processor \
  --resource-group $RESOURCE_GROUP \
  --environment casebender-env \
  --image casebenderacr.azurecr.io/casebender/workflow-processor:latest \
  --registry-server casebenderacr.azurecr.io \
  --registry-username $ACR_USERNAME \
  --registry-password $ACR_PASSWORD \
  --min-replicas 1 \
  --max-replicas 1 \
  --env-vars \
    POSTGRES_PRISMA_URL="postgresql://superadmin:<password>@casebender-db.postgres.database.azure.com:5432/casebender" \
    REDIS_URL="redis://casebender-redis.redis.cache.windows.net:6380?ssl=true&password=<redis-key>"

# Crea processore MISP
az containerapp create \
  --name misp-processor \
  --resource-group $RESOURCE_GROUP \
  --environment casebender-env \
  --image casebenderacr.azurecr.io/casebender/misp-processor:latest \
  --registry-server casebenderacr.azurecr.io \
  --registry-username $ACR_USERNAME \
  --registry-password $ACR_PASSWORD \
  --min-replicas 1 \
  --max-replicas 1 \
  --env-vars \
    POSTGRES_PRISMA_URL="postgresql://superadmin:<password>@casebender-db.postgres.database.azure.com:5432/casebender" \
    REDIS_URL="redis://casebender-redis.redis.cache.windows.net:6380?ssl=true&password=<redis-key>"
```

## Passo 5: Configura Azure Front Door

```bash theme={null}
# Crea profilo Front Door
az afd profile create \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP \
  --sku Standard_AzureFrontDoor

# Crea endpoint
az afd endpoint create \
  --endpoint-name casebender \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP

# Crea gruppo di origine
az afd origin-group create \
  --origin-group-name casebender-origin-group \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP \
  --probe-path "/" \
  --probe-protocol Http \
  --probe-request-type GET

# Aggiungi origine
az afd origin create \
  --origin-group-name casebender-origin-group \
  --origin-name casebender-origin \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP \
  --host-name <your-container-app-url> \
  --origin-host-header <your-container-app-url> \
  --priority 1 \
  --weight 1000 \
  --enabled-state Enabled
```

## Passo 6: Configura Dominio Personalizzato (Opzionale)

```bash theme={null}
# Aggiungi dominio personalizzato a Front Door
az afd custom-domain create \
  --custom-domain-name casebender-domain \
  --host-name your-domain.com \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP \
  --minimum-tls-version TLS12

# Abilita HTTPS
az afd custom-domain enable-https \
  --custom-domain-name casebender-domain \
  --profile-name casebender-afd \
  --resource-group $RESOURCE_GROUP
```

## Monitoraggio e Manutenzione

### Configura Application Insights

```bash theme={null}
# Crea Application Insights
az monitor app-insights component create \
  --app casebender-insights \
  --location $LOCATION \
  --resource-group $RESOURCE_GROUP \
  --application-type web

# Ottieni chiave di strumentazione
az monitor app-insights component show \
  --app casebender-insights \
  --resource-group $RESOURCE_GROUP \
  --query instrumentationKey \
  --output tsv
```

### Configura Avvisi

```bash theme={null}
# Crea gruppo di azioni
az monitor action-group create \
  --name casebender-alerts \
  --resource-group $RESOURCE_GROUP \
  --action email admin email@yourdomain.com

# Crea regola di avviso
az monitor metrics alert create \
  --name "high-cpu-usage" \
  --resource-group $RESOURCE_GROUP \
  --scopes <container-app-resource-id> \
  --condition "avg CPU > 80" \
  --window-size 5m \
  --evaluation-frequency 1m \
  --action <action-group-id>
```

### Visualizza Log

```bash theme={null}
# Visualizza log container app
az containerapp logs show \
  --name casebender-app \
  --resource-group $RESOURCE_GROUP \
  --follow
```

## Configurazione Scalabilità

```bash theme={null}
# Configura regole di scalabilità
az containerapp update \
  --name casebender-app \
  --resource-group $RESOURCE_GROUP \
  --min-replicas 1 \
  --max-replicas 10 \
  --scale-rule-name http-rule \
  --scale-rule-type http \
  --scale-rule-http-concurrency 50
```

## Backup e Disaster Recovery

### Configura Backup Database

```bash theme={null}
# Abilita backup automatici
az postgres flexible-server update \
  --resource-group $RESOURCE_GROUP \
  --name casebender-db \
  --backup-retention 7
```

### Configura Geo-Replicazione

```bash theme={null}
# Crea risorse regione secondaria
az postgres flexible-server replica create \
  --name casebender-db-secondary \
  --source-server casebender-db \
  --resource-group $RESOURCE_GROUP \
  --location westus
```

## Migliori Pratiche di Sicurezza

1. Abilita Azure Defender per tutti i servizi
2. Implementa Azure Private Link
3. Usa Identità Gestite
4. Valutazioni di sicurezza regolari
5. Abilita logging diagnostico

## Ottimizzazione dei Costi

1. Usa piano consumption per Container Apps
2. Implementa regole di auto-scaling
3. Scegli livelli di servizio appropriati
4. Monitora pattern di utilizzo
5. Usa Istanze Riservate Azure

## Prossimi Passi

* Configura CI/CD con Azure DevOps
* Implementa monitoraggio completo
* Configura disaster recovery
* Rivedi conformità di sicurezza
