# 4. Tests, déploiement en production et acquisition de trafic

## Tests

```bash
php artisan test
```

36 tests fonctionnels couvrent : résolution des domaines et alias, isolation des contenus entre sites, sites non indexables en développement, robots/sitemap/ads.txt, données structurées, cache et invalidation, absence de cookies publics, statistiques sans robots, en-têtes de sécurité, règles publicitaires (contenu mince, pages légales, recherche, sites non publiés, désactivation par emplacement, fréquence dans le contenu), droits par rôle, validation et import CSV.

Contrôles complémentaires recommandés avant chaque mise en ligne :

- **Performances / accessibilité / SEO** : Lighthouse ou PageSpeed Insights sur l'accueil, un outil et un article (objectif : 90+ partout, LCP < 2,5 s, CLS < 0,1).
- **Données structurées** : test des résultats enrichis de Google sur un article et un outil.
- **Mobile** : vérification manuelle à 375 px de large (aucun défilement horizontal).
- **Sécurité** : `composer audit` et `npm audit` (0 vulnérabilité au moment de la livraison).

## Déploiement

### Serveur

- PHP 8.2+ (extensions : pdo_mysql, mbstring, intl, gd, opcache), MySQL 8 / MariaDB 10.6+ (ou PostgreSQL), Redis, Nginx, Node 20+ uniquement pour compiler les assets.
- Un VPS de 2 vCPU / 4 Go suffit largement pour démarrer plusieurs sites grâce au cache pleine page.

### Variables d'environnement (production)

```dotenv
APP_ENV=production
APP_DEBUG=false
APP_URL=https://admin.votre-domaine.fr
PLATFORM_ADMIN_DOMAIN=admin.votre-domaine.fr
PLATFORM_FORCE_HTTPS=true
DB_CONNECTION=mysql
CACHE_STORE=redis
SESSION_DRIVER=redis
SESSION_SECURE_COOKIE=true
QUEUE_CONNECTION=redis
TRUSTED_PROXIES=127.0.0.1   # ou les IP du CDN / répartiteur
```

### Nginx (extrait)

Un seul `server` accepte tous les domaines des sites et le domaine d'administration ; Laravel choisit le site d'après le `Host`.

```nginx
server {
    listen 443 ssl http2;
    server_name admin.votre-domaine.fr calculfacile.fr www.calculfacile.fr potager-malin.fr;
    root /var/www/platform/public;
    index index.php;

    location / { try_files $uri $uri/ /index.php?$query_string; }
    location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/run/php/php8.3-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; }
    location /build/ { expires 1y; add_header Cache-Control "public, immutable"; }
    gzip on; gzip_types text/css application/javascript application/xml text/plain;
}
```

Certificats : Let's Encrypt (certbot) avec tous les domaines et leurs `www.`, ou un CDN (Cloudflare) devant le serveur.

### Script de déploiement

```bash
composer install --no-dev --optimize-autoloader
npm ci && npm run build
php artisan migrate --force
php artisan optimize
php artisan storage:link
```

Tâche planifiée (ads.txt quotidien, purge mensuelle des statistiques) :

```cron
* * * * * cd /var/www/platform && php artisan schedule:run >> /dev/null 2>&1
```

Sauvegardes : base de données quotidienne + dossier `storage/app/public` (images).

### Mise en ligne d'un site

1. DNS : enregistrements A/AAAA du domaine et du `www.` vers le serveur.
2. Certificat TLS couvrant les deux.
3. Back-office : domaine principal, alias `www.` redirigé, statut « Publié ».
4. Search Console : propriété de domaine, code de vérification dans les réglages SEO du site, soumission de `/sitemap.xml`.
5. GA4 (facultatif) : identifiant `G-…` dans les réglages SEO du site (chargé uniquement en production, soumis au consentement).

### Évolution : synchronisation automatique des revenus

Pour remplacer l'import CSV, connecter l'**API AdSense Management v2** (compte de service impossible : OAuth 2.0 avec consentement du titulaire, portée `adsense.readonly`), puis une tâche planifiée quotidienne qui appelle `accounts.reports.generate` (dimensions `DATE`, `DOMAIN_NAME` ; métriques `PAGE_VIEWS`, `IMPRESSIONS`, `CLICKS`, `ESTIMATED_EARNINGS`) et alimente `revenue_reports` (source `api`). Le reste du tableau de bord fonctionne sans modification.

## Stratégie d'acquisition de trafic

### Principes

- **Le référencement naturel est le canal principal** : il est durable et produit un trafic de qualité, apprécié des annonceurs.
- **Un contenu = une intention de recherche** précise, traitée mieux que les résultats existants (réponse immédiate, outil, exemples, tableau, FAQ).
- **Jamais de trafic acheté de faible qualité** ni d'échanges de visites : risque direct pour le compte AdSense.

### Plan sur 6 mois (par site)

| Période | Actions |
|---|---|
| Mois 1 | Recherche de mots-clés (Search Console, Google Suggest, « Autres questions posées »), arborescence en silos (catégorie → articles → outils), 10–15 contenus piliers |
| Mois 2–3 | 2 à 3 contenus par semaine ; maillage interne systématique (chaque guide renvoie vers un outil et inversement) ; demande AdSense quand le score de préparation est atteint |
| Mois 3–4 | Analyse Search Console : requêtes en positions 8–20 → enrichir ces pages (sections, FAQ, exemples) ; réécrire les titres à faible CTR |
| Mois 4–6 | Netlinking propre : partenariats éditoriaux, annuaires de qualité, outils intégrables (« widget » avec lien), relations presse/blogueurs ; mises à jour annuelles visibles (date de mise à jour) |

### Canaux complémentaires

- **Pinterest** (très efficace pour le jardinage, la cuisine, le bricolage) : épingles verticales vers les guides.
- **Communautés** (forums, groupes) : répondre utilement, sans spam, en citant le guide quand il apporte la réponse.
- **Newsletter** (vague 2) : fidélisation et trafic récurrent indépendant de Google.
- **Saisonnalité** : publier les contenus saisonniers 6 à 8 semaines avant le pic (ex. semis de tomates en janvier–février).

### Indicateurs à suivre

- Search Console : impressions, clics, CTR, position moyenne, pages indexées.
- Plateforme : pages vues internes, pages les plus consultées, score de préparation.
- AdSense (import) : RPM page, CTR, revenus estimés — à comparer entre niches pour décider où investir.
