Aller au contenu

// NOTE 002

Démarrer un projet sans perdre la première semaine : Next.js, Supabase, GitHub et Vercel

Pour lancer un projet vite, je ne code pas de backend : Supabase fournit la base de données, l’authentification et l’API, Next.js fait le frontend, GitHub garde l’historique et Vercel publie chaque push. Quatre choix faits une fois, gratuits au départ, qui tiennent quand le projet grandit.

Publiée le 5 min de lectureDisponible enENFRAR — Pas encore traduite
  • nextjs
  • supabase
  • vercel
  • mvp
Quatre cartes reliées par des flèches : Next.js (frontend), Supabase (backend), GitHub (git), Vercel (déploiement), au-dessus d’une ligne du temps de 22:50 « commit » à 08:39 « live »
Sur cette page 8 sections

› section 1 / 8

L’hésitation coûte plus cher que le code

Au début d’un projet, on veut tout choisir avec soin : le framework, la base de données, l’hébergement, la gestion des comptes. On compare, on lit des avis, on écrit une API et un système de connexion avant d’avoir montré un seul écran à quelqu’un. Une semaine passe, et le projet n’est toujours pas en ligne.

Mon avis : ces choix se font une seule fois, puis se réutilisent à chaque nouveau projet. J’utilise la même pile partout où je peux :

RôleOutilCe que vous n’avez pas à construire
BackendSupabaseBase Postgres, authentification, stockage de fichiers, API générée depuis vos tables
FrontendNext.jsRoutage, rendu côté serveur, petites fonctions serveur pour la logique sensible
VersionningGitHubHistorique, branches, revues de code avec les pull requests
PublicationVercelUn déploiement à chaque push, une URL de prévisualisation par branche, HTTPS, nom de domaine

Les quatre ont une offre gratuite suffisante pour lancer un projet, et aucun ne vous oblige à tout réécrire le jour où les utilisateurs arrivent.

Ce site est construit comme ça

ossama.ma tourne sur cette pile. Le premier commit date du 6 octobre 2026 à 22 h 50 : Next.js, les trois langues (anglais, français, arabe), le schéma Supabase et des données de test. Quinze minutes plus tard, le README avait sa section de déploiement GitHub + Vercel. Le lendemain à 8 h 39, le site public suivait.

Depuis, la base compte 14 migrations, et un backoffice avec double authentification tourne sur son propre sous-domaine, admin.ossama.ma. Je n’ai pas eu à écrire de serveur d’API séparé.

Le backend : Supabase

Supabase est une base PostgreSQL entourée de ce qu’un backend fait d’habitude : l’inscription et la connexion (email, Google, GitHub…), le stockage des fichiers et une API REST générée à partir de vos tables. Vous créez une table projects, et le frontend la lit en quelques lignes :

lib/projects.tsTS
const { data, error } = await supabase
  .from("projects")
  .select("id, title, published_at")
  .eq("status", "published");

Le point à comprendre dès le premier jour est la sécurité. Le frontend utilise une clé publique, visible par n’importe qui dans le navigateur. Vos données sont protégées par les règles Row Level Security (RLS), écrites en SQL sur chaque table : qui peut lire quelles lignes, qui peut écrire.

supabase/migrations/…_init.sqlSQL
alter table projects enable row level security;
 
create policy "public read of published projects"
  on projects for select
  using (status = 'published');

! ATTENTION

Une table sans RLS est lisible et modifiable par quiconque possède la clé publique, donc par tout visiteur du site. Activez RLS sur chaque table dès sa création, puis ouvrez seulement ce qui doit l’être.

Gardez le schéma dans des fichiers de migration SQL, dans le dépôt, plutôt que de cliquer dans le tableau de bord. La base est alors versionnée comme le code, et vous pouvez la recréer à l’identique sur un deuxième projet : un environnement de test, un client, une autre région.

Le frontend : Next.js

Next.js gère les pages, le routage et le rendu côté serveur, ce qui donne des pages rapides et bien indexées par Google. Il apporte aussi un petit côté serveur avec les Server Actions et les Route Handlers. C’est là que va la logique qui ne doit pas tourner dans le navigateur, par exemple un appel avec la clé secrète de Supabase ou l’envoi d’un email.

Un seul dépôt et un seul langage, TypeScript, couvrent donc l’interface et le peu de serveur dont un projet a besoin au début. La commande supabase gen types typescript génère les types de vos tables, et l’éditeur signale une colonne mal nommée avant même que vous lanciez le site.

Versionning et publication : GitHub et Vercel

GitHub garde l’historique. Vercel se branche sur le dépôt et publie à chaque push, sans serveur à configurer. Mon flux tient en deux branches :

  • develop : chaque push crée une URL de prévisualisation sur Vercel. Je vérifie le résultat sur un vrai lien, téléphone compris.
  • main : la production. On y arrive par une pull request depuis develop, et le merge déclenche la mise en ligne. Si une mise en ligne casse quelque chose, Vercel permet de revenir au déploiement précédent le temps de corriger.

› ASTUCE

Placez les fonctions Vercel dans la même région que la base Supabase. Ce site utilise dub1 (Dublin) pour une base en eu-west-1 (Irlande), donc chaque requête vers la base reste dans la même région.

Le premier soir, commande par commande

terminalBASH
# 1. Le frontend (create-next-app crée aussi le dépôt Git et un premier commit)
npx create-next-app@latest mon-projet
cd mon-projet
 
# 2. Le client Supabase
npm install @supabase/supabase-js @supabase/ssr
 
# 3. Le schéma versionné
npx supabase init
npx supabase migration new init
 
# 4. Le dépôt GitHub
git add . && git commit -m "Supabase setup"
gh repo create mon-projet --private --source=. --push

Ensuite :

  1. Créez un projet sur Supabase et copiez son URL et sa clé publique.
  2. Écrivez vos tables dans le fichier de migration, puis appliquez-le avec npx supabase link et npx supabase db push.
  3. Sur Vercel, importez le dépôt GitHub.
  4. Ajoutez les variables d’environnement NEXT_PUBLIC_SUPABASE_URL et NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY, puis déployez. Le site est en ligne avec HTTPS, une base de données et une authentification prête à brancher. Le reste du temps va à la première fonctionnalité.

Ce que permet le gratuit, et ses limites

Chiffres relevés en octobre 2026 sur les pages officielles de Supabase et de Vercel :

Supabase FreeVercel Hobby
Projets2 projets actifs200 projets
Données500 Mo de base, 1 Go de fichiers100 Go de transfert par mois
Utilisateurs et requêtes50 000 utilisateurs actifs par mois1 million d’invocations de fonctions par mois
À savoirPause après une semaine sans activité, sauvegardes automatiques non inclusesUsage personnel et non commercial uniquement
Offre payantePro à partir de 25 $ par moisPro à 20 $ par utilisateur et par mois

! ATTENTION

Un projet pour un client ou un produit qui gagne de l’argent sort du cadre de Vercel Hobby. Passez au plan Pro de Vercel dès que le projet devient commercial, et au plan Pro de Supabase dès que les données comptent, pour les sauvegardes quotidiennes et pour éviter la mise en pause.

Grandir sans tout réécrire

Quand le projet décolle, la pile reste la même et seuls les plans changent : Supabase Pro puis une instance de calcul plus grande, Vercel Pro, un nom de domaine. Le code ne bouge pas. La même base Supabase peut aussi servir une application mobile React Native, avec le même client supabase-js.

Le risque d’enfermement est plus faible qu’il n’y paraît. Supabase est du PostgreSQL standard : un pg_dump exporte toute la base vers n’importe quel autre hébergeur Postgres. Next.js tourne aussi sur votre propre serveur Node.js ou dans un conteneur Docker si Vercel ne convient plus. Le dépôt GitHub reste à vous quoi qu’il arrive.

La pile a aussi une limite nette. Une fonction Vercel s’arrête après 300 secondes sur le plan gratuit, donc un traitement long (import de gros fichiers, génération de rapports, file de tâches) demandera un worker séparé. Pour un MVP, un site, un outil interne ou une application à quelques milliers d’utilisateurs, cette limite arrive tard.

Oussama Malloud

Oussama Malloud

Ingénieur full-stack & mobile · Rabat

Un projet, ou une question sur cette note ?

Demander l’accès

Autres notes