# Archivio documenti

Gestionale web per file e cartelle personali, con tre ruoli:

| Ruolo | Cosa può fare |
|---|---|
| **Utente** (personale amministrativo) | Carica, crea cartelle, rinomina, sostituisce, modifica ed elimina **solo i propri file**. Non vede quelli degli altri. |
| **Protocollatore** | Vede e modifica i file **di tutto il personale**, consulta il registro attività. |
| **Amministratore di sistema** | Crea e gestisce gli account, consulta il registro. Ha un proprio spazio ma **non** vede i file altrui. |

Funzioni incluse: caricamento multiplo con trascinamento, sottocartelle, ricerca per nome, anteprima di PDF e immagini, modifica dei file di testo nel browser, **versioni precedenti** (ogni sostituzione o modifica conserva la copia vecchia, ripristinabile), **cestino** (le eliminazioni non cancellano davvero), **registro attività** con chi, cosa, quando e da quale IP.

## Tecnologie

Python 3 + Flask, database SQLite, Gunicorn come server applicativo, Nginx davanti. Nessun servizio esterno.

## Installazione su Ubuntu

1. Copia la cartella del progetto sul server (ad esempio con `scp` o `git`).
2. Dalla cartella del progetto:

   ```bash
   sudo bash deploy/install.sh
   ```

   Lo script installa i pacchetti, crea l'utente di sistema `gestionale`, copia l'app in `/opt/gestionale`, crea la cartella dati `/srv/gestionale/data`, genera la chiave segreta in `/etc/gestionale.env`, attiva il servizio systemd e configura Nginx.

3. Crea il primo amministratore:

   ```bash
   sudo -u gestionale env $(grep -v '^#' /etc/gestionale.env | xargs) \
     /opt/gestionale/venv/bin/flask --app /opt/gestionale/app.py crea-utente
   ```

4. Apri `http://indirizzo-del-server/` e accedi. Da **Utenti** crei gli account del personale e dei protocollatori.

### HTTPS (fortemente consigliato)

Le password viaggiano in rete: attiva HTTPS prima dell'uso reale.

- Server raggiungibile da internet con un dominio: `sudo apt install certbot python3-certbot-nginx && sudo certbot --nginx -d archivio.tuodominio.it`
- Server solo in rete interna: usa un certificato emesso dalla vostra CA interna e aggiungilo al blocco `server` di Nginx.

Poi imposta `GESTIONALE_HTTPS=1` in `/etc/gestionale.env` e `sudo systemctl restart gestionale`.

## Dove stanno i dati

```
/srv/gestionale/data/
├── gestionale.db        utenti e registro attività
├── spazi/u<ID>/         file di ciascun utente
├── versioni/u<ID>/      versioni precedenti dei file
└── cestino/u<ID>/       elementi eliminati, in sottocartelle con data e ora
```

Per recuperare un file dal cestino basta copiarlo dalla cartella `cestino/u<ID>/...` alla posizione originale in `spazi/u<ID>/...` (con `sudo -u gestionale cp`).

## Backup

Esegui il backup dell'intera cartella `/srv/gestionale/data`. Per il database usa la copia a caldo di SQLite, ad esempio con un cron notturno:

```bash
sqlite3 /srv/gestionale/data/gestionale.db ".backup '/backup/gestionale-$(date +%F).db'"
rsync -a /srv/gestionale/data/spazi /srv/gestionale/data/versioni /backup/
```

## Manutenzione

```bash
sudo systemctl status gestionale        # stato del servizio
sudo journalctl -u gestionale -f        # log in tempo reale
sudo bash deploy/install.sh             # aggiornamento dopo aver modificato il codice
```

Il cestino e le versioni non vengono svuotati automaticamente. Per eliminare ad esempio ciò che è più vecchio di 180 giorni:

```bash
sudo find /srv/gestionale/data/cestino /srv/gestionale/data/versioni -type f -mtime +180 -delete
```

## Configurazione (`/etc/gestionale.env`)

| Variabile | Significato |
|---|---|
| `GESTIONALE_DATA` | Cartella dati |
| `GESTIONALE_SECRET_KEY` | Chiave per firmare le sessioni (generata automaticamente, non condividerla) |
| `GESTIONALE_MAX_UPLOAD_MB` | Dimensione massima di un caricamento; aggiorna anche `client_max_body_size` in Nginx |
| `GESTIONALE_HTTPS` | `1` dopo aver attivato HTTPS (cookie di sessione solo su connessione sicura) |

## Sicurezza

- Password salvate con hash (Werkzeug, scrypt/pbkdf2), minimo 10 caratteri.
- Ogni percorso viene verificato lato server: un utente non può uscire dal proprio spazio nemmeno manipolando l'indirizzo.
- Protezione CSRF su tutti i moduli, intestazioni di sicurezza, cookie `HttpOnly`.
- Il servizio gira con un utente dedicato senza privilegi e può scrivere solo in `/srv/gestionale`.
- Consigliato: `fail2ban` su Nginx contro i tentativi di accesso ripetuti, e firewall (`ufw allow 'Nginx Full'`).

## Sviluppo in locale

```bash
python3 -m venv venv && . venv/bin/activate
pip install -r requirements.txt
export GESTIONALE_DATA=./dati-prova GESTIONALE_SECRET_KEY=sviluppo
flask --app app crea-utente
flask --app app run --debug
```
