# Déploiement IONOS

## 1. Préparer la base

1. Créer une base MySQL ou MariaDB dans l'espace IONOS.
2. Forcer `utf8mb4` et une collation Unicode.
3. Importer `database/schema.sql` avec phpMyAdmin ou le client MySQL.
4. Vérifier que les clés étrangères sont actives.
5. Ne pas importer d'anciens fichiers de tokens ou de cookies.

## 2. Préparer les fichiers

Téléverser le projet hors du dossier public quand IONOS le permet, puis définir la racine web sur :

```text
apps/web/public
```

Si l'offre ne permet pas de choisir la racine, placer uniquement le contenu public dans le webroot et adapter `FILYX_WEB_ROOT` vers le dossier privé. Ne jamais exposer `.env`, `database`, `legacy` ou `runtime`.

## 3. Configurer PHP

- PHP 8.2 recommandé ; le code reste compatible PHP 8.0+.
- Extensions : PDO MySQL, OpenSSL, cURL, JSON, mbstring, fileinfo.
- `display_errors=Off` en production.
- `log_errors=On` avec un fichier hors du webroot.
- Limite d'upload adaptée aux médias autorisés.

Copier `.env.example` vers `.env`, puis renseigner :

- `APP_URL`, `APP_KEY` aléatoire de 32 octets en hex ;
- accès MySQL ;
- expéditeur e-mail ;
- identifiants Google facultatifs ;
- identifiant et secret du worker.

## 4. Domaine et HTTPS

1. Pointer le domaine vers l'hébergement.
2. Activer le certificat TLS IONOS.
3. Forcer HTTPS.
4. Régler `SESSION_SECURE=true`.
5. Tester `/api/health`.

## 5. Connexion Google

Créer des identifiants OAuth Web chez Google avec uniquement :

```text
openid email profile
```

Ajouter exactement l'URI :

```text
https://votre-domaine/auth/google/callback
```

Ne pas activer de portée Gmail pour la connexion.

## 6. E-mails

Configurer l'expéditeur et vérifier :

- confirmation d'adresse ;
- réinitialisation de mot de passe ;
- notifications de sécurité.

Le transport `mail()` est prévu comme base. Un transport SMTP peut être ajouté sans modifier l'authentification.

## 7. Cron IONOS

Avec le gestionnaire de tâches cron IONOS, créer un appel HTTP GET toutes les
5 minutes vers :

```text
https://votre-domaine/api/cron/run?token=VOTRE_FILYX_CRON_TOKEN
```

Le jeton doit correspondre à `FILYX_CRON_TOKEN` et rester privé. Le verrou SQL
empêche deux exécutions concurrentes. Le cron prépare les minuteurs, nettoie
les nonces et marque les workers silencieux hors ligne. Le script CLI
`apps/web/cron/run.php` reste utilisable lorsqu'un accès Shell est disponible.

## 8. Permissions

- `.env` : lecture par le compte PHP uniquement ;
- `apps/web/storage` : écriture par PHP, sans exécution ;
- `legacy` : lecture seule ;
- `database` et `docs` : hors webroot ;
- uploads : validation MIME et extension, noms aléatoires.

## 9. Overlays

Créer une instance depuis le panel puis utiliser :

```text
https://votre-domaine/overlay/{instance}/{token}
```

Le token est long, haché en base et révocable. Une régénération invalide immédiatement l'ancienne URL.
