Cahier des charges · v1.0
Plateforme d’analyse de marché, de pilotage d’un réseau de blogs et de suivi de la monétisation par articles sponsorisés. Déploiement sur VPS dédié, sans WordPress.
Le projet ne partage rien avec la production ÉcosystèmeImmo. Ni serveur, ni base, ni Redis, ni nginx.
Le serveur actuel est à 26 Go de RAM utilisés sur 31, 549 Mo libres, swap de 8 Go saturé à 100 %, disque à 89 % et 19 conteneurs actifs. Un next build consomme 1 à 2 Go : l’y ajouter fait tomber la production existante. Ce n’est pas une précaution de principe, c’est une contrainte mesurée.
| Ressource | Minimum | Confortable | Justification |
|---|---|---|---|
| vCPU | 4 | 8 | Builds statiques en parallèle, Postgres, workers |
| RAM | 8 Go | 16 Go | Un build Next + 3 builds Astro simultanés ≈ 3 Go |
| Disque NVMe | 100 Go | 200 Go | node_modules, builds, sauvegardes locales, images |
| Système | Ubuntu 24.04 LTS, accès SSH par clé uniquement | Support long, Docker natif | |
Budget indicatif : 25 à 45 €/mois pour la configuration confortable. À confirmer sur l’offre réelle avant commande — non vérifié à ce stade.
| Service | Image | Port | Exposé | Rôle |
|---|---|---|---|---|
app | build local Next.js | 3100 | via nginx | Dashboard + API |
worker | build local Node | — | non | BullMQ : scans, génération, builds, publication |
db | postgres:16-alpine | 5432 | non | Base unique du projet |
redis | redis:7-alpine | 6379 | non | File de jobs + cache |
nginx | nginx:alpine | 80/443 | oui | Reverse proxy + vhosts des blogs statiques |
Postgres et Redis ne publient aucun port sur l’hôte. Uniquement un réseau Docker interne. Aucun 0.0.0.0 sur une base de données, jamais.
pg_dump quotidien à 03:00, compression, conservation 30 jours.Fichier /etc/blogfactory/env, permissions 0600, propriétaire root, hors dépôt. Le fichier .env.example du dépôt ne contient que des valeurs factices. Validation au démarrage : l’application refuse de démarrer si une variable requise manque.
Monorepo, un seul langage, un seul déploiement. L’IA écrit du contenu, jamais du code de site.
blogfactory/
├── apps/
│ ├── app/ # Next.js 15 App Router — dashboard + API REST
│ └── worker/ # process BullMQ séparé (pas de job dans l’API)
├── packages/
│ ├── db/ # schéma Drizzle + migrations versionnées
│ ├── core/ # scoring, calculs financiers, règles métier pures
│ ├── ai/ # routeur multi-fournisseurs, prompts, suivi des coûts
│ └── site-template/ # thème Astro + schéma de config par site
├── infra/
│ ├── docker-compose.yml
│ ├── nginx/ # un vhost par domaine de blog
│ └── scripts/ # backup, restore-test, deploy
└── superpowers/ # (option) skills du projet
| Couche | Choix | Raison |
|---|---|---|
| Dashboard + API | Next.js 15, TypeScript | Un framework pour l’UI et l’API, écosystème maximal |
| Blogs publiés | Astro, export statique | Zéro JS, build léger, aucune base par site, aucune surface d’attaque |
| Base | PostgreSQL 16 + Drizzle | SQL explicite et typé, adapté à un modèle financier auditable |
| File de jobs | BullMQ + Redis | Reprise, idempotence, workers isolés |
| Auth | Better Auth | Auto-hébergé, sessions en cookie httpOnly |
| IA | Vercel AI SDK | Fournisseurs interchangeables, coût par appel tracé |
| Validation | Zod | Sur toutes les entrées, sans exception |
Un seul template de site, une configuration par domaine. Le pipeline produit du Markdown enrichi et des métadonnées. Si l’IA génère la structure de chaque site, dix bases de code divergent en trois mois et plus rien n’est maintenable. C’est le mode d’échec classique des usines à sites.
Le PRD d’origine proposait neuf modules. Cinq entrent en v1, le reste attend une preuve de revenu.
| Module | Contenu v1 | Critère d’acceptation |
|---|---|---|
| M1 · Marché | Fiches niches, saisie des observations (prix relevés, annonceurs, concurrence), source et date obligatoires | Toute donnée affichée porte sa source, sa date et un niveau de confiance |
| M2 · Plateformes | Annuaire, critères d’admission, statut de vérification, suivi des candidatures | Aucune plateforme n’apparaît « accessible » sans statut vérifié et daté |
| M3 · Sites | Fiche par site : domaine, niche, réseau, statut, coût prévu, rôle dans le réseau | Un site se crée en brouillon, sans achat de domaine ni publication automatique |
| M4 · Contenus | Briefs, génération assistée, revue humaine obligatoire, build et publication | Aucune publication sans validation explicite tracée au journal |
| M5 · Finance | Opportunités, commandes, factures, encaissements, dépenses, marge par site | Les cinq états sont distincts et jamais fusionnés dans un même total |
| Transverse | Auth, rôles, journal d’audit, quotas, alertes | Chaque action sensible est attribuée à un utilisateur et horodatée |
| Domaine | Tables |
|---|---|
| Accès | users, sessions, audit_logs |
| Marché | niches, networks, market_observations, data_sources, scores |
| Plateformes | platforms, platform_rules, applications |
| Sites | sites, domains, site_costs |
| Contenus | briefs, content_items, reviews, publish_jobs |
| Finance | opportunities, orders, invoices, payments, expenses |
| Système | jobs, ai_usage, budgets, alerts |
Contrainte structurante : orders, invoices, payments et expenses sont quatre tables distinctes. Une commande n’est jamais un revenu. Un tableau de bord qui additionne les quatre est un tableau de bord faux.
Trois réseaux thématiques, dix sites, deux vagues de cinq. Le critère de sélection est la densité d’annonceurs observée sur les plateformes, pas le volume de recherche.
| Réseau | Site | Angle | Panier / article | Risque principal |
|---|---|---|---|---|
| A · Habitat & énergie 4 sites |
Pompes à chaleur & aides | MaPrimeRénov’, gestes, comparatifs d’installateurs | 80–150 € | YMYL léger, aides qui changent souvent |
| Isolation & DPE | Diagnostics, travaux par type de logement | 70–120 € | Contenu technique à sourcer | |
| Piscine & jardin | Saisonnalité assumée, entretien et équipement | 60–110 € | Creux de novembre à février | |
| Aménagement intérieur | Petits travaux, budget, avant/après | 60–100 € | Concurrence éditoriale forte | |
| B · Tourisme & terroir 3 sites |
Escapades week-end France | Par région, itinéraires deux jours | 70–130 € | Saisonnalité, contenu à renouveler |
| Œnotourisme | Domaines, routes des vins, dégustations | 90–180 € | Loi Évin : mentions obligatoires | |
| Randonnée & itinérances | Traces, refuges, équipement | 60–120 € | Peu d’annonceurs locaux | |
| C · B2B pratique 3 sites |
Logiciels & outils TPE | Comparatifs d’outils, cas d’usage métier | 150–400 € | Annonceurs exigeants sur la qualité |
| Financement PME | Aides, subventions, prêts par secteur | 150–350 € | YMYL, sources officielles obligatoires | |
| Création d’entreprise | Formalités, statuts, obligations | 150–300 € | Contenu juridique à faire relire |
Fourchettes de prix = ordres de grandeur du marché français des articles sponsorisés, à confirmer par un relevé réel sur Ereferer, Soumettre et Getfluence avant tout engagement. Elles ne sont pas vérifiées à ce stade et ne doivent pas servir de base à un emprunt.
Un article B2B se vend deux à quatre fois plus cher qu’un article grand public, pour un coût de production comparable. Passer de 4 à 7 sites B2B fait monter le prix moyen encaissé de 85 à 130 € et avance le point mort de cinq mois. C’est le levier le plus puissant du modèle, devant le nombre de sites.
Dix sites, deux vagues, dix-huit mois. Les hypothèses sont explicites et modifiables ; ce ne sont pas des promesses.
| Hypothèse | Valeur | Note |
|---|---|---|
| Sites lancés | 10 | 5 en M1, 5 en M3 |
| Articles par site au lancement | 12 | Base éditoriale minimale pour candidater |
| Rythme ensuite | 4 / mois / site | 40 articles par mois sur le réseau |
| Coût par article | 10 € | Génération assistée + relecture humaine |
| Premier site admis | M5 | Les plateformes exigent un historique |
| Sites admis à M12 | 7 / 10 | Taux d’acceptation 70 % après un an |
| Commandes par site admis | 0,8 → 2,5 / mois | Montée en charge progressive |
| Prix moyen encaissé | 70 → 100 € | Commission de plateforme déduite |
| Charges fixes | 475 € / mois | VPS 35 €, IA 30 €, domaines 10 €, contenu courant 400 € |
| Investissement initial | 1 200 € | 120 articles de lancement |
| Mois | Sites admis | Commandes | Encaissé | Charges | Trésorerie cumulée |
|---|---|---|---|---|---|
| M1–M4 | 0 | 0 | 0 € | 3 100 € | −3 100 € |
| M5 | 2 | 2 | 112 € | 475 € | −3 463 € |
| M6 | 3 | 2 | 168 € | 475 € | −3 770 € |
| M7 | 3 | 2 | 168 € | 475 € | −4 077 € |
| M8 | 4 | 3 | 224 € | 475 € | −4 328 € |
| M9 | 5 | 8 | 562 € | 475 € | −4 241 € |
| M10 | 6 | 9 | 720 € | 475 € | −3 996 € |
| M11 | 6 | 9 | 720 € | 475 € | −3 751 € |
| M12 | 7 | 11 | 892 € | 475 € | −3 334 € |
| M13 | 7 | 18 | 1 575 € | 475 € | −2 234 € |
| M14 | 8 | 20 | 1 800 € | 475 € | −909 € |
| M15 | 8 | 20 | 1 900 € | 475 € | +516 € |
| M16 | 8 | 20 | 1 900 € | 475 € | +1 941 € |
| M17 | 8 | 20 | 2 000 € | 475 € | +3 466 € |
| M18 | 8 | 20 | 2 000 € | 475 € | +4 991 € |
Trésorerie cumulée, scénario central — 18 mois. Creux max −4 328 € (M8), point mort M15, pic +4 991 € (M18).
| Prudent | Central | Optimiste | |
|---|---|---|---|
| Coût par article | 25 € | 10 € | 6 € |
| Premier site admis | M7 | M5 | M4 |
| Sites admis à M12 | 3 / 10 | 7 / 10 | 8 / 10 |
| Commandes / site / mois à M12 | 1,0 | 1,5 | 2,2 |
| Prix moyen encaissé | 75 € | 85 € | 105 € |
| CA mensuel à M18 | 540 € | 2 000 € | 3 080 € |
| Trésorerie cumulée la plus basse | −12 000 € | −4 328 € | −1 260 € |
| Retour sur investissement | jamais à 18 mois | M15 | M11 |
Avec de la rédaction humaine à 25 € l’article, les charges montent à 1 065 € par mois pour un CA de 540 € à M18 : le projet perd 500 € par mois au bout d’un an et demi, indéfiniment. Ce n’est pas un pessimisme de précaution, c’est le calcul. La viabilité du modèle repose entièrement sur un coût de contenu inférieur à 12 € l’article.
Investissement maximal, central
4 328 €
Trésorerie à financer avant retour positif
Point mort, central
Mois 15
Trois mois plus tôt en mix B2B renforcé
Charges fixes mensuelles
475 €
Contenu courant inclus, hors investissement initial
Seuil de viabilité du contenu
≤ 12 €
Coût par article au-delà duquel la marge disparaît
| Si… | Alors… |
|---|---|
| Le coût par article passe de 10 à 15 € | +200 € de charges/mois, point mort repoussé d’environ 4 mois |
| 5 sites B2B au lieu de 3 | Prix moyen +45 €, point mort avancé de 4 à 5 mois |
| Le taux d’admission plafonne à 50 % | CA divisé par 1,4, point mort au-delà de M20 |
| Une plateforme disparaît ou suspend le réseau | Perte de 40 à 60 % du CA selon la dépendance |
| Deux sites sont pénalisés par Google | Perte du trafic, donc de l’admission : ces sites sortent du modèle |
Les plateformes visées vendent des articles avec lien suivi. La politique anti-spam de Google classe l’achat et la vente de liens comme manipulation. Les deux ne peuvent pas être vrais en même temps : soit les liens sont marqués rel="sponsored" et le prix baisse fortement, soit ils sont suivis et chaque site porte un risque de pénalité qui peut annuler l’actif. Ce choix n’est pas technique, il est commercial. Il doit être écrit noir sur blanc avant le Lot 1, parce qu’il détermine le prix moyen, donc toute la provision de ventes ci-dessus.
| Risque | Impact | Parade |
|---|---|---|
| Pénalité moteur sur un ou plusieurs sites | Perte du trafic et de l’admission | Qualité éditoriale réelle, pas de liens croisés, diversification des niches |
| Refus d’admission sur les plateformes | Zéro revenu malgré les coûts | Tester l’admission dès le mois 4 sur les 2 sites les plus avancés |
| Dépendance à une seule plateforme | Arrêt brutal du CA | Minimum trois plateformes actives par site admis |
| Coût du contenu qui dérape | Marge nulle | Suivi du coût réel par article, alerte au-delà de 12 € |
| Dérive du périmètre technique | Le projet devient un produit, pas un revenu | Cinq modules en v1, pas neuf ; le reste après preuve de revenu |
| Perte du VPS | Arrêt de la plateforme, blogs statiques toujours en ligne | Sauvegardes hors serveur, restauration testée chaque mois |
| Lot | Livrable | Durée | Condition de passage |
|---|---|---|---|
| 0 | VPS provisionné, Docker, nginx, sauvegardes, monitoring | 1 sem. | Restauration testée avec succès |
| 1 | Socle : base, auth, fiche site, annuaire plateformes | 2 sem. | Un site se crée en brouillon, aucune publication possible |
| 2 | Marché : niches, observations sourcées, scoring explicable | 2 sem. | Chaque score affiche ses sous-scores et ses données manquantes |
| 3 | Template Astro, build, publication sur domaine | 2 sem. | Un site publié, statique, sans base de données |
| 4 | Finance : commandes, factures, encaissements, dépenses | 2 sem. | Les quatre états restent distincts dans tous les écrans |
| 5 | Contenus : brief, génération, revue, coût par article | 3 sem. | Aucune publication sans validation tracée |
Total : environ 12 semaines pour la v1 complète. Les lots 1 et 3 peuvent être menés en parallèle pour publier un premier site en cinq semaines et tester l’admission plus tôt.