GuideAutomatisationGratuit

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.

Publié le 28 avril 2026· 3 min de lecture
Télécharger le pack

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.local rempli 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 :

  1. Pioche un mot-clé prioritaire dans une liste
  2. Génère un article SEO complet via Claude
  3. Le publie automatiquement après 24h de délai (pour relire)
  4. Notifie Google pour une indexation en moins de 24h

Coût final : ~1 €/mois d'API Claude.


Étape 1 — Créer ton projet Supabase

  1. Va sur supabase.comNew project
  2. Choisis un nom (ex. mon-blog-ia) et un mot de passe pour la BDD
  3. Sélectionne la région la plus proche (Europe : eu-west-3 Paris)
  4. 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_at
  • published → 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 EditorRun :

-- 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 : SettingsAPI. 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.local rempli

Tu es prêt pour la suite.


📦 Ce que contient le pack à télécharger

  • README.md — ce guide en markdown
  • 001_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

Partie suivante →Blog automatisé avec l'IA — 2/3 : Génération automatique avec Claude
← Retour aux ressources