Blog automatisé avec l'IA — 1/3 : Setup & base de données
Pose les fondations : crée ton projet Supabase, les 2 tables qui stockent articles + mots-clés, et configure les permissions. Aucune ligne de code à écrire — juste du SQL à coller.
Partie 1/3 — Setup & base de données
Pour qui ? Ce guide s'adresse à des débutants. Si tu n'as jamais touché à Supabase, suis pas à pas — chaque action est expliquée.
Ce que tu vas obtenir à la fin de cette partie
- Un projet Supabase opérationnel
- 2 tables prêtes à recevoir tes articles et mots-clés
- Les permissions qui empêchent n'importe qui de tout casser
- Un fichier
.env.localrempli avec les bonnes clés
Temps estimé : 15 minutes
Pré-requis : un compte Supabase gratuit (supabase.com)
Vue d'ensemble du système (les 3 parties du guide)
┌─────────────────────────────────────────────────────┐
│ PARTIE 1 — Setup & base de données ← TU ES ICI │
│ PARTIE 2 — Génération auto via Claude │
│ PARTIE 3 — Admin, indexation Google & déploiement │
└─────────────────────────────────────────────────────┘
À la fin des 3 parties tu auras un blog qui :
- Pioche un mot-clé prioritaire dans une liste
- Génère un article SEO complet via Claude
- Le publie automatiquement après 24h de délai (pour relire)
- Notifie Google pour une indexation en moins de 24h
Coût final : ~1 €/mois d'API Claude.
Étape 1 — Créer ton projet Supabase
- Va sur supabase.com → New project
- Choisis un nom (ex.
mon-blog-ia) et un mot de passe pour la BDD - Sélectionne la région la plus proche (Europe :
eu-west-3Paris) - Attends ~2 min que le projet soit provisionné
💡 Astuce : note le mot de passe quelque part. Tu en auras besoin si tu connectes la BDD depuis un autre outil.
Étape 2 — Créer les 2 tables
Dans ton projet Supabase, ouvre SQL Editor (icône </> dans le menu de gauche) → New query, puis colle ce script et clique Run.
-- Table des articles générés par l'IA
CREATE TABLE seo_articles (
id BIGSERIAL PRIMARY KEY,
title TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE,
meta_description TEXT,
content_html TEXT,
excerpt TEXT,
target_keywords TEXT[],
hero_image_url TEXT,
hero_image_alt TEXT,
schema_json JSONB,
internal_links JSONB,
status TEXT DEFAULT 'draft', -- draft | scheduled | published
lang TEXT DEFAULT 'fr',
cluster TEXT,
word_count INTEGER,
reading_time_min INTEGER,
scheduled_at TIMESTAMPTZ,
published_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Table des mots-clés en attente de génération
CREATE TABLE seo_keywords (
id BIGSERIAL PRIMARY KEY,
keyword TEXT NOT NULL UNIQUE,
lang TEXT DEFAULT 'fr',
cluster TEXT,
volume_est INTEGER,
difficulty INTEGER,
priority INTEGER DEFAULT 80,
status TEXT DEFAULT 'pending', -- pending | used
used_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Lien entre un article et le mot-clé qui l'a généré
ALTER TABLE seo_articles ADD COLUMN keyword_id BIGINT REFERENCES seo_keywords(id);
-- Index pour des requêtes rapides
CREATE INDEX idx_articles_status ON seo_articles(status);
CREATE INDEX idx_articles_slug ON seo_articles(slug);
CREATE INDEX idx_articles_pub ON seo_articles(published_at DESC);
CREATE INDEX idx_keywords_pending ON seo_keywords(status, priority DESC);
Ce que ça fait, en clair :
| Table | Rôle |
|---|---|
seo_articles |
Stocke chaque article généré (titre, contenu HTML, dates, statut) |
seo_keywords |
File d'attente des mots-clés à transformer en article |
Le champ status sur les articles a 3 valeurs :
draft→ article généré mais pas encore validéscheduled→ validé, sera publié àscheduled_atpublished→ en ligne et indexable
Étape 3 — Activer les permissions (RLS)
Par défaut, n'importe qui sur Internet peut lire/écrire dans tes tables. On veut :
- Tout le monde peut lire les articles
published - Seul le serveur (avec la clé secrète) peut écrire
Colle ce 2e script dans SQL Editor → Run :
-- Active la sécurité au niveau des lignes
ALTER TABLE seo_articles ENABLE ROW LEVEL SECURITY;
ALTER TABLE seo_keywords ENABLE ROW LEVEL SECURITY;
-- Lecture publique : seulement les articles "published"
CREATE POLICY "public_read_published"
ON seo_articles FOR SELECT
USING (status = 'published');
-- Le serveur (service_role) peut tout faire
CREATE POLICY "service_role_all_articles"
ON seo_articles FOR ALL
USING (auth.role() = 'service_role');
CREATE POLICY "service_role_all_keywords"
ON seo_keywords FOR ALL
USING (auth.role() = 'service_role');
-- Trigger pour mettre à jour automatiquement updated_at
CREATE OR REPLACE FUNCTION set_updated_at()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
BEGIN NEW.updated_at = NOW(); RETURN NEW; END;
$$;
CREATE TRIGGER seo_articles_updated_at
BEFORE UPDATE ON seo_articles
FOR EACH ROW EXECUTE FUNCTION set_updated_at();
⚠️ Important : sans cette étape, ton blog est ouvert en lecture/écriture à tout Internet. Ne saute pas.
Étape 4 — Récupérer tes clés Supabase
Dans Supabase : Settings → API. Tu y trouves 3 valeurs à copier :
| Clé Supabase | Variable d'env | Usage |
|---|---|---|
| Project URL | NEXT_PUBLIC_SUPABASE_URL |
URL publique de la BDD |
anon public key |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Lecture publique (frontend) |
service_role secret key |
SUPABASE_SERVICE_ROLE_KEY |
Écriture serveur (⚠️ jamais côté client) |
Crée un fichier .env.local à la racine de ton projet Next.js et colle :
# Supabase
NEXT_PUBLIC_SUPABASE_URL=https://xxxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOi...
SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOi...
# Sera utilisé en partie 2
ANTHROPIC_API_KEY=sk-ant-...
CRON_SECRET=remplace-par-un-secret-aleatoire-long
🔒 Ne commit jamais ce fichier. Vérifie qu'il est bien dans ton
.gitignore.
Étape 5 — Vérifier que tout fonctionne
Dans SQL Editor, lance :
SELECT count(*) FROM seo_articles;
SELECT count(*) FROM seo_keywords;
Tu dois voir 0 dans les 2 cas. Si Supabase te répond permission denied, refais l'Étape 3.
✅ Récap : ce que tu as maintenant
- Projet Supabase créé
- 2 tables (
seo_articles+seo_keywords) en place - RLS configurée (sécurité publique/privée)
- Fichier
.env.localrempli
Tu es prêt pour la suite.
📦 Ce que contient le pack à télécharger
README.md— ce guide en markdown001_create_tables.sql— création des 2 tables (Étape 2)002_rls_policies.sql— permissions et trigger (Étape 3).env.example— template des variables d'environnement (Étape 4)
Suite → Partie 2/3 : générer les articles automatiquement avec Claude