Mode d'emploi — de zĂ©ro Ă  dĂ©ployĂ©

Backoffice

Un outil interne pour gĂ©rer des donnĂ©es — exemple : un catalogue produits. Base de donnĂ©es, CRUD, accĂšs protĂ©gĂ© si besoin.

Sommaire
01Initialiser le projet Next.js
02Base de donnĂ©es — Prisma + Supabase
03Authentification — Better Auth
04CRUD Produits
05DĂ©ploiement — Vercel
RĂšgle du jeu : tu tapes chaque commande toi-mĂȘme dans ton terminal, dans l'ordre. Tu ne passes Ă  l'Ă©tape suivante que quand la case « vĂ©rification » est cochĂ©e. Si une commande plante, copie-colle l'erreur exacte — on corrige ensemble, tu ne devines pas.

RĂ©utilisable vs spĂ©cifique : les Ă©tapes rĂ©utilisable sont valables pour n'importe quel projet de ta stack. Les Ă©tapes spĂ©cifique sont propres Ă  ce modĂšle « catalogue produits » — remplace Produit par tes propres donnĂ©es (clients, articles, stock...).
📖 C'est quoi chaque techno (Prisma, Supabase, Better Auth...) ? Le lexique complet est sur la page d'accueil →
01
Réutilisable

Initialiser le projet Next.js

Un projet Next.js qui dĂ©marre en local, avec Tailwind et shadcn/ui prĂȘts Ă  l'emploi.

Prérequis : Node.js installé. Terminal ouvert dans le dossier du projet.

  1. Installe pnpm si besoin
    npm install -g pnpm
    pnpm est le gestionnaire de paquets choisi pour ce projet — plus rapide et plus Ă©conome en espace disque que npm.
    👁 Comment voir le rĂ©sultat : tape pnpm -v. Un numĂ©ro de version s'affiche (ex. 9.12.0) — sinon l'installation a Ă©chouĂ©.
  2. Crée le projet Next.js
    pnpm create next-app@latest . --typescript --tailwind --eslint --app --src-dir=false --import-alias "@/*"
    Le nom du dossier ne doit pas contenir de majuscules (contrainte npm). S'il en contient, crée le projet dans un dossier temporaire au nom valide puis déplace tout son contenu dans ton dossier de travail.
    👁 Comment voir le rĂ©sultat : tape ls. Tu dois voir apparaĂźtre app/, package.json, tailwind.config.ts — la commande a rempli ton dossier de fichiers.
  3. Initialise shadcn/ui
    pnpm dlx shadcn@latest init
    Ça crĂ©e components.json et lib/utils.ts, et prĂ©pare Tailwind pour recevoir des composants shadcn/ui prĂȘts Ă  copier.
    👁 Comment voir le rĂ©sultat : tape ls components.json lib/utils.ts — les deux fichiers doivent exister, sans message d'erreur « No such file ».
  4. Crée l'arborescence du projet
    mkdir -p lib/auth lib/db lib/validations prisma tests
    On sĂ©pare dĂšs le dĂ©part : authentification, accĂšs base de donnĂ©es, schĂ©mas de validation. Ça Ă©vite le fichier fourre-tout de 2000 lignes plus tard.
    👁 Comment voir le rĂ©sultat : tape ls lib — les dossiers auth, db, validations doivent apparaĂźtre.
  5. Initialise Git et fais le premier commit
    git init
    git add -A
    git commit -m "chore: init projet Next.js"
    👁 Comment voir le rĂ©sultat : tape git log --oneline — une ligne avec ton message de commit doit s'afficher.
  6. Lance le serveur et vérifie
    pnpm dev
    Ouvre http://localhost:3000. Si tu as une erreur 500 mentionnant un module introuvable (ex. Can't resolve 'xxx') alors qu'il est bien dans package.json : supprime node_modules, pnpm-lock.yaml et .next, relance pnpm install puis pnpm dev. C'est presque toujours une installation incomplĂšte, pas un bug de code.
    👁 Comment voir le rĂ©sultat : dans ton navigateur, ouvre localhost:3000. Tu dois voir la page d'accueil par dĂ©faut de Next.js (logo, liens « Docs », « Deploy »). Le terminal affiche Ready et n'affiche pas d'erreur rouge.
Vérification
02
Réutilisable

Base de donnĂ©es — Prisma + Supabase

Une base PostgreSQL en ligne, avec une table Produit créée via Prisma.

Prérequis : étape 1 validée.

  1. Crée un projet sur Supabase
    Va sur supabase.com → New project. Choisis un nom, une rĂ©gion proche, et un mot de passe de base de donnĂ©es — note-le quelque part.
    👁 Comment voir le rĂ©sultat : le tableau de bord Supabase affiche ton projet avec un statut « Active » (aprĂšs ~1-2 minutes d'initialisation).
  2. RécupÚre l'URL de connexion
    Dans le projet Supabase : Project Settings → Database → Connection string, mode URI. Copie l'URL complùte (mot de passe inclus).
  3. Installe Prisma
    pnpm add prisma --save-dev
    pnpm add @prisma/client
    pnpm dlx prisma init
    Crée prisma/schema.prisma et un fichier .env avec une variable DATABASE_URL vide.
    👁 Comment voir le rĂ©sultat : tape ls prisma/schema.prisma — le fichier doit exister.
  4. Colle l'URL dans .env
    # .env
    DATABASE_URL="postgresql://postgres:[MOT-DE-PASSE]@[HOST]:5432/postgres"
    Ce fichier ne doit jamais ĂȘtre commit (dĂ©jĂ  dans .gitignore par dĂ©faut) — il contient un mot de passe.
  5. Écris le schĂ©ma
    Dans prisma/schema.prisma, sous les blocs generator/datasource déjà présents, ajoute :
    model Produit {
      id        String   @id @default(cuid())
      nom       String
      quantite  Int      @default(0)
      prix      Float
      categorie String?
      updatedAt DateTime @updatedAt
    }
    Remplace par les champs de tes propres donnĂ©es — un backoffice de clients, d'articles, de commandes suivra exactement le mĂȘme schĂ©ma de raisonnement.
  6. Applique la migration et vérifie
    pnpm dlx prisma migrate dev --name init
    pnpm dlx prisma studio
    migrate dev crée les tables et génÚre le client Prisma typé. studio ouvre une interface web locale pour voir/éditer les données à la main.
    👁 Comment voir le rĂ©sultat : prisma studio ouvre localhost:5555 dans ton navigateur — la table Produit doit apparaĂźtre dans la liste de gauche, vide mais avec ses colonnes (nom, quantite, prix...).
Vérification

PiĂšge frĂ©quent : connexion refusĂ©e → vĂ©rifie qu'aucun caractĂšre spĂ©cial du mot de passe (@, #...) n'est mal encodĂ© dans l'URL. Supabase propose un bouton pour copier l'URL dĂ©jĂ  encodĂ©e.

03
Réutilisable

Authentification — Better Auth

S'inscrire, se connecter, et protéger /dashboard des visiteurs non connectés.

Prérequis : étape 2 validée (schéma Prisma en place). Si l'outil est utilisé par toute l'équipe sans distinction d'accÚs, tu peux sauter cette étape.

  1. Installe Better Auth
    pnpm add better-auth
    👁 Comment voir le rĂ©sultat : better-auth apparaĂźt dans package.json.
  2. Crée la config serveur
    // lib/auth/auth.ts
    import { betterAuth } from "better-auth";
    import { prismaAdapter } from "better-auth/adapters/prisma";
    import { prisma } from "@/lib/db/client";
    
    export const auth = betterAuth({
      database: prismaAdapter(prisma, { provider: "postgresql" }),
      emailAndPassword: { enabled: true },
    });
    CrĂ©e aussi lib/db/client.ts qui exporte une instance unique de PrismaClient — Ă©vite d'en recrĂ©er une Ă  chaque appel.
  3. Ajoute les tables auth au schéma
    pnpm dlx @better-auth/cli generate
    pnpm dlx prisma migrate dev --name add_auth
    Better Auth génÚre automatiquement les modÚles User, Session, Account dans schema.prisma.
    👁 Comment voir le rĂ©sultat : ouvre prisma studio — les tables User, Session, Account doivent maintenant apparaĂźtre dans la liste.
  4. Ajoute le secret dans .env
    # .env
    BETTER_AUTH_SECRET="génÚre une chaßne aléatoire longue"
    BETTER_AUTH_URL="http://localhost:3000"
  5. Crée la route API
    // app/api/auth/[...all]/route.ts
    import { auth } from "@/lib/auth/auth";
    import { toNextJsHandler } from "better-auth/next-js";
    
    export const { GET, POST } = toNextJsHandler(auth);
    👁 Comment voir le rĂ©sultat : relance pnpm dev et ouvre localhost:3000/api/auth/ok (ou tout endpoint Better Auth valide) — tu dois obtenir une rĂ©ponse JSON, pas une erreur 404.
  6. Crée le client auth et les pages
    Un fichier lib/auth/client.ts avec createAuthClient(), puis des pages /signup et /login qui appellent authClient.signUp.email(...) et authClient.signIn.email(...).
    👁 Comment voir le rĂ©sultat : ouvre localhost:3000/signup, crĂ©e un compte test. Puis ouvre prisma studio — une ligne doit apparaĂźtre dans la table User.
  7. ProtĂšge /dashboard
    Un middleware.ts à la racine qui vérifie la session sur les routes /dashboard/* et redirige vers /login si absente.
    👁 Comment voir le rĂ©sultat : ouvre un navigateur en navigation privĂ©e (pas connectĂ©) et va sur localhost:3000/dashboard — tu dois ĂȘtre redirigĂ© vers /login, pas voir le contenu du dashboard.
Vérification

PiĂšge frĂ©quent : si la doc officielle de Better Auth diffĂšre de ce qui est Ă©crit ici, suis la doc — c'est une librairie qui Ă©volue vite. Dis-le moi si un nom de fonction a changĂ©, on ajuste.

04
Spécifique backoffice

CRUD Produits

Créer, lister, modifier et supprimer un produit depuis /dashboard.

Prérequis : étape 3 validée (ou étape 2 si tu as sauté l'authentification).

  1. Ajoute des composants shadcn/ui
    pnpm dlx shadcn@latest add button input table
    👁 Comment voir le rĂ©sultat : ls components/ui — button.tsx, input.tsx, table.tsx doivent apparaĂźtre.
  2. Valide les entrées avec Zod
    // lib/validations/produit.ts
    import { z } from "zod";
    export const produitSchema = z.object({
      nom: z.string().min(1).max(80),
      quantite: z.number().int().min(0),
      prix: z.number().positive(),
      categorie: z.string().optional(),
    });
    👁 Comment voir le rĂ©sultat : pas d'effet visible seul — ce schĂ©ma sera testĂ© concrĂštement Ă  l'Ă©tape suivante, en soumettant un formulaire invalide.
  3. Écris les Server Actions
    // app/dashboard/produits/actions.ts
    "use server";
    // createProduit(formData): valide avec produitSchema, prisma.produit.create(...)
    // updateProduit(id, formData): idem, prisma.produit.update(...)
    // deleteProduit(id): prisma.produit.delete(...)
    Si tu as activĂ© Better Auth, vĂ©rifie la session avant chaque Ă©criture — sinon n'importe qui avec l'URL peut modifier les donnĂ©es.
  4. Construis la page /dashboard/produits
    Un tableau (prisma.produit.findMany()), un formulaire d'ajout, un bouton modifier/supprimer par ligne.
    👁 Comment voir le rĂ©sultat : ouvre localhost:3000/dashboard/produits, ajoute un produit test via le formulaire — il doit apparaĂźtre dans le tableau sans recharger la page manuellement. VĂ©rifie aussi dans Prisma Studio que la ligne existe bien en base.
Vérification
05
Réutilisable

DĂ©ploiement — Vercel

Une URL publique et fonctionnelle.

Prérequis : étape 4 validée.

  1. Ajoute la génération Prisma au build
    // package.json
    "scripts": { "postinstall": "prisma generate" }
    Sans ça, le build Vercel plante — le client Prisma doit ĂȘtre rĂ©gĂ©nĂ©rĂ© aprĂšs chaque install en production.
  2. Pousse le code sur GitHub
    git remote add origin URL-DE-TON-DEPOT
    git push -u origin master
    👁 Comment voir le rĂ©sultat : rafraĂźchis la page du dĂ©pĂŽt sur GitHub — tes fichiers doivent y apparaĂźtre.
  3. Importe le projet sur Vercel
    Sur vercel.com → Add New → Project → sĂ©lectionne le dĂ©pĂŽt GitHub.
    👁 Comment voir le rĂ©sultat : le tableau de bord Vercel passe de « Building » Ă  « Ready », avec un lien de prĂ©visualisation cliquable.
  4. Renseigne les variables d'environnement
    Copie DATABASE_URL, BETTER_AUTH_SECRET, BETTER_AUTH_URL (mets l'URL Vercel finale) dans Settings → Environment Variables.
    👁 Comment voir le rĂ©sultat : pas d'effet visible immĂ©diatement — redĂ©ploie (« Redeploy ») puis teste la connexion en production Ă  l'Ă©tape suivante.
  5. Déploie et vérifie en ligne
    Ouvre l'URL fournie par Vercel, refais le parcours critique à la main : créer un produit, le modifier, le supprimer.
    👁 Comment voir le rĂ©sultat : sur l'URL *.vercel.app, connecte-toi, ajoute un produit — il doit apparaĂźtre dans le tableau exactement comme en local.
Vérification