# Runbook: istanza VTE “demo 30 giorni” (stesso schema di vteguzzini)

Documento unico con tutti i passi per clonare un’installazione, configurare tema/contdown trial e teardown automatico. Sostituisci i segnaposto `NUOVO`, `sorgente.example`, `db`, ecc. con i valori del cliente (es. `vteguzzini`, `vtesmau`, `vteguzzini`).

---

## 0. Prerequisiti

- Spazio su disco sufficiente (copia file + dump DB raddoppiano l’ingombro).
- DNS: record `A` (o `CNAME`) per `NUOVO.mypantarei.net` verso il server.
- MySQL: utente con `CREATE DATABASE`, `GRANT`, `mysqldump` sulla sorgente (es. `gabry` con privilegi ampi) oppure `root` via socket.
- Apache con mod_ssl; accesso a `/etc/apache2/sites-available` (di solito `root`).
- Strumenti: `php`, `sass` (Ruby) per `php themes/next22/compile.sh`, opzionalmente `certbot`.

---

## 1. Clonare i file applicativi

```bash
# Esempio: sorgente vtesmau → /var/www/html/NUOVO
sudo rsync -a /var/www/html/vtesmau/ /var/www/html/NUOVO/
# oppure: sudo cp -a /var/www/html/vtesmau /var/www/html/NUOVO

sudo chown -R www-data:www-data /var/www/html/NUOVO
# (oppure, se non si usa chown: permessi gruppo www-data e chmod come da policy server)
```

---

## 2. Database MySQL

```sql
CREATE DATABASE NOME_DB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'utente_demo'@'localhost' IDENTIFIED BY 'password_forte';
GRANT ALL PRIVILEGES ON NOME_DB.* TO 'utente_demo'@'localhost';
FLUSH PRIVILEGES;
```

Import dati:

```bash
mysqldump -u SORGENTE_USER -p --single-transaction --routines --triggers vtesmau \
  | mysql -u SORGENTE_USER -p NOME_DB
```

---

## 3. `config.inc.php` (root istanza)

Aggiornare almeno:

| Variabile | Esempio |
|-----------|---------|
| `$dbconfig['db_username']` | `utente_demo` |
| `$dbconfig['db_password']` | password scelta |
| `$dbconfig['db_name']` | `NOME_DB` |
| `$site_URL` | `https://NUOVO.mypantarei.net` (no slash finale) |
| `$root_directory` | `/var/www/html/NUOVO/` |
| `$PORTAL_URL` | `https://NUOVO.mypantarei.net/portal` |
| `$gdpr_URL` | `https://NUOVO.mypantarei.net/gdpr` |
| email di sistema (`$HELPDESK_*`, `$REMINDER_*`) | es. `NUOVO@mypantarei.net` |
| `$application_unique_key` | stringa esadecimale **nuova e univoca** per istanza |
| `$csrf_secret` | stringa **nuova e univoca** |

Includere (subito dopo `vteversion.php` o in testa sezione coerente):

```php
if (file_exists(__DIR__ . '/trial_settings.php')) {
    require_once __DIR__ . '/trial_settings.php';
}
if (!isset($trial_expiry_date)) {
    $trial_expiry_date = '';
}
```

File [`trial_settings.php`](file:///var/www/html/vteguzzini/trial_settings.php) in radice istanza:

```php
<?php
$trial_expiry_date = 'AAAA-MM-GG'; // fine inclusiva, Y-m-d; '' = nessun countdown
```

(Proroga = solo cambiare questa data.)

---

## 4. Apache: virtual host

**Opzione A (consigliata):** file dedicati `NUOVO.conf` e `NUOVO-le-ssl.conf` (come da piano originale), `a2ensite`, `reload`.

**Opzione B (come su guzzini su questo server):** aggiungere i blocchi a file già presenti (es. `vtesmau.conf`) — meno portabile, richiede attenzione in sed/backup.

Ogni istanza deve avere:

- `VirtualHost *:80` con `ServerName NUOVO.mypantarei.net`, `DocumentRoot` → cartella istanza, regole per ACME (`.well-known`) e poi redirect a HTTPS.
- `VirtualHost *:443` con stesso `ServerName`, certificati SSL, `DocumentRoot` e `<Directory>` con `AllowOverride All`.

Dopo le modifiche: `sudo apache2ctl configtest` e `sudo systemctl reload apache2`.

---

## 5. Certificato Let’s Encrypt

Con DNS che punta al server:

```bash
sudo certbot certonly --webroot -w /var/www/html -d NUOVO.mypantarei.net
# oppure plugin apache, secondo politica del server
```

Poi riferire in SSL:

`SSLCertificateFile` / `SSLCertificateKeyFile` sotto `/etc/letsencrypt/live/NUOVO.mypantarei.net/`

---

## 6. Tema `next22` (brand e login)

1. **Override colori** in `themes/next22/scss/vars/_sdk_overrides.php` e/o [`_colors.scss`](file:///var/www/html/vteguzzini/themes/next22/scss/vars/_colors.scss) (palette cliente: primario `#282828`, accento testi/titoli `#b20d2a`, testi record in nero `rgba(0,0,0,0.87)` ecc.).
2. **Detail view** [ `_detailview.scss` ](file:///var/www/html/vteguzzini/themes/next22/scss/_detailview.scss): `.dvHeaderText` con `$vte-text-record` (nero); `.dvInnerHeaderTitle` con `$vte-text-title` (rosso).
3. **Login**  
   - Copiare in `themes/next22/scss/` un [`style_login.scss`](file:///var/www/html/vteguzzini/themes/next22/scss/style_login.scss) che sovrascrive il parent e forza colore su focus/valid/autofill per label e icone.  
4. Eseguire **compilazione tema**:

```bash
cd /var/www/html/NUOVO/themes/next22 && php compile.sh
```

---

## 7. Countdown trial (login + barra in alto)

1. **Helper:** [`include/utils/TrialCountdown.php`](file:///var/www/html/vteguzzini/include/utils/TrialCountdown.php) — calcolo giorni, variabili Smarty, `TRIAL_EXPIRED` dopo la scadenza (solo informativo, nessun blocco accesso).
2. **Chiamate PHP:**
   - In [`modules/Users/Login.php`](file:///var/www/html/vteguzzini/modules/Users/Login.php) prima del `display`: `require_once` + `TrialCountdown::assignSmartyVars($smarty)`.
   - In [`include/utils/PageHeader.php`](file:///var/www/html/vteguzzini/include/utils/PageHeader.php) in `initSmarty`, prima del `return $smarty` (solo copia istanza, non condividere con altre installazioni se non voluto).
3. **Template:**
   - [`Smarty/templates/themes/next/Login.tpl`](file:///var/www/html/vteguzzini/Smarty/templates/themes/next/Login.tpl) — blocco sotto al logo, `{if isset($TRIAL_COUNTDOWN_ACTIVE) && $TRIAL_COUNTDOWN_ACTIVE}`.
   - [`Smarty/templates/themes/next22/header/MainHeader.tpl`](file:///var/www/html/vteguzzini/Smarty/templates/themes/next22/header/MainHeader.tpl) — badge a destra.
4. **Stili:** [`themes/next22/scss/_trial_countdown.scss`](file:///var/www/html/vteguzzini/themes/next22/scss/_trial_countdown.scss) e `@import` in [`_vte_style.scss`](file:///var/www/html/vteguzzini/themes/next22/scss/_vte_style.scss) — poi di nuovo `php compile.sh`.

Testi usati: `Demo - N giorni rimanenti` / `Demo - periodo scaduto` (adattabili).

---

## 8. Permessi upload e runtime

- Cartelle: `cache/`, `storage/`, `tmp/`, `Smarty/templates_c/`, `cache/upload/`, ecc. scrivibili da `www-data` (es. `chown -R www-data:www-data` o `chgrp` + `chmod g+rwX`, eventuale `chmod g+s` su directory di scrittura condivisa).

---

## 9. Teardown automatico alla scadenza

- Script **fuori** dalla cartella istanza, es. [`/var/www/html/vteguzzini_destroy_trial.sh`](file:///var/www/html/vteguzzini_destroy_trial.sh) (per un’altra demo copiarlo e sostituire: path cartella, nomi `vtesmau.conf` se usati, `ServerName`, `DB`/`utente` MySQL, path cert e log).
- Lo script: legge `trial_settings.php`, confronta `Y-m-m-d` con oggi, esegue a partire dalle 23:59, blocca doppia esecuzione con lock, poi `DROP DATABASE`, `DROP USER`, strip VirtualHost, `rm -rf` cartella, `certbot delete` / pulizia cert locali, `reload` Apache.
- **Crontab root** consigliata:

```cron
59 23 * * * /bin/bash /var/www/html/NOME_ISTANZA_destroy_trial.sh >>/var/log/NOME-istanza-trial-destroy.log 2>&1
```

- **MySQL per distruzione:** `mysql -u root` o file `/root/.NOME-destroy.cnf` con `[client]` user/password, `chmod 600`.

Dopo la prima esecuzione, **rimuovere la riga dal crontab** se non serve più.

---

## 10. (Opzionale) Voce menu `LBL_MODULE_COLORS` rotta

Se in Impostazioni compare la chiave non tradotta, rimuovere la riga in `vte_settings_field` (nome `LBL_MODULE_COLORS`) per quell’istanza DB.

---

## 11. Checklist riepilogativa

- [ ] Clona directory e permessi  
- [ ] Crea DB + utente + import dump  
- [ ] `config.inc.php` + `trial_settings.php` + `require`  
- [ ] `TrialCountdown` + `Login.php` + `PageHeader`  
- [ ] Template Login + `MainHeader` + SCSS trial + `compile.sh`  
- [ ] Tema (colori, `style_login`, `_detailview` se serve) + `compile.sh`  
- [ ] vhost HTTP/HTTPS + SSL + reload  
- [ ] `trial_destroy.sh` + cron root + CNF MySQL opzionale  
- [ ] Test login, conteggio giorni, messaggio in header  
- [ ] (Opzionale) fix menu `LBL_MODULE_COLORS`  

---

*Riferimento istanza di esempio: `/var/www/html/vteguzzini` (maggio 2026).*
