# GitHub, Claude Code et déploiement automatique

Objectif : modifier en local, `git push`, et le site se met à jour tout seul.

---

## Avant de commencer — deux avertissements

**L'historique Git est permanent.** Un secret commité une seule fois y reste,
même après suppression du fichier : `git log -p` le retrouve, et GitHub
conserve des copies des objets orphelins que vous ne pouvez pas effacer. Si
cela arrive, la seule réponse valable est de régénérer le secret chez Twitch.

C'est pourquoi ce projet a trois barrières : `.gitignore`, un hook
`pre-commit`, et une vérification dans le workflow. Aucune n'est infaillible
seule.

**Créez le dépôt en privé.** Même sans secrets, votre `.htaccess` et vos
endpoints renseignent utilement quelqu'un qui chercherait une faille. Vous
pourrez toujours le passer public plus tard ; l'inverse ne répare rien.

---

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

Sur GitHub : **New repository** → nom `djuju02` → **Private** → sans README
ni .gitignore (le projet en a déjà).

En local, dans le dossier du projet :

```powershell
cd "C:\Users\julie\Desktop\Djuju02_website\Claude version\djuju02"

git init
git branch -M main
git config core.hooksPath .githooks      # active le hook pre-commit

# Vérifiez CE QUI SERA COMMITÉ avant de commiter
git add .
git status
```

**Regardez cette liste attentivement.** `_secrets/twitch.php` ne doit pas y
figurer — seul `twitch.php.example` est attendu. Si le vrai fichier apparaît :

```powershell
git rm --cached _secrets/twitch.php
```

Puis seulement :

```powershell
git commit -m "Structure initiale du site et des overlays"
git remote add origin https://github.com/VOTRE_COMPTE/djuju02.git
git push -u origin main
```

---

## 2. Clé de déploiement

GitHub Actions a besoin d'un accès SFTP. On crée une clé **dédiée**, distincte
de la vôtre : si elle fuite, vous la révoquez sans perdre votre propre accès.

### Générer

```powershell
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\djuju02_deploy" -C "github-actions" -N '""'
```

Deux fichiers apparaissent : `djuju02_deploy` (privée, pour GitHub) et
`djuju02_deploy.pub` (publique, pour OVH).

### Autoriser sur le serveur

Votre `authorized_keys` contient déjà votre clé personnelle. Il faut **ajouter**
la nouvelle ligne, pas écraser le fichier :

```powershell
sftp djujufm@ftp.cluster100.hosting.ovh.net
```

```
get .ssh/authorized_keys authorized_keys_local
bye
```

Ouvrez `authorized_keys_local`, collez le contenu de `djuju02_deploy.pub` sur
une **nouvelle ligne** à la fin, enregistrez. Puis :

```powershell
sftp djujufm@ftp.cluster100.hosting.ovh.net
```

```
put authorized_keys_local .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
bye
```

Vérifiez que la nouvelle clé fonctionne :

```powershell
sftp -i "$env:USERPROFILE\.ssh\djuju02_deploy" djujufm@ftp.cluster100.hosting.ovh.net
```

Aucun mot de passe ne doit être demandé.

### Récupérer l'empreinte du serveur

Elle empêche une attaque de l'homme du milieu : sans elle, le workflow
accepterait n'importe quel serveur se présentant sous ce nom d'hôte.

```powershell
ssh-keyscan -t rsa,ecdsa,ed25519 ftp.cluster100.hosting.ovh.net
```

Gardez la sortie complète.

---

## 3. Secrets GitHub

Dépôt → **Settings** → **Secrets and variables** → **Actions** → **New
repository secret**. Quatre entrées :

| Nom | Valeur |
|---|---|
| `OVH_HOST` | `ftp.cluster100.hosting.ovh.net` |
| `OVH_USER` | `djujufm` |
| `OVH_SSH_KEY` | Contenu **complet** de `djuju02_deploy` (la clé privée, avec les lignes `BEGIN`/`END`) |
| `OVH_KNOWN_HOSTS` | Sortie de `ssh-keyscan` ci-dessus |

Pour copier la clé privée sans erreur :

```powershell
Get-Content "$env:USERPROFILE\.ssh\djuju02_deploy" | Set-Clipboard
```

---

## 4. Premier déploiement, en simulation

**Ne lancez pas un vrai déploiement en premier.** Le workflow utilise
`--delete` : tout fichier présent sur le serveur mais absent du dépôt sera
supprimé. Si votre dépôt est incomplet, vous perdez des fichiers.

Dépôt → onglet **Actions** → **Déploiement** → **Run workflow** → cochez
**Simulation seule** → **Run workflow**.

Lisez le journal. Les lignes commençant par `rm` ou `Removing` signalent ce
qui serait supprimé. Si quelque chose d'important y figure — une image que
vous aviez déposée à la main, par exemple — récupérez-le d'abord et
ajoutez-le au dépôt.

Quand la simulation est propre, relancez sans la case cochée.

---

## 5. Claude Code

```powershell
npm install -g @anthropic-ai/claude-code
cd "C:\Users\julie\Desktop\Djuju02_website\Claude version\djuju02"
claude
```

`CLAUDE.md` est lu automatiquement au démarrage : Claude Code y trouve
l'architecture, les règles de sécurité, les conventions et la liste des
pièges déjà rencontrés sur ce projet.

### Ce qui marche bien

Demandez en décrivant l'intention, pas la manipulation :

> Ajoute un overlay « compteur d'abonnés » de 300×100, branché sur les données
> Twitch, dans le style des autres.

Claude Code lira `CLAUDE.md`, reprendra la structure d'un overlay existant,
respectera la CSP et la convention `data-js`.

### Ce qu'il faut lui rappeler

- **Ne jamais toucher `_secrets/`** — c'est dans `CLAUDE.md`, mais un rappel
  explicite ne coûte rien sur une session longue.
- **Vérifier avant de commiter** : `git status` puis `git diff --cached`.
- Le hook `pre-commit` bloquera un secret ou un `style=` inline, mais ne
  comptez pas dessus comme unique garde-fou.

---

## 6. Au quotidien

```powershell
# Une modification
git add www/creations/bots.php
git commit -m "Corrige le lien du bot Discord"
git push
```

Le workflow vérifie la syntaxe PHP et JS, cherche des secrets, refuse les
inline interdits par la CSP, puis déploie et teste le site en HTTP.

Suivez l'exécution dans l'onglet **Actions**. Si une étape échoue, rien n'est
envoyé — les vérifications passent avant le déploiement.

### Branche de travail

Pour une modification risquée :

```powershell
git checkout -b chat-emotes
# … travail …
git push -u origin chat-emotes
```

Aucun déploiement ne se déclenche : le workflow ne réagit qu'à `main`. Une
fois satisfait, ouvrez une pull request ou fusionnez.

---

## Ce qui n'est jamais déployé

| Chemin | Raison |
|---|---|
| `_secrets/` | Vit uniquement sur le serveur |
| `_storage/` | Jetons, sessions et logs produits par le serveur |
| `local-musique/` | Tourne sur votre PC |
| `*.md` | La documentation n'a rien à faire dans un espace public |
| `.git*` | Évident, mais à dire |

Si `_storage/` était déployé, chaque push écraserait vos jetons Twitch et il
faudrait réautoriser l'application.

---

## En cas de problème

**Le déploiement échoue sur « Permission denied »** → la clé publique n'est
pas dans `authorized_keys`, ou le fichier n'est pas en `600`. Retestez avec
`sftp -i` comme à l'étape 2.

**Le déploiement passe mais le site est cassé** → l'onglet Actions montre les
codes HTTP de l'étape de vérification. Pour revenir en arrière :

```powershell
git revert HEAD
git push
```

Le déploiement précédent est réappliqué automatiquement.

**Un secret a été commité** → régénérez-le immédiatement chez Twitch. Ne
perdez pas de temps à réécrire l'historique : la valeur est compromise dès
qu'elle a été poussée, et GitHub garde des copies.

**Le workflow supprime des fichiers inattendus** → votre dépôt ne contient pas
tout ce qui est sur le serveur. Récupérez les fichiers manquants en SFTP,
ajoutez-les au dépôt, et relancez une simulation avant de déployer.
