# djuju02.fr — structure réorganisée

Projet restructuré pour un hébergement **OVH mutualisé PERSO** (cluster100, PHP 8.2).

Le principe directeur : **tout ce qui n'a pas besoin d'être servi par HTTP vit en dehors de `www/`.** Sur un mutualisé, c'est la protection la plus solide dont vous disposez, parce qu'elle ne dépend pas d'un `.htaccess` qui pourrait être mal interprété ou écrasé.

---

## 1. Arborescence

```
/home/djujufm/                     ← répertoire personnel (JAMAIS servi en HTTP)
│
├── .bash_profile                  Environnement SSH durci (umask 077, alias, backup)
├── .ovhconfig                     PHP 8.2, production — À LA RACINE DU HOME, pas dans www/
├── .gitignore
│
├── _secrets/                      🔒 Identifiants — hors racine web
│   ├── .htaccess                  Filet de sécurité (Require all denied)
│   ├── twitch.php                 ← À CRÉER sur le serveur, chmod 600, jamais versionné
│   └── twitch.php.example         Modèle sans valeur réelle
│
├── _app/                          🔒 Code PHP non exposé
│   ├── .htaccess
│   ├── bootstrap.php              Chemins, sessions durcies, helpers (e, asset, csrf…)
│   ├── lib/
│   │   └── Twitch.php             Client OAuth 2.0 + Helix
│   └── partials/
│       ├── head.php               <head> commun : meta, OG, CSS, JS
│       ├── nav.php                LA barre de navigation (source unique)
│       └── footer.php             Pied de page + fermeture du document
│
├── _storage/                      🔒 Données d'exécution
│   ├── .htaccess
│   ├── tokens/                    Jetons Twitch chiffrés (0600)
│   ├── sessions/                  Sessions PHP (hors /tmp partagé)
│   ├── cache/
│   └── logs/                      php-error.log, twitch.log, contact.log
│
├── _backups/                      🔒 Archives produites par `backup-site`
│
└── www/                           🌐 RACINE WEB — seul dossier exposé
    ├── .htaccess                  HTTPS, en-têtes, CSP, URLs propres, cache
    ├── index.php                  Accueil
    ├── mentions-legales.php
    ├── confidentialite.php
    ├── contact-envoi.php          Traitement du formulaire
    ├── robots.txt
    ├── sitemap.xml
    ├── 403.html  404.html  500.html
    ├── favicon.ico                ← à fournir
    │
    ├── assets/
    │   ├── css/
    │   │   ├── base.css           Tokens, reset, footer, utilitaires
    │   │   ├── shared-nav.css     Navbar (source unique)
    │   │   └── pages/             home, bots, overlays, jeux, portfolio, error
    │   ├── js/
    │   │   ├── theme-init.js      Bloquant dans <head> — supprime le flash
    │   │   ├── shared-nav.js      Menu, thème, clavier
    │   │   ├── portfolio.js       Modale projets (bug de syntaxe corrigé)
    │   │   └── jeux/              music-roulette.jsx + viewport.js
    │   ├── img/
    │   │   ├── overlays/          neon-cyber.jpg, minimal-clean.jpg (à remplacer)
    │   │   ├── portfolio/         portrait.jpg, jeu-3d.jpg, app-mobile.jpg (à remplacer)
    │   │   ├── jeux/
    │   │   └── bots/
    │   └── fonts/
    │
    ├── creations/
    │   ├── index.php              /creations
    │   ├── overlays.php           /creations/overlays
    │   └── bots.php               /creations/bots
    │
    ├── jeux/
    │   ├── .htaccess              CSP assouplie (Babel/Tailwind), isolée ici
    │   ├── index.php              /jeux
    │   └── music-roulette.php     /jeux/music-roulette
    │
    ├── portfolio/
    │   └── index.php              /portfolio
    │
    └── twitch/
        ├── index.php              État de la connexion
        └── api/
            ├── .htaccess          noindex, no-store
            ├── oauth_start.php
            └── oauth_callback.php
```

---

## 2. Configuration OVH

Dans l'espace client → **Hébergements → Multisite** :

| Domaine | Dossier racine | SSL | Notes |
|---|---|---|---|
| `djuju02.fr` | `www` | Activé | Cocher « forcer HTTPS » si disponible |
| `www.djuju02.fr` | `www` | Activé | Redirigé en 301 vers l'apex par `.htaccess` |

Points de vigilance :

- **Ne pointez jamais un site sur `/` (la racine du home)**. Ce serait exposer `_secrets/` en HTTP. Le dossier racine doit toujours être `www` ou un sous-dossier de `www`.
- Vous avez **5 sites** disponibles. Si vous en ajoutez un (ex. `stream.djuju02.fr`), créez `www/stream/` et pointez-le dessus — pas un dossier hors `www`.
- `.ovhconfig` épingle PHP 8.2 ; il prime sur le réglage global du panneau. Comptez quelques minutes de propagation.
- **Vous n'utilisez aucune de vos 5 bases de données.** L'architecture actuelle n'en a pas besoin (les jetons sont dans un fichier chiffré). Si un jour vous stockez des scores de jeu ou des messages de contact, prenez-en une plutôt que d'écrire dans des fichiers.
- **CDN désactivé** : c'est cohérent. Si vous l'activez plus tard, vérifiez que les en-têtes `Cache-Control` du `.htaccess` ne sont pas contournés pour les réponses PHP.

---

## 3. Déploiement

> Depuis la mise en place de GitHub Actions, le déploiement manuel décrit
> ci-dessous n'est plus la voie normale : `git push` suffit. Voir **GITHUB.md**.
> Cette section reste utile pour un premier envoi ou un dépannage.


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

# --- Sauvegarde de l'existant, toujours en premier ---
cd ~
tar -czf ~/sauvegarde-avant-refonte-$(date +%Y%m%d).tar.gz www _secrets 2>/dev/null
chmod 600 ~/sauvegarde-avant-refonte-*.tar.gz
```

Envoyez ensuite l'archive et déployez :

```bash
cd ~
unzip djuju02-restructure.zip -d ~/nouveau

# Copie hors racine web
cp -r ~/nouveau/_app     ~/
cp -r ~/nouveau/_storage ~/
mkdir -p ~/_secrets ~/_backups
cp ~/nouveau/_secrets/twitch.php.example ~/_secrets/
cp ~/nouveau/_secrets/.htaccess          ~/_secrets/
cp ~/nouveau/.bash_profile               ~/.bash_profile
cp ~/nouveau/.gitignore                  ~/

# Racine web
cp -r ~/nouveau/www/. ~/www/
```

### Secrets

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

### Permissions

```bash
# Dossiers 750, fichiers 640
find ~/www ~/_app -type d -exec chmod 750 {} \;
find ~/www ~/_app -type f -exec chmod 640 {} \;

# Secrets et données d'exécution : rien pour les autres comptes du mutualisé
chmod 700 ~/_secrets ~/_storage ~/_backups
chmod -R 700 ~/_storage
chmod 600 ~/_secrets/*.php
```

### Vérifications

```bash
curl -sI https://djuju02.fr | grep -i -E 'content-security|x-content-type|referrer'
curl -sI http://djuju02.fr  | head -1          # attendu : 301
curl -sI https://djuju02.fr/_secrets/twitch.php | head -1   # attendu : 404
curl -sI https://djuju02.fr/assets/img/         | head -1   # attendu : 403
curl -sI https://djuju02.fr/creations/bots      | head -1   # attendu : 200
curl -sI https://djuju02.fr/creations/bots.html | head -1   # attendu : 301
```

---

## 4. Ce qui reste à faire de votre côté

Tout le contenu a été intégré. Il reste des visuels de remplacement à remplacer
par les vôtres — ce sont des JPG générés, volontairement moches pour se
remarquer :

| Fichier | Format conseillé |
|---|---|
| `assets/img/portfolio/portrait.jpg` | ~600×750 |
| `assets/img/portfolio/jeu-3d.jpg` | ~800×500 |
| `assets/img/portfolio/app-mobile.jpg` | ~800×500 |
| `assets/img/overlays/neon-cyber.jpg` | ~1600×900 |
| `assets/img/overlays/minimal-clean.jpg` | ~1600×900 |
| `favicon.ico`, `assets/img/favicon.svg` | placeholder « D » généré |

Les anciennes venaient d'Unsplash. Elles sont désormais locales : la CSP
interdit les images tierces, et Unsplash voyait l'IP de chacun de vos visiteurs.

À compléter aussi : `www/mentions-legales.php` (nom, adresse — obligatoire au
titre de la LCEN) et le destinataire du formulaire dans
`www/contact-envoi.php` (`CONTACT_DESTINATAIRE`).

`jeux/index.html` n'est jamais arrivé (deux fichiers portaient le même nom,
l'un a écrasé l'autre à l'envoi). Il est remplacé par `www/jeux/index.php`,
qui liste Music Roulette. Si vous aviez d'autres jeux, ajoutez-les au tableau
`$jeux` en haut du fichier.

## 5. Au quotidien

**Ajouter une entrée au menu** → `_app/partials/nav.php`, tableau `$navItems`. Une seule fois, toutes les pages suivent.

**Ajouter une page** :

```php
<?php
require __DIR__ . '/../../_app/bootstrap.php';
$page = [
    'title'       => 'Ma page',
    'description' => 'Une phrase pour Google et les aperçus Discord.',
    'active'      => 'creations',
    'canonical'   => '/creations/ma-page',
    'css'         => ['pages/ma-page.css'],
];
require APP_PATH . '/partials/head.php';
?>
<main id="contenu">…</main>
<?php require APP_PATH . '/partials/footer.php'; ?>
```

Ajoutez-la ensuite au `sitemap.xml`.

**Ajouter un jeu** → un fichier dans `www/jeux/`, une entrée dans le tableau `$jeux` de `www/jeux/index.php`.

**Ajouter un projet au portfolio** → une entrée dans le tableau `$projets` de `www/portfolio/index.php`. Le carousel et la modale suivent tout seuls.

**Règle de sécurité permanente** : jamais de `<script>` ni de `style="..."` en ligne dans une page. La CSP les bloque, et c'est voulu — c'est ce qui rend une injection XSS inoffensive.

**Sauvegarde** : `backup-site` en SSH (alias fourni). Les 7 dernières archives sont conservées. Le disque est à 0 / 100 Go, la place ne manque pas.

**Surveillance** :

```bash
logs        # tail -f du php-error.log
twitchlog   # tail -f du twitch.log
perms       # audit rapide des permissions
```
