# Installation sur o2switch

Environ vingt minutes. À faire en SSH depuis cPanel.

## 1. Déposer les fichiers

Copiez le dossier `plateforme/` dans votre espace, par exemple `~/plateforme`.
Il ne doit **pas** être dans `public_html` : l'application est servie par
Passenger, pas par Apache.

## 2. Créer l'application Python

Dans cPanel → **Setup Python App** :

| Champ | Valeur |
|---|---|
| Python version | 3.9 ou plus |
| Application root | `plateforme` |
| Application URL | le sous-domaine choisi |
| Application startup file | `passenger_wsgi.py` |
| Application Entry point | `application` |

cPanel crée un environnement virtuel et affiche la commande pour l'activer
(`source /home/VOTRECOMPTE/virtualenv/plateforme/3.11/bin/activate`).
Notez-la, elle sert ensuite.

## 3. Installer les dépendances

```
cd ~/plateforme
source /home/VOTRECOMPTE/virtualenv/plateforme/3.11/bin/activate
pip install -r requirements.txt
```

## 4. Poser la configuration

```
cp .env.exemple .env
nano .env
chmod 600 .env
```

Trois valeurs à renseigner :

- `ANTHROPIC_API_KEY` — la clé créée sur `console.anthropic.com`.
  **C'est un compte distinct de votre abonnement Claude Pro**, avec sa propre
  facturation. Posez-y une limite de dépense mensuelle dès la création.
- `PLATEFORME_MOTDEPASSE` — le mot de passe unique d'accès à l'interface.
- `PLATEFORME_SECRET` — une chaîne aléatoire longue, pour les sessions.
  `python3 -c "import os;print(os.urandom(32).hex())"` en fabrique une.

## 5. Vérifier avant de lancer

```
python verifier_installation.py
```

Sept contrôles. Le cinquième est le seul qui peut condamner l'hébergement :
si `api.anthropic.com` est injoignable, les connexions sortantes sont filtrées
et il faut demander leur ouverture au support. **Un code HTTP 401 est le bon
résultat** : cela signifie que l'API a été atteinte et réclame une clé.

## 6. Poser le cron

Dans cPanel → **Tâches Cron**, toutes les minutes :

```
cd ~/plateforme && /home/VOTRECOMPTE/virtualenv/plateforme/3.11/bin/python worker.py >> worker.log 2>&1
```

C'est ce qui fait tourner les générations. Sans lui, les projets restent en
file indéfiniment.

Le worker s'arrête de lui-même au bout de 150 secondes (`PLATEFORME_BUDGET_SECONDES`)
et reprend au passage suivant : aucun processus ne vit longtemps, et une
coupure ne coûte qu'un tour.

## 7. Aperçu des sites avec PHP

L'aperçu intégré sert les fichiers statiques mais **n'exécute pas le PHP**.
Pour essayer un `contact.php` en conditions réelles, créez un sous-domaine
pointant sur le dossier du projet :

```
ln -s ~/plateforme/projets/<id-du-projet>/site ~/public_html/apercu-client
```

Le site est alors servi par Apache, avec PHP — c'est-à-dire exactement
l'environnement où il finira.

---

# Exploitation

## Vérifier que le worker tourne

```
tail -f ~/plateforme/worker.log
```

Un passage sans travail n'écrit rien : c'est normal.

## Surveiller la dépense

Le coût de chaque projet est affiché dans l'interface, calculé à partir des
jetons réellement consommés. Les tarifs sont dans `projets.py` (`TARIFS`) ;
ajustez-les si la grille change.

## Faire du ménage

Un projet pèse quelques dizaines de mégaoctets. Pour en archiver un :

```
rm -rf ~/plateforme/projets/<id>
```

La ligne reste dans la base ; la page du projet affichera simplement une
archive absente.

## Reprendre un projet bloqué

Un projet en `échec` après six tentatives a probablement rencontré un
problème durable (clé invalide, crédits épuisés, filtrage réseau). Le journal
du projet donne le message exact. Une fois la cause levée, une consigne
depuis l'interface le remet en file.

---

# Ce que la plateforme ne fait pas

- **Pas de captures d'écran automatiques.** Le modèle n'a pas de navigateur.
  L'aperçu est là pour que vous regardiez vous-même, puis corrigiez par
  consigne.
- **Pas d'écriture de binaires.** Images et polices sont déposées par vous et
  rangées automatiquement ; le modèle ne fait que les référencer.
- **Pas d'exécution de scripts générés.** Si le modèle écrit
  `tools/build_elementor.py`, il est livré dans l'archive mais n'est pas
  lancé sur le serveur. Exécutez-le sur votre poste :
  `python3 tools/build_elementor.py`.
- **Pas de comptes.** Un mot de passe unique. Ne publiez pas l'URL.
