# Migration — procédure exacte pour votre serveur

Rédigé d'après la capture FileZilla de `/home/djujufm`.

**Réponse courte à « je supprime tout et je mets le zip ? » : non.** Trois choses ne doivent pas disparaître, et une quatrième mérite d'être lue avant d'être jetée.

| Élément | Sort |
|---|---|
| `_secrets/twitch.php` | **Conserver** (avec le nouveau `client_secret`) |
| `private/` | **Inspecter d'abord** — contenu inconnu de moi |
| `.bashrc`, `.bash_logout` | **Conserver** — fichiers système OVH |
| `.htaccess` (racine du home) | **Lire avant de décider** — voir §2 |
| `.ovhconfig` | Remplacer par le mien |
| `.bash_profile` | Remplacer (le vôtre est le modèle OVH par défaut, sans personnalisation) |
| `www/` | Remplacer, après sauvegarde |

---

## 1. Sauvegarder — non négociable

```bash
ssh djujufm@ftp.cluster100.hosting.ovh.net

cd ~
tar -czf ~/sauvegarde-complete-$(date +%Y%m%d-%H%M).tar.gz \
    www _secrets private .htaccess .ovhconfig .bash_profile .bashrc 2>/dev/null
chmod 600 ~/sauvegarde-complete-*.tar.gz
ls -lh ~/sauvegarde-complete-*.tar.gz
```

Téléchargez cette archive sur votre machine avant d'aller plus loin. Le disque est à 0 / 100 Go, la place n'est pas un problème.

## 2. Lire le `.htaccess` de la racine du home

```bash
cat ~/.htaccess
```

1401 octets, daté du 08/09/2025. Il y a deux possibilités et elles n'ont pas les mêmes conséquences.

Testez d'abord ceci, depuis n'importe où :

```bash
curl -sI https://djuju02.fr/_secrets/twitch.php | head -1
```

- **`404`** → la racine du site est bien `www`. Apache ne lit jamais un `.htaccess` situé au-dessus du DocumentRoot : le vôtre est inerte. Vous pouvez l'archiver et le supprimer.
- **`403`** → la racine du site est `/`. Vos secrets sont dans l'arborescence servie, et seul ce `.htaccess` les cache. À corriger (§3).
- **`200`** → votre `client_secret` est lisible publiquement. Régénérez-le immédiatement et corrigez la racine avant tout le reste.

## 3. Vérifier la racine en multisite

Espace client OVH → **Hébergements** → votre hébergement → onglet **Multisite**.

Pour `djuju02.fr`, le champ « Dossier racine » doit contenir `www` — jamais vide, jamais `/`. Si ce n'est pas le cas, modifiez-le. `_secrets` et `private` sortiront alors de la zone servie par Apache.

## 4. Corriger les permissions

C'est le point le plus urgent après le secret Twitch. Vos dossiers sont en `drwxr-xr-x`, donc lisibles par les autres comptes du cluster100.

```bash
chmod 700 ~/_secrets ~/private
chmod 600 ~/_secrets/*
ls -ld ~/_secrets ~/private        # attendu : drwx------
```

## 5. Déployer

```bash
cd ~
# Mettre l'archive dans ~/ puis :
unzip djuju02-restructure.zip -d ~/nouveau
cd ~/nouveau/djuju02
```

### 5a. Hors racine web

```bash
cp -r _app     ~/
cp -r _storage ~/
mkdir -p ~/_backups
cp _secrets/.htaccess          ~/_secrets/
cp _secrets/twitch.php.example ~/_secrets/
cp .bash_profile               ~/.bash_profile
cp .gitignore                  ~/
cp .ovhconfig                  ~/.ovhconfig        # racine du home, pas www/
```

`~/_secrets/twitch.php` **n'est pas dans l'archive** — c'est volontaire. Le vôtre reste en place ; il faut seulement y mettre le nouveau `client_secret` et ajouter la clé `token_key` :

```bash
php -r "echo bin2hex(random_bytes(32)), PHP_EOL;"   # → coller dans token_key
nano ~/_secrets/twitch.php                          # comparer avec twitch.php.example
chmod 600 ~/_secrets/twitch.php
```

### 5b. Racine web

```bash
mv ~/www ~/www-ancien           # on déplace, on ne supprime pas
mkdir ~/www
cp -r ~/nouveau/djuju02/www/. ~/www/
```

`www-ancien` reste sous la main quelques jours, le temps de valider. Ensuite : `rm -rf ~/www-ancien`.

### 5c. Permissions finales

```bash
find ~/www ~/_app -type d -exec chmod 750 {} \;
find ~/www ~/_app -type f -exec chmod 640 {} \;
chmod 700 ~/_secrets ~/_storage ~/_backups ~/private
chmod -R 700 ~/_storage
chmod 600 ~/_secrets/*.php
```

## 6. Vérifier

```bash
# Protections
curl -sI https://djuju02.fr/_secrets/twitch.php | head -1   # 404
curl -sI https://djuju02.fr/assets/img/          | head -1   # 403
curl -sI http://djuju02.fr                       | head -1   # 301

# Pages
for u in / /creations /creations/overlays /creations/bots /jeux \
         /jeux/music-roulette /portfolio /mentions-legales /confidentialite; do
  printf '%-28s %s\n' "$u" "$(curl -so /dev/null -w '%{http_code}' https://djuju02.fr$u)"
done

# Anciennes URLs → 301
for u in /index.html /creations/bots.html /jeux/music-roulette.html; do
  printf '%-32s %s\n' "$u" "$(curl -so /dev/null -w '%{http_code}' https://djuju02.fr$u)"
done

# En-têtes de sécurité
curl -sI https://djuju02.fr | grep -i -E 'content-security|x-content-type|referrer|permissions'
```

Puis, dans un navigateur, console ouverte (F12) :

- **Accueil, portfolio, bots, overlays** → zéro erreur CSP attendue.
- **Portfolio** → cliquer un projet : la modale doit s'ouvrir (elle ne s'ouvrait pas avant), Échap doit la fermer.
- **Music Roulette** → le jeu doit se lancer ; la recherche iTunes et la lecture des extraits doivent fonctionner. Des messages CSP ici signifient qu'un domaine manque dans `www/jeux/.htaccess`.
- **Menu mobile** sur un vrai téléphone, en clair et en sombre.
- **Formulaire de contact** : un envoi de test doit arriver, un second dans la minute doit être refusé.

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

## 7. Après validation

```bash
# HSTS : seulement quand tout est confirmé en HTTPS, sous-domaines compris
nano ~/www/.htaccess     # décommenter la ligne Strict-Transport-Security
```

Puis Google Search Console → soumettre `https://djuju02.fr/sitemap.xml`.

## 8. Si quelque chose casse

```bash
rm -rf ~/www && mv ~/www-ancien ~/www
```

Retour à l'état précédent en une commande. C'est la raison du `mv` plutôt qu'un `rm` à l'étape 5b.
