# Deploy OVHcloud per gym.fv.digital

## Struttura FTP

Caricare il contenuto del pacchetto in:

```text
/francoach/
```

Nel pannello OVHcloud aprire `Web Cloud > Hosting > Multisito`, aggiungere o modificare `gym.fv.digital` e impostare:

```text
Cartella di root: francoach/public
SSL: attivo
Log separati: attivi
```

La cartella completa dell’applicazione resta `/francoach`; soltanto `/francoach/public` è esposta dal dominio.

## PHP

Conservare una copia dell’eventuale `.ovhconfig` esistente, quindi caricare `deployment/ovh/.ovhconfig` nella root FTP `/`, non dentro `francoach/public`. La configurazione predisposta usa PHP 8.4, PHP-FPM, Stable64, modalità produzione e firewall OVHcloud.

## DNS e certificato

Nella zona DNS creare o verificare il record `A` di `gym.fv.digital` verso l’IPv4 indicato nella scheda `Informazioni generali` dell’hosting. Nel Multisito attendere diagnostica verde e attivare il certificato SSL.

## Ambiente

Creare `/francoach/.env` da `.env.example` e valorizzare:

```dotenv
APP_ENV=production
APP_DEBUG=false
APP_URL=https://gym.fv.digital
ASSET_URL=
DB_HOST=nome-server-database-ovh
DB_DATABASE=nome-database
DB_USERNAME=utente-database
DB_PASSWORD=password-database
SESSION_SECURE_COOKIE=true
MAIL_MAILER=smtp
MAIL_HOST=server-smtp
MAIL_USERNAME=utente-smtp
MAIL_PASSWORD=password-smtp
MAIL_FROM_ADDRESS=indirizzo-mittente
BACKUP_PATH=/homez.XXX/utente/backups/francoach
BACKUP_ENCRYPTION_PASSPHRASE=passphrase-lunga
```

Usare il nome server mostrato da OVHcloud per `DB_HOST`, non presumere `localhost`. Lasciare `ASSET_URL` vuoto perché il dominio punta direttamente a `public`.

## Installazione con SSH

```bash
cd ~/francoach
php artisan key:generate
php artisan migrate --force
php artisan db:seed --force
mkdir -p public/storage
cp storage/app/public/.htaccess public/storage/.htaccess
php artisan optimize
```

Configurare prima `SEED_COACH_EMAIL` e `SEED_COACH_PASSWORD`, quindi rimuovere la password seed dal `.env`.

OVHcloud non garantisce la creazione di symlink su ogni offerta. Configurare:

```dotenv
PUBLIC_STORAGE_PATH=/homez.XXX/utente/francoach/public/storage
PUBLIC_STORAGE_URL=https://gym.fv.digital/storage
```

Sostituire il percorso con quello assoluto mostrato dall’accesso FTP/SSH.

## Installazione senza SSH

Il pacchetto contiene già `vendor`, `public/build` e le dipendenze Node. Importare `database/schema/mysql-schema.sql` da phpMyAdmin. Per migration, seed e cache usare temporaneamente `deployment/one-time-install.php.example` secondo `DEPLOYMENT_APACHE.md`, quindi eliminare immediatamente script e token.

Creare via FTP `public/storage`, copiarvi `storage/app/public/.htaccess` e configurare `PUBLIC_STORAGE_PATH` e `PUBLIC_STORAGE_URL`.

## Cron OVHcloud

I cron dell’hosting condiviso OVHcloud possono essere eseguiti al massimo una volta all’ora. Nel pannello aprire `Altro > Cron` e creare:

| Script | Frequenza |
|---|---|
| `francoach/deployment/ovh/cron-hourly.php` | ogni ora |
| `francoach/deployment/ovh/cron-morning.php` | ogni giorno alle 07 |
| `francoach/deployment/ovh/cron-evening.php` | ogni giorno alle 21 |
| `francoach/deployment/ovh/cron-backup.php` | ogni giorno alle 02 |

Selezionare PHP 8.4 per ogni task. Non configurare anche `artisan schedule:run`, per evitare esecuzioni duplicate.

## Verifiche

```text
https://gym.fv.digital/up
https://gym.fv.digital/login
```

Verificare accesso coach e atleta, upload immagini, e-mail, PDF, backup e log cron. Controllare che `/.env`, `/vendor/` e `/storage/logs/` restituiscano 403 o 404.

La risoluzione Instagram tramite browser richiede Node.js e Chrome/Chromium disponibili come eseguibili. Sull’hosting condiviso standard potrebbe non essere disponibile; in tal caso resta utilizzabile la risoluzione HTTP, mentre il fallback browser richiede un servizio esterno o un hosting con runtime compatibile.
