rebours/CLAUDE.md
2026-03-30 18:03:12 +02:00

205 lines
5.7 KiB
Markdown

# REBOURS — Documentation technique
## Architecture du projet
```
rebours/
├── src/
│ ├── layouts/
│ │ └── Base.astro # Layout HTML commun (SEO, fonts, CSS)
│ ├── lib/
│ │ └── sanity.mjs # Client Sanity + queries + image helper
│ ├── pages/
│ │ ├── index.astro # Page principale (hero, collection, newsletter)
│ │ ├── collection/
│ │ │ └── [slug].astro # Pages produits statiques (SSG)
│ │ ├── success.astro # Page de confirmation Stripe
│ │ ├── robots.txt.ts # robots.txt généré au build
│ │ └── sitemap.xml.ts # sitemap.xml généré au build
│ └── scripts/
│ └── main.js # JS client (cursor CAD, grid, panel, routing, checkout)
├── public/
│ ├── style.css # CSS global
│ └── assets/ # Images statiques (fallback), favicon, son ambiant
├── sanity/ # Sanity Studio (projet séparé)
│ ├── sanity.config.ts
│ ├── sanity.cli.ts
│ └── schemas/
│ ├── product.ts # Schéma produit
│ └── index.ts
├── server.mjs # Serveur API Fastify (Stripe uniquement)
├── astro.config.mjs # Config Astro (SSG, proxy dev)
├── nginx.conf # Config nginx de référence
└── .env # Variables d'environnement (non versionné)
```
## Stack
| Couche | Techno |
|--------|--------|
| Front (SSG) | Astro + HTML/CSS/JS vanilla + GSAP |
| CMS | Sanity (headless, hébergé) |
| API | Fastify (Node.js) |
| Paiement | Stripe Checkout (price_data inline) |
| Images | Sanity CDN (avec transformations) |
| Reverse proxy | Nginx |
| Hébergement | VPS (Debian) |
| Fonts | Space Mono (Google Fonts) |
---
## Développement local
### Prérequis
- Node.js >= 18
- Un compte Sanity avec un projet créé
- Un fichier `.env` à la racine (voir `.env.example`)
### Variables d'environnement (.env)
```env
SANITY_PROJECT_ID=your_project_id
SANITY_DATASET=production
SANITY_API_TOKEN= # Optionnel
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
DOMAIN=http://localhost:4321
PORT=8888
```
### Lancer le projet
```bash
npm install
npm run dev
```
Cela lance en parallèle (via `concurrently`) :
- `astro dev` sur http://localhost:4321
- `node --watch server.mjs` (mode dev, PORT=8888)
Le proxy Vite dans `astro.config.mjs` redirige `/api/*` vers `http://127.0.0.1:8888`.
### Sanity Studio
```bash
cd sanity
npm install
npx sanity dev
```
Accessible sur http://localhost:3333
### Build
```bash
npm run build
# Génère ./dist/ (fichiers statiques Astro)
```
---
## CMS — Sanity
### Accès
- Studio local : `npx sanity dev`
- Studio déployé : `npx sanity deploy`
- Dashboard : https://www.sanity.io/manage
### Schéma Produit
Champs principaux :
- **name** : Nom technique (Solar_Altar)
- **productDisplayName** : Nom affiché (Solar Altar)
- **slug** : Auto-généré depuis le nom
- **image** : Image avec hotspot + texte alt
- **price** : En centimes (180000 = 1 800 EUR). Vide = non disponible
- **isPublished** : Toggle pour masquer sans supprimer
### Ajouter un produit
1. Ouvrir Sanity Studio
2. Créer un nouveau document "Produit"
3. Remplir les champs, uploader l'image
4. Publier
5. Rebuild le site : `npm run build` + déployer
### Images
Les images sont servies via le CDN Sanity avec transformations automatiques.
---
## Stripe
### Architecture
Le checkout utilise `price_data` inline — pas de prix pré-créés dans Stripe.
Quand un client clique "Commander" :
1. Le front envoie le slug du produit à `/api/checkout`
2. Le serveur fetch le produit depuis Sanity (prix, nom, image)
3. Le serveur crée une session Stripe Checkout avec `price_data`
4. Le client est redirigé vers Stripe
5. Après paiement : `/success?session_id=...`
### Endpoints API
| Route | Méthode | Description |
|-------|---------|-------------|
| `/api/checkout` | POST | Crée une session Stripe Checkout |
| `/api/session/:id` | GET | Vérifie le statut d'une session |
| `/api/webhook` | POST | Reçoit les événements Stripe |
| `/api/health` | GET | Health check |
### Configuration
- Test : clés `sk_test_...` dans `.env`
- Prod : clés `sk_live_...` dans `.env` sur le serveur
- Webhook : `https://rebours.studio/api/webhook`
---
## Production
### Serveur : ordinarthur@10.10.0.13
### Architecture prod
```
Internet -> Nginx (port 80) -> /var/www/html/rebours/dist/ (statiques)
-> /api/* -> proxy -> Fastify :3000
```
### Variables d'environnement en prod
```env
SANITY_PROJECT_ID=...
SANITY_DATASET=production
STRIPE_SECRET_KEY=sk_live_...
STRIPE_WEBHOOK_SECRET=whsec_...
DOMAIN=https://rebours.studio
PORT=3000
```
### Déploiement
```bash
npm run build
scp -r dist/* ordinarthur@10.10.0.13:/tmp/rebours-dist/
ssh ordinarthur@10.10.0.13 "sudo cp -r /tmp/rebours-dist/* /var/www/html/rebours/dist/"
```
Si server.mjs a changé :
```bash
scp server.mjs ordinarthur@10.10.0.13:/tmp/server.mjs
ssh ordinarthur@10.10.0.13 "sudo cp /tmp/server.mjs /var/www/html/rebours/server.mjs && sudo systemctl restart rebours"
```
---
## Routing
| URL | Comportement |
|-----|-------------|
| `/` | Page principale Astro (SSG) |
| `/collection/{slug}` | Page produit (SSG), auto-open panel via `window.__OPEN_PANEL__` |
| `/success?session_id=...` | Page de confirmation Stripe |
| `/robots.txt` | Généré au build |
| `/sitemap.xml` | Généré au build depuis Sanity |
---
## Fichiers à ne jamais versionner
- `.env`
- `node_modules/`
- `dist/`
- `sanity/node_modules/`