# Déploiement en SFTP — sans accès SSH

Votre offre PERSO n'inclut pas SSH (la page FTP-SSH n'affiche qu'une colonne
SFTP). Tout se fait donc par transfert de fichiers. C'est un peu plus manuel,
mais rien d'essentiel n'est perdu.

## Point de situation

| | État |
|---|---|
| `chmod 700` sur `_secrets` et `private` | ✅ fait |
| `_secrets` hors racine web (404 vérifié) | ✅ confirmé |
| `.htaccess` du home récupéré et analysé | ✅ |
| Aucun `.htaccess` dans `www/` | ✅ rien à préserver |
| Nouveau secret Twitch | ⬜ |
| Sauvegarde de `www` | ⬜ |
| Déploiement | ⬜ |

---

## 1. Régénérer le secret Twitch

Indépendant du serveur, et c'est le point le plus critique.

[dev.twitch.tv/console/apps](https://dev.twitch.tv/console/apps) → votre app →
**New Secret**. L'ancien est révoqué immédiatement. Gardez la nouvelle valeur
de côté, elle servira à l'étape 5.

Vérifiez au passage la liste des OAuth Redirect URLs : une seule entrée,
exactement `https://djuju02.fr/twitch/api/oauth_callback.php`.

## 2. Sauvegarder

Dans FileZilla, glissez vers un dossier de votre PC :

- `www`
- `_secrets`
- `private`
- `.htaccess`, `.ovhconfig`, `.bash_profile`

Zippez le tout, datez le nom. **Ne passez pas à l'étape 3 sans cette copie.**

## 3. Préparer la clé de chiffrement des jetons

Dans PowerShell :

```powershell
$b = [byte[]]::new(32)
[System.Security.Cryptography.RandomNumberGenerator]::Fill($b)
($b | ForEach-Object { $_.ToString('x2') }) -join ''
```

Copiez la chaîne de 64 caractères obtenue.

## 4. Mettre l'ancien site de côté

En sftp :

```
sftp> rename www www-ancien
sftp> mkdir www
```

On renomme, on ne supprime pas : en cas de problème, l'étape 9 remet tout en
place en deux commandes.

## 5. Mettre à jour le fichier de secrets

`_secrets/twitch.php` reste sur le serveur, il n'est pas dans l'archive.
Il faut y ajouter deux choses. Récupérez-le, éditez-le, renvoyez-le :

```
sftp> get _secrets/twitch.php twitch-local.php
```

Ouvrez `twitch-local.php` et modifiez :

```php
'client_secret' => 'LE_NOUVEAU_SECRET_DE_L_ETAPE_1',
'token_key'     => 'LES_64_CARACTERES_DE_L_ETAPE_3',
'broadcaster_id'=> '',   // facultatif
```

Comparez avec `_secrets/twitch.php.example` de l'archive pour la liste
complète des clés attendues. Puis :

```
sftp> put twitch-local.php _secrets/twitch.php
sftp> chmod 600 _secrets/twitch.php
```

Supprimez ensuite `twitch-local.php` de votre PC — il contient le secret en
clair.

## 6. Envoyer les fichiers

Décompressez l'archive sur votre PC. Dans FileZilla, panneau distant sur
`/home/djujufm`, puis glissez depuis le dossier `djuju02` :

| Ce que vous glissez | Vers |
|---|---|
| le contenu de `www/` | `/home/djujufm/www/` |
| le dossier `_app` | `/home/djujufm/` |
| le dossier `_storage` | `/home/djujufm/` |
| `_secrets/.htaccess` et `_secrets/twitch.php.example` | `/home/djujufm/_secrets/` |
| `.ovhconfig` | `/home/djujufm/` (écrase l'ancien) |
| `.bash_profile` | `/home/djujufm/` (sans effet sans SSH, mais gardez-le) |
| `.gitignore` | `/home/djujufm/` |

**N'envoyez pas encore le `.htaccess` de la racine.** Il vient en dernier,
étape 8, une fois que celui de `www/` est confirmé actif.

FileZilla → menu **Transfert** → **Transferts par glisser-déposer** : vérifiez
que les fichiers commençant par un point sont bien visibles (menu **Serveur** →
**Forcer l'affichage des fichiers cachés**). Sans ça, `www/.htaccess` ne
partira pas.

## 7. Permissions

En sftp, dossier par dossier :

```
sftp> chmod 700 _storage
sftp> chmod 700 _storage/tokens
sftp> chmod 700 _storage/logs
sftp> chmod 700 _storage/sessions
sftp> chmod 700 _storage/cache
sftp> chmod 700 _secrets
sftp> chmod 600 _secrets/twitch.php
```

Le client sftp d'OpenSSH n'a pas d'équivalent de `chmod -R`. Pour `www` et
`_app`, FileZilla fait mieux : clic droit sur le dossier → *Droits d'accès du
fichier* → valeur `750`, cocher **Récursivement** et **Appliquer aux
répertoires uniquement**. Puis même chose avec `640` et **Appliquer aux
fichiers uniquement**.

## 8. Neutraliser le .htaccess de la racine

Testez d'abord que celui de `www/` fonctionne :

```powershell
curl.exe -sI https://djuju02.fr | findstr /i "content-security"
```

Si la ligne `Content-Security-Policy` apparaît, `www/.htaccess` est actif.
Envoyez alors le `.htaccess` de la racine (celui de l'archive, vidé de ses
règles et documenté).

Si elle n'apparaît pas, **ne touchez pas** à celui de la racine : c'est votre
seule protection tant que le nouveau n'est pas pris en compte.

## 9. Vérifier

```powershell
# Protections
curl.exe -sI https://djuju02.fr/_secrets/twitch.php    # 404
curl.exe -sI https://djuju02.fr/assets/img/            # 403
curl.exe -sI http://djuju02.fr                         # 301

# Pages
foreach ($u in '/','/creations','/creations/overlays','/creations/bots','/jeux',
               '/jeux/music-roulette','/portfolio','/mentions-legales','/confidentialite') {
  $c = (curl.exe -so NUL -w '%{http_code}' "https://djuju02.fr$u")
  "{0,-28} {1}" -f $u, $c
}

# Anciennes URLs → 301
foreach ($u in '/index.html','/creations/bots.html','/jeux/music-roulette.html') {
  $c = (curl.exe -so NUL -w '%{http_code}' "https://djuju02.fr$u")
  "{0,-32} {1}" -f $u, $c
}
```

Puis dans le navigateur, console ouverte (F12) :

- accueil, portfolio, bots, overlays → aucune erreur CSP
- portfolio → cliquer un projet : la modale s'ouvre (elle ne s'ouvrait plus),
  Échap la ferme
- Music Roulette → le jeu démarre, la recherche iTunes répond, les extraits se
  lisent
- menu mobile sur un vrai téléphone, en clair et en sombre
- formulaire de contact : un envoi test arrive, un second dans la minute est
  refusé

Enfin [securityheaders.com](https://securityheaders.com), objectif A ou A+.

## 10. Retour arrière

```
sftp> rename www www-nouveau
sftp> rename www-ancien www
```

Le site est revenu à son état précédent. Supprimez `www-ancien` seulement
après quelques jours de fonctionnement confirmé.

---

## Ce que vous perdez sans SSH

Les alias `backup-site`, `perms`, `logs` du `.bash_profile` ne s'exécuteront
pas. Remplacements :

- **Sauvegarde** : téléchargement périodique de `www` et `_secrets` via
  FileZilla. À faire avant chaque modification importante.
- **Consulter les logs** : `get _storage/logs/php-error.log` en sftp, ou
  espace client OVH → onglet **Logs**.
- **Vérifier les permissions** : `ls -la` en sftp suffit.
