# Installation de recette sur OVH — Studio 0.1.0

## 0. Statut de cette livraison

Il s’agit d’un projet source pour une première recette. Les dépendances PHP ne sont ni téléchargées ni verrouillées dans cette archive. La compatibilité d’exécution de votre environnement doit être vérifiée avant toute utilisation réelle. Le site vitrine WordPress reste séparé et inchangé.

**FTP seul ne suffit pas.** Il faut un accès SSH et Composer 2 pour cette installation, ou l’intervention d’un administrateur qui exécute ces étapes. Aucun installateur web demandant les mots de passe de la base n’est fourni.

Ne jamais publier un fichier de diagnostic `phpinfo()` ni transmettre vos identifiants dans une conversation.

## 1. Arborescence

Exemple si `studio` est créé à la racine de l’espace d’hébergement :

```text
studio/
├── .env                  # configuration privée, à créer sur le serveur
├── app/                  # logique métier
├── artisan
├── bootstrap/
├── composer.json
├── composer.lock         # créé lors de la première résolution Composer
├── config/
├── database/
├── public/               # SEUL dossier racine de studio.la-scep.fr
│   ├── index.php
│   ├── .htaccess
│   ├── assets/
│   └── sw.js
├── resources/
├── routes/
├── storage/              # sessions, journaux et fichiers privés
├── tests/
└── vendor/               # créé par Composer
```

Dans la configuration du sous-domaine, utiliser **`studio/public`** si c’est bien le chemin relatif correspondant à votre arborescence. Adapter le chemin si le dossier se trouve ailleurs. Ne pas pointer le domaine vers `studio/`, ne pas déplacer `index.php` et ne pas copier l’application entière dans le dossier public du site vitrine.

Ne pas créer de lien `public/storage` : les téléchargements sont servis après contrôle des droits.

## 2. Préparer le serveur

Créer le sous-domaine, son certificat HTTPS et une base distincte de WordPress. PHP **8.3 minimum** en web **et** en ligne de commande. Vérifier explicitement les deux versions ; un réglage OVH pour le site ne change pas nécessairement la commande `php` en SSH.

Extensions : Ctype, cURL, DOM, Fileinfo, GD, Mbstring, OpenSSL, PDO, PDO MySQL, XML, ainsi que les extensions usuelles PHP. `pdo_sqlite` est nécessaire pour la suite PHPUnit isolée, pas pour l’exploitation MySQL.

Commencer par le diagnostic sans dépendances :

```bash
cd /CHEMIN_REEL/studio
php -v
php tools/check.php
```

Les chemins en majuscules sont à remplacer. Si le binaire `php` n’est pas la bonne version, employer le binaire correct disponible sur votre hébergement pour toutes les commandes et Composer. Ne pas contourner les contrôles avec `--ignore-platform-reqs`.

Prévoir que PHP puisse écrire dans `storage/` et `bootstrap/cache/`. Ajuster le propriétaire/groupe et les permissions selon l’hébergement, **pas de `chmod 777`**. Les fichiers de configuration ne doivent pas être lisibles par d’autres comptes. Le dossier `storage` ne doit jamais être servi directement par le site.

## 3. Créer la configuration privée

```bash
cp .env.example .env
```

Modifier `.env` côté serveur :

```dotenv
APP_ENV=production
APP_DEBUG=false
APP_URL=https://studio.la-scep.fr
APP_TIMEZONE=Europe/Paris
DB_CONNECTION=mysql
DB_HOST=VOTRE_HOTE_DE_BASE
DB_PORT=VOTRE_PORT
DB_DATABASE=VOTRE_BASE
DB_USERNAME=VOTRE_UTILISATEUR
DB_PASSWORD="VOTRE_MOT_DE_PASSE"
SESSION_SECURE_COOKIE=true
CLIENT_PORTAL_ENABLED=false
AI_PROVIDER=none
```

Garder les secrets exclusivement dans ce fichier. Ne pas les commiter dans Git. Mettre les mots de passe entre guillemets et respecter les échappements du format dotenv. Une éventuelle connexion TLS à la base se configure avec `MYSQL_ATTR_SSL_CA` si votre service l’exige.

Le système conserve les horodatages techniques en UTC et présente les créneaux en heure de Paris. Les dates d’échéance sont des dates, sans heure.

## 4. Installer et verrouiller les dépendances en recette

```bash
composer update --prefer-dist
composer validate
composer audit
php artisan key:generate --force
```

C’est une **première résolution**, car l’archive ne contient pas de lock. Conserver et versionner le `composer.lock` créé. Une erreur Composer bloque la suite : ne pas modifier au hasard les contraintes de version. Les installations suivantes devront réutiliser le même lock avec `composer install`.

`APP_KEY` doit ensuite rester stable et être sauvegardée séparément avec les secrets. Ne pas régénérer cette clé à chaque mise à jour : elle protège notamment les sessions chiffrées.

## 5. Lancer les tests avant d’utiliser de vraies données

```bash
php tools/test-core.php
php vendor/bin/phpunit
```

Les tests PHPUnit utilisent une base SQLite **en mémoire**, avec `APP_ENV=testing` et des identifiants fictifs. Ils ne doivent jamais être redirigés vers votre base réelle. Ne pas exécuter les tests après avoir mis en cache la configuration de production : lancer `php artisan config:clear` avant une session de recette.

La suite comprend 30 méthodes PHPUnit (authentification, rôles, fichiers privés, logos, invitations, tâches, calculs, non-duplication du temps et assistant simulé). Elle est **fournie mais non exécutée dans l’environnement de livraison**. Les scénarios HTTP désactivent normalement la vérification CSRF comme le fait le banc de test Laravel : vérifier aussi CSRF et cookies dans un navigateur.

Si `pdo_sqlite` n’existe pas sur l’hébergement, exécuter cette suite sur une machine de recette compatible ou dans la CI fournie. La base MySQL cible doit malgré tout faire l’objet des tests manuels d’installation.

## 6. Créer les tables et votre compte

Uniquement dans la base indépendante créée pour ce projet :

```bash
php artisan studio:install
php artisan studio:doctor
php artisan view:cache
```

La commande demande une confirmation de migration, votre nom, votre e-mail et un mot de passe d’au moins 14 caractères saisi sans écho. Aucun compte client ni projet de démonstration n’est créé.

**Ne jamais lancer `migrate:fresh` ou `migrate:reset` sur une base utilisée.**

## 7. Tester dans le navigateur

Ouvrir le sous-domaine en HTTPS. Vérifier la connexion, créer un client fictif, importer son logo, créer un projet et une tâche, déposer un PDF non sensible puis se déconnecter. Les étapes détaillées sont dans `docs/RECETTE.md`.

Vérifications critiques :

- `/.env`, `/composer.json` et `/storage/` ne doivent jamais exposer les fichiers de l’application.
- Un téléchargement de document privé sans connexion doit être refusé.
- Le logo Studio est public volontairement pour la page de connexion ; les logos clients et les avatars sont privés.
- Vérifier qu’un téléversement trop grand, un format SVG ou un faux fichier image est refusé.
- `APP_DEBUG` reste désactivé, y compris sur une recette exposée sur Internet.

Des erreurs 500 génériques se diagnostiquent via `storage/logs/laravel.log`, en SSH. Ne pas activer le mode debug publiquement. Ne transmettre que les messages utiles, après retrait des chemins sensibles et secrets.

## 8. Personnaliser les logos

`Paramètres` → logo du Studio et avatar. `Clients` → ouvrir une fiche → `Modifier` → logo client.

Formats : PNG, JPEG, WebP, 2 Mo maximum, dimensions 2048 × 2048 maximum. Réencodage en PNG côté serveur, dimension ramenée à 720 pixels maximum. Transparence conservée. Le SVG est volontairement refusé ; exporter un PNG depuis votre outil graphique pour le pilote.

La barre de navigation, la page de connexion et les fiches utilisent ces images. L’icône installée sur l’écran d’accueil reste l’icône générique Studio dans cette version.

## 9. Portail client : uniquement après validation

Le portail est fermé avec `CLIENT_PORTAL_ENABLED=false`. La fonction « Vue client » permet de vérifier les contenus partagés sans inviter quelqu’un.

Après validation des tests avec des données fictives, utiliser temporairement :

```dotenv
CLIENT_PORTAL_ENABLED=true
```

Puis :

```bash
php artisan config:clear
```

Créer deux clients fictifs A et B. Dans chaque fiche, créer une invitation et l’ouvrir dans un navigateur privé distinct. Ne pas tester un lien d’invitation depuis la session administrateur déjà ouverte : la route est réservée aux visiteurs non connectés. Aucun message n’est envoyé automatiquement.

Le projet doit être partagé **et** le document ou la note doit être partagé pour apparaître dans ce projet. Le brief, le bilan, le budget et les tâches internes ne sont jamais affichés dans le portail.

Une invitation expire après 48 heures, une seule utilisation. Les invitations non utilisées peuvent être annulées. Révoquer un compte retire l’accès à sa prochaine requête. Il n’existe pas encore d’interface de réactivation : prévoir un traitement technique contrôlé, pas une modification hasardeuse en base.

**Ne pas ouvrir aux vrais clients avant revue de sécurité, sauvegardes, contrôle des droits, HTTPS et validation complète.** Cette version n’a pas de double authentification.

## 10. Assistant facultatif

Sans configuration, aucun appel IA n’est fait. Ne configurer un moteur qu’après la recette de base.

### Fournisseur OpenAI

```dotenv
AI_PROVIDER=openai
AI_MODEL=IDENTIFIANT_D_UN_MODELE_AUTORISE_SUR_VOTRE_COMPTE
OPENAI_API_KEY="CLE_CONFIGUREE_UNIQUEMENT_SUR_LE_SERVEUR"
AI_MAX_OUTPUT_TOKENS=1200
```

Le code utilise l’API Responses, sans outils d’écriture, avec `store=false`. Ce réglage ne constitue pas une garantie de conservation zéro chez le fournisseur. La facturation API relève de votre compte fournisseur. Limitation applicative : trois requêtes/minute et un maximum de sortie ; **pas de plafond budgétaire mensuel implémenté**. Définir aussi les limites adéquates côté fournisseur.

### Fournisseur Ollama

```dotenv
AI_PROVIDER=ollama
AI_MODEL=IDENTIFIANT_D_UN_MODELE_INSTALLE
OLLAMA_BASE_URL=ADRESSE_PRIVEE_ACCESSIBLE_PAR_LE_SERVEUR
OLLAMA_API_KEY="JETON_DU_PROXY_PRIVE_SI_NECESSAIRE"
```

**127.0.0.1 sur OVH désigne OVH, pas votre Mac.** Cette livraison ne crée ni tunnel, ni VPN, ni agent de liaison. Un canal privé authentifié et accessible à votre hébergement est nécessaire. Ne pas exposer directement Ollama/11434 sur Internet. Le Mac doit être allumé et accessible, sinon la fonction échoue sans basculer vers un service cloud.

Après modification : `php artisan config:clear` puis un essai sur un faux projet. Inspecter le contexte envoyé avant de cocher l’autorisation. Le moteur reçoit le projet sélectionné, au maximum 30 tâches, 5 extraits de notes et les 3 derniers échanges. Les fichiers ne sont pas lus et l’assistant n’a pas accès aux autres projets. La dictée du clavier du téléphone peut saisir le texte ; aucun enregistrement audio ou mode vocal continu n’est implémenté.

Les appels IA sont synchrones, avec délai de connexion de 5 secondes et requête de 45 secondes maximum. Les limites PHP/proxy de l’hébergement peuvent être plus courtes ; les tester. Aucun test réel de fournisseur n’a été exécuté lors de la livraison.

## 11. Sauvegarder et maintenir

Sauvegarder ensemble : la base complète, `storage/app/private`, le code + `composer.lock`, et `.env`/`APP_KEY` dans un emplacement sécurisé. Inclure les droits des fichiers. Le bouton d’export JSON n’est **pas** une sauvegarde complète ni une fonction de restauration.

Tester une restauration dans un dossier et une base séparés. Mettre en place une sauvegarde automatisée et une rétention adaptée avant tout usage réel. Aucun travail de sauvegarde n’est programmé par cette livraison.

Après recette et sauvegarde, pour une instance retenue :

```bash
composer install --no-dev --prefer-dist --optimize-autoloader
php artisan config:cache
php artisan view:cache
```

Pour une mise à jour : sauvegarde → copie de recette → modification → tests → déploiement contrôlé → migration si nécessaire → cache. Conserver les anciens fichiers et une sauvegarde cohérente de base pour le retour arrière. Ne jamais écraser `.env`, les fichiers privés ni la clé de l’instance.

Mot de passe oublié, depuis un accès SSH autorisé :

```bash
php artisan studio:password votre-adresse@example.fr
```

Le nouveau mot de passe est demandé de manière interactive. La commande ne réactive pas un accès révoqué.

## Références officielles

- Laravel, déploiement et répertoire public : https://laravel.com/docs/13.x/deployment
- Livewire, installation : https://livewire.laravel.com/docs/4.x/installation
- Composer, première résolution et verrouillage : https://getcomposer.org/doc/01-basic-usage.md
- Laravel, tests HTTP : https://laravel.com/docs/13.x/http-tests
- OpenAI, API Responses : https://developers.openai.com/api/docs/guides/migrate-to-responses
- Ollama, API Chat : https://docs.ollama.com/api/chat
