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

# Aggiornare CaseBender

> Aggiorna in sicurezza il tuo deployment di CaseBender all'ultima versione senza perdere dati, licenze o credenziali.

## Panoramica

CaseBender viene distribuito come un insieme di immagini di container
versionate. Aggiornare significa scaricare le ultime immagini e ricreare i
container. I tuoi dati, la licenza e la configurazione risiedono in **volumi
Docker con nome** e nel tuo file **`.env`** — entrambi vengono conservati durante
gli aggiornamenti, quindi un aggiornamento non tocca mai i tuoi casi, utenti,
credenziali o licenza finché li mantieni.

<Note>
  Le migrazioni del database e il seeding dei dati predefiniti vengono eseguiti
  automaticamente all'avvio dopo ogni aggiornamento. Non è necessario eseguire
  manualmente alcun comando di migrazione.
</Note>

## Cosa viene conservato durante gli aggiornamenti

| Cosa                               | Dove risiede               | Conservato da              |
| ---------------------------------- | -------------------------- | -------------------------- |
| Casi, avvisi, utenti, impostazioni | PostgreSQL                 | volume `pgdata`            |
| Chiave segreta di licenza + blob   | `/app/apps/web/app/secret` | volume `casebender_secret` |
| File caricati / allegati           | MinIO                      | volume `miniodata`         |
| Stato di coda / cache              | Redis                      | volume `redis_data`        |
| Configurazione dell'ambiente       | `.env`                     | il tuo file `.env`         |

<Warning>
  Non eseguire mai `docker compose down -v` su un sistema di produzione. L'opzione
  `-v` elimina tutti i volumi con nome — il database, la licenza e i file. Senza
  quei volumi, il successivo avvio crea un database nuovo, il che reimposta la
  password amministratore al valore predefinito e rigenera la licenza.
</Warning>

## Procedura di aggiornamento (Docker Compose)

<Steps>
  <Step title="Esegui il backup del database e del .env">
    ```bash theme={null}
    # Backup di PostgreSQL
    docker compose exec -T db pg_dump -U superadmin casebender > casebender-backup-$(date +%F).sql

    # Conserva una copia della configurazione
    cp .env .env.backup
    ```
  </Step>

  <Step title="Scarica le ultime immagini">
    ```bash theme={null}
    docker compose pull
    ```
  </Step>

  <Step title="Ricrea i container">
    ```bash theme={null}
    docker compose up -d
    ```

    Compose ricrea solo i servizi la cui immagine è cambiata e conserva i tuoi volumi.
  </Step>

  <Step title="Osserva i log">
    ```bash theme={null}
    docker compose logs -f app
    ```

    Le migrazioni e il seeding vengono eseguiti all'avvio — attendi che
    l'applicazione risulti integra (healthy).
  </Step>
</Steps>

## Verifica dopo l'aggiornamento

* Accedi e verifica che i casi, gli avvisi e gli utenti esistenti siano presenti.
* Verifica che il login funzioni ancora (la password amministratore è invariata).
* Controlla che il worker stia elaborando i job:

```bash theme={null}
docker compose logs worker | tail
```

## Rollback

Se qualcosa va storto, fissa il tag dell'immagine precedente e ripristina il backup:

```bash theme={null}
# Fissa la versione nota come stabile in docker-compose.yml, ad es.
#   image: casebender/casebender:vX.Y.Z
docker compose pull
docker compose up -d

# Se necessario, ripristina il backup del database
cat casebender-backup-YYYY-MM-DD.sql | docker compose exec -T db psql -U superadmin casebender
```

<Note>
  Aggiorna sempre prima un ambiente di staging ed esegui un backup recente del
  database subito prima di aggiornare la produzione.
</Note>

## Errori comuni durante l'aggiornamento

I due problemi più comuni derivano entrambi dalla perdita dello stato:

* **Cambiare il nome del progetto o la directory di Compose.** Docker deriva i nomi
  dei volumi dal progetto. Rinominare la cartella o usare un nome di progetto `-p`
  diverso fa puntare Compose a volumi *nuovi e vuoti*. Aggiorna sempre dalla stessa
  directory/progetto per riutilizzare i volumi esistenti.
* **`LICENSE_SECRET_KEY` mancante e nessun volume `casebender_secret`.** Nei
  deployment più vecchi senza il volume del segreto persistente, imposta
  `LICENSE_SECRET_KEY` in `.env` (o aggiungi il volume) affinché la licenza
  sopravviva. I deployment attuali la conservano automaticamente.

## Installer desktop

Se hai eseguito il deployment con l'Installer desktop, usa il flusso di
aggiornamento integrato dell'app — scarica le ultime immagini e ricrea i servizi
preservando la directory dei dati, il `.env` e la chiave di licenza.

## Google Cloud Run

Gli aggiornamenti su Cloud Run distribuiscono una nuova revisione. Poiché Cloud
Run ha un filesystem effimero, il segreto della licenza deve essere fornito
tramite **Secret Manager** come `LICENSE_SECRET_KEY` affinché persista tra le
revisioni. Ridistribuisci usando la tua istanza Cloud SQL e i segreti esistenti:

```bash theme={null}
gcloud run deploy casebender-web --image <nuova-immagine> --region <regione>
```

Le migrazioni vengono eseguite automaticamente sulla nuova revisione.
