# Rilascio in produzione

## Requisiti hosting

- PHP 8.2 o successivo
- MySQL 8 o MariaDB compatibile
- estensioni PHP richieste da Laravel e Dompdf
- Apache con `mod_rewrite`
- HTTPS
- cron ogni minuto
- possibilità di impostare la document root sulla cartella `public`
- Node.js e Chrome/Chromium solo per la risoluzione automatica dei post Instagram

## Creazione pacchetto

```bash
./scripts/build-production-release.sh
```

Lo script esegue validazione, audit, build, Pint e test; crea in `release/` una cartella pronta al caricamento e il relativo archivio ZIP. Non include `.env`, repository Git, test, log, cache, backup o file caricati dagli utenti.

## Cartella da pubblicare

Caricare l’intera cartella `release/francoach-production-*` fuori dalla cartella pubblica dell’hosting. Impostare come document root del dominio esclusivamente:

```text
/percorso/francoach-production-*/public
```

Se il provider obbliga a usare `public_html`, caricare l’applicazione completa fuori da `public_html`, copiare dentro `public_html` solo il contenuto della cartella `public` e adeguare i due percorsi di `index.php` come descritto in `DEPLOYMENT_APACHE.md`.

## Prima installazione

```bash
cp .env.example .env
php artisan key:generate
php artisan migrate --force
php artisan db:seed --force
php artisan storage:link
php artisan optimize
```

Prima dei comandi configurare dominio, database, SMTP, storage, backup e credenziali seed nel `.env`. Dopo il seed rimuovere `SEED_COACH_PASSWORD`.

Rendere scrivibili dall’utente PHP soltanto `storage/` e `bootstrap/cache/`. Impostare il cron:

```cron
* * * * * cd /percorso/francoach-production-* && /usr/bin/php artisan schedule:run >> storage/logs/scheduler.log 2>&1
```

## Aggiornamenti

```bash
php artisan down
php artisan migrate --force
php artisan optimize:clear
php artisan optimize
php artisan up
```

Eseguire prima un backup di database e file. Non sostituire il `.env` di produzione e non sovrascrivere `storage/app`.
