# INSTALLATION — environnement de développement

Le déploiement sur PlanetHoster est décrit séparément dans `DEPLOYMENT.md`
(phase 12).

## Prérequis

| Outil | Version | Vérification |
|---|---|---|
| PHP | 8.3 minimum | `php -v` |
| Composer | 2.x | `composer --version` |
| MariaDB ou MySQL | MariaDB 10.4+ | `mysql --version` |
| Node.js | 20+ | `node -v` |

Extensions PHP requises : `pdo_mysql`, `mbstring`, `openssl`, `tokenizer`,
`xml`, `ctype`, `json`, `fileinfo`, `curl`, `zip`, et `gd` **ou** `imagick`.

`php artisan app:doctor` contrôle tout cela et signale précisément ce qui manque.

## Mise en route

```bash
composer install
npm install
cp .env.example .env
php artisan key:generate
```

Créez les deux bases (l'application et les tests) :

```bash
mysql -e "CREATE DATABASE portraits CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
          CREATE DATABASE portraits_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
```

Renseignez la connexion dans `.env` :

```dotenv
DB_CONNECTION=mysql
DB_DATABASE=portraits
DB_USERNAME=votre_utilisateur
DB_PASSWORD=
```

Puis :

```bash
php artisan migrate --seed
npm run build
php artisan serve
```

L'application répond sur <http://localhost:8000>.

## Tests

```bash
php artisan test
```

Les tests s'exécutent sur **MariaDB** (`portraits_test`), et non sur SQLite.
Ce choix est délibéré : SQLite ignore silencieusement `lockForUpdate()`, qui
constitue la garantie anti-collision entre photographes — la tester sur SQLite
reviendrait à ne pas la tester du tout. Voir
[ARCHITECTURE.md §6.3](ARCHITECTURE.md).

## Particularités du poste de développement

### Le projet est hébergé dans un dossier Dropbox

C'est possible, mais deux précautions sont nécessaires.

**1. `vendor/` et `node_modules/` sont exclus de la synchronisation.**

Ces deux dossiers représentent plus de 12 000 fichiers, entièrement
reconstructibles depuis `composer.lock` et `package-lock.json`. Les
synchroniser sature Dropbox et ralentit l'ensemble du poste. L'exclusion est
déjà posée :

```bash
xattr -w com.dropbox.ignored 1 vendor
xattr -w com.dropbox.ignored 1 node_modules
xattr -w com.dropbox.ignored 1 storage/framework
xattr -w com.dropbox.ignored 1 storage/logs
```

Ces attributs sont locaux : après un clone sur une autre machine, il faut les
reposer.

**2. Ne pas utiliser SQLite dans le dossier Dropbox.**

Mesuré sur ce poste : une seule écriture SQLite dans le dossier Dropbox prend
**48 secondes**, contre 9 millisecondes hors Dropbox. La couche FUSE de Dropbox
gère très mal le verrouillage `fcntl` dont SQLite dépend. Les fichiers
ordinaires, eux, ne posent aucun problème (mesure : 5 écritures en 2 ms).

MariaDB n'étant pas concerné, c'est un argument de plus en faveur du choix
retenu.

> **À savoir** : juste après un `composer install`, Dropbox indexe les 12 000
> nouveaux fichiers de `vendor/`. Pendant cette phase, les commandes `artisan`
> peuvent prendre plusieurs minutes. C'est temporaire et sans gravité — poser
> l'attribut `com.dropbox.ignored` avant l'installation évite complètement le
> problème.
