# Déploiement sur Plesk

Deux chemins possibles. Le premier est celui à privilégier : une fois réglé,
mettre le site à jour se résume à `git push`.

---

## Chemin A — Git intégré à Plesk (recommandé)

### 1. Créer le dépôt distant

Sur GitHub, créez un dépôt **privé** nommé `lambec`. Il contient votre adresse
personnelle, votre SIRET et vos mentions légales : rien de secret, mais rien
qui ait vocation à être indexé par Google.

Puis, depuis `C:\laragon\www\lambec` :

```bash
git remote add origin https://github.com/sirlomaxe/lambec.git
git push -u origin main
```

### 2. Brancher Plesk sur le dépôt

**Plesk → Sites Web & Domaines → lambec.fr → Git → Ajouter un dépôt**

| Champ | Valeur |
|---|---|
| Type | Dépôt distant Git |
| URL du dépôt | `git@github.com:sirlomaxe/lambec.git` |
| Branche | `main` |
| Chemin de déploiement | `httpdocs` |
| Mode de déploiement | Automatique |

Plesk affiche alors une **clé publique SSH**. Copiez-la, puis sur GitHub :
*dépôt → Settings → Deploy keys → Add deploy key*, collez-la, laissez
« Allow write access » décoché.

> Sans cette clé, Plesk ne peut pas lire un dépôt privé et le déploiement
> échouera sur une erreur d'authentification.

### 3. Déclarer l'action de déploiement

Dans le même écran, **Actions de déploiement supplémentaires** :

```bash
bash deploy.sh
```

Ce script trouve le bon PHP, vérifie les extensions, crée les dossiers
inscriptibles, sauvegarde la base, applique les migrations en attente, puis
lance les 75 vérifications de non-régression. Il s'arrête net si quelque chose
ne va pas.

> **Shell restreint.** L'accès SSH de Plesk est souvent « chrooté » : ni
> `dirname`, ni `date`, ni `mkdir` n'y sont disponibles. `deploy.sh` n'utilise
> donc que des primitives de bash et confie tout le reste à `bin/deploy.php`.
> Il fonctionne dans les deux cas, sans réglage particulier.

> **Si le PHP n'est pas trouvé automatiquement**, le script affiche les
> emplacements qu'il a examinés. Repérez le vôtre :
>
> ```bash
> for p in /opt/plesk/php/*/bin/php /usr/bin/php*; do [ -x "$p" ] && echo "$p"; done
> ```
>
> puis indiquez-le dans l'action de déploiement :
>
> ```bash
> PHP_BIN=/opt/plesk/php/8.3/bin/php bash deploy.sh
> ```

> **Si l'accès SSH est désactivé** sur l'abonnement, Plesk grise ce champ.
> Activez-le dans *Paramètres d'hébergement → Accès SSH → /bin/bash*, ou
> suivez le chemin B ci-dessous pour l'installation initiale.

#### Le cas de la cage chroot

Si `bash deploy.sh` répond « Votre shell est enfermé dans une cage », votre
accès SSH est en mode **chrooté** : le dossier de votre site est devenu `/`,
et PHP — rangé dans `/opt/plesk/` sur le serveur réel — est hors d'atteinte.
Vous le reconnaissez à une racine qui ressemble à ceci :

```
/bin  /etc  /httpdocs  /lib  /logs  /tmp  /usr  /var
```

`/httpdocs` à la racine, et pas de `/opt` : c'est la signature.

Dans l'ordre :

1. **N'essayez pas depuis le SSH — cliquez sur « Déployer » dans Plesk.**
   Les actions de déploiement ne tournent pas forcément dans la même cage que
   le shell interactif. C'est gratuit à tester et ça règle souvent l'affaire.

2. **Sortez le SSH de sa cage.** *Plesk → Abonnements → votre domaine →
   Accès à l'hébergement → Accès au serveur par SSH* : choisissez `/bin/bash`
   au lieu de `/bin/bash (chrooté)`. C'est la solution durable — elle vous
   redonne aussi `git`, `php` et les utilitaires système.

3. **Passez par une tâche planifiée**, qui n'est jamais encagée. Voir le
   chemin B ci-dessous.

### 4. Déplacer la racine du document

**C'est l'étape à ne pas oublier.**

**Plesk → Paramètres d'hébergement → Racine du document :**
remplacez `httpdocs` par `httpdocs/public`.

Sans cela, le navigateur atteint la racine du projet au lieu du dossier
`public/`, et l'application ne s'affiche pas.

> Si votre offre ne permet pas de la modifier, le site fonctionne quand même :
> des fichiers `.htaccess` interdisent l'accès à `app/`, `config/`,
> `database/`, `storage/` et `_legacy/`. Déplacer la racine reste nettement
> plus propre.

### 5. Premier déploiement

Cliquez sur **Déployer**. Dans le journal affiché par Plesk, repérez :

```
┌─────────────────────────────────────────────────────┐
│  NOTE CE MOT DE PASSE, IL NE SERA PLUS AFFICHÉ      │
└─────────────────────────────────────────────────────┘

   Identifiant : contact@lambec.fr
   Mot de passe : ····················
```

**Notez-le immédiatement**, il n'est affiché qu'une fois. Connectez-vous sur
`https://lambec.fr/admin` et changez-le dans *Réglages → Mot de passe*.

### 6. Activer HTTPS

**Plesk → Certificats SSL/TLS → Installer un certificat Let's Encrypt**,
en cochant le domaine et `www`.

Le `.htaccess` force déjà la redirection vers HTTPS et vers le domaine sans
`www` — mais tant que le certificat n'existe pas, cette redirection mène à un
avertissement de sécurité. Installez-le avant d'ouvrir le site au public.

### 7. Ensuite : mettre à jour

```bash
git add -A
git commit -m "Ajout du champ X sur la fiche client"
git push
```

Plesk récupère, exécute `deploy.sh`, applique les migrations, vérifie, et
c'est en ligne. En cas d'échec des vérifications, le script s'arrête et le
journal Plesk indique ce qui ne va pas.

---

## Chemin B — Envoi par FTP

Si vous préférez ne pas passer par Git.

1. **Envoyez tout**, sauf `_legacy/`, `.github/`, `.claude/`, `.git/` et
   surtout **`config/local.php`** (il activerait l'affichage des erreurs PHP
   aux visiteurs).

2. **Racine du document sur `httpdocs/public`** (voir étape 4 ci-dessus).

3. **Droits d'écriture** sur `database/`, `storage/logs/`,
   `storage/backups/` et `public/uploads/`.

4. **Installez.** Via SSH :

   ```bash
   cd ~/httpdocs && php bin/install.php --email=contact@lambec.fr
   ```

   Sans SSH : *Plesk → Outils & Paramètres → Tâches planifiées* → créez une
   tâche `Exécuter une commande` avec
   `/opt/plesk/php/8.3/bin/php /var/www/vhosts/lambec.fr/httpdocs/bin/install.php`,
   lancez-la une fois avec **Exécuter maintenant**, lisez le mot de passe dans
   la sortie, puis **supprimez la tâche**.

---

## Sauvegardes

Toute l'application tient dans **`database/lambec.sqlite`** : clients,
missions, factures, contenu du site.

- **Manuelle** : *Réglages → Télécharger une sauvegarde*.
- **Avant chaque déploiement** : `deploy.sh` en dépose une copie horodatée
  dans `storage/backups/`.
- **Quotidienne** — *Plesk → Tâches planifiées*, tous les jours à 3 h :

  ```bash
  /opt/plesk/php/8.3/bin/php -r "copy('/var/www/vhosts/lambec.fr/httpdocs/database/lambec.sqlite', '/var/www/vhosts/lambec.fr/httpdocs/storage/backups/quotidien-'.date('Y-m-d').'.sqlite');"
  ```

### Revenir en arrière

```bash
cd ~/httpdocs
cp storage/backups/avant-deploiement-AAAAMMJJ-HHMMSS.sqlite database/lambec.sqlite
git checkout LE_COMMIT_PRECEDENT
```

La base et le code sont indépendants : vous pouvez restaurer l'un sans l'autre.

---

## Si quelque chose cloche

| Symptôme | Cause la plus probable |
|---|---|
| Page blanche, erreur 500 | Racine du document pas sur `public/`, ou `database/` non inscriptible. Voir `storage/logs/php-error.log`. |
| « could not find driver » | `pdo_sqlite` désactivé — *Plesk → Paramètres PHP du domaine*. |
| Erreurs PHP visibles par les visiteurs | `config/local.php` est parti sur le serveur. Supprimez-le. |
| Les URL autres que `/` renvoient 404 | `mod_rewrite` désactivé, ou `.htaccess` ignoré (`AllowOverride`). |
| Le déploiement échoue à l'authentification | Clé de déploiement absente sur GitHub (étape 2). |
| « bad interpreter: /bin/bash^M » | `.gitattributes` non pris en compte — refaites un `git clone` propre. |
| « dirname: command not found », « date: command not found » | Shell chrooté sans utilitaires. Corrigé : mettez le dépôt à jour (`git pull`). |
| « Votre shell est enfermé dans une cage » | SSH chrooté : PHP est hors d'atteinte. Voir « Le cas de la cage chroot », étape 3. |
| « Aucun PHP 8.1 ou supérieur accessible » hors cage | Indiquez le chemin : `PHP_BIN=/opt/plesk/php/8.3/bin/php bash deploy.sh`. |

Diagnostic à distance, quand l'accès SSH est disponible :

```bash
cd ~/httpdocs && php bin/check.php --url=https://lambec.fr
```

### Diagnostic depuis une tâche planifiée

Plesk **tronque l'affichage du résultat d'une tâche**. Utilisez `--court` :
le verdict est alors annoncé en première ligne, et non en dernière où il
serait systématiquement coupé.

```bash
/opt/plesk/php/8.3/bin/php /var/www/vhosts/lambec.fr/httpdocs/bin/check.php --court --url=https://lambec.fr
```

Résultat attendu, en deux lignes :

```
  ✓ 111 vérifications passées (logique métier et pages). Rien de cassé.
```

Sans `--url`, seuls les 75 contrôles de logique métier tournent — les pages
ne sont pas sollicitées, et le script vous le signale.
