[{"data":1,"prerenderedAt":1221},["ShallowReactive",2],{"blog-fr-test-your-supabase-backup":3,"blog-index-fr":868},{"id":4,"title":5,"body":6,"category":824,"cover":825,"coverAlt":826,"description":827,"draft":828,"extension":829,"faq":830,"image":846,"keywords":847,"meta":856,"navigation":857,"ogTitle":5,"path":858,"published":859,"seo":860,"stem":861,"tldr":862,"updated":866,"__hash__":867},"blog_fr\u002Fblog\u002Ftest-your-supabase-backup.md","Testez votre sauvegarde Supabase avant d'en avoir besoin",{"type":7,"value":8,"toc":808},"minimark",[9,13,21,24,29,32,35,39,42,146,155,161,165,172,186,211,221,238,243,247,250,275,301,319,329,332,347,351,354,428,436,469,473,476,482,490,493,503,509,512,573,577,583,589,595,616,622,626,634,637,643,646,650,657,672,675,679,682,685,688,692,697,747,759,763,795],[10,11,12],"p",{},"Quelque part, il y a un fichier qui contient votre base de données. Une GitHub\nAction en écrit un chaque nuit, ou vous avez lancé une fois les trois commandes\nde sauvegarde de Supabase, ou votre plan prend des copies quotidiennes. Il a le\nbon nom et à peu près la taille attendue. Personne ne l'a jamais ouvert.",[10,14,15,16,20],{},"Voici la partie que les guides d'installation remettent à plus tard : ",[17,18,19],"strong",{},"une\nsauvegarde qui n'a jamais été restaurée est une affirmation, pas une copie.","\nLa seule façon de tester une sauvegarde Supabase est de la restaurer, exprès,\nà un endroit où rien n'en dépend, et de regarder ce qui revient. Un dump coupé\nà mi-chemin, un dump sans aucune ligne et un dump du mauvais projet dorment\ntous dans le stockage avec exactement l'air d'un bon.",[10,22,23],{},"Pensez à un exercice d'évacuation. Un bâtiment l'organise un matin ordinaire,\nquand rien ne brûle, parce que personne ne devrait descendre cet escalier pour\nla première fois le jour où il se remplit de fumée. Dehors, quelqu'un compte\nles présents d'après la liste de ceux qui étaient à l'intérieur, et quelqu'un\nnote la date sur la feuille près de la porte. Un exercice de restauration,\nc'est la même chose : faire le trajet, compter, noter.",[25,26,28],"h2",{"id":27},"comment-savoir-si-ma-sauvegarde-supabase-fonctionne-vraiment","Comment savoir si ma sauvegarde Supabase fonctionne vraiment ?",[10,30,31],{},"Restaurez-la et regardez. C'est le seul test qui existe, parce que rien dans le\nfichier lui-même ne sépare une bonne sauvegarde d'une sauvegarde cassée.",[10,33,34],{},"L'exercice prend votre copie la plus récente, la rejoue dans un projet qui ne\ncompte pas, et pose trois questions au résultat. Chaque table est-elle là, avec\nà peu près autant de lignes qu'en production ? La ligne la plus récente\ndate-t-elle de la nuit où la copie a été prise ? Pouvez-vous vous connecter en\nvotre nom ? Un bon fichier répond oui aux trois, et chaque façon dont une\nsauvegarde tourne mal échoue à au moins une d'entre elles.",[25,36,38],{"id":37},"cinq-façons-dont-une-sauvegarde-est-fausse-et-a-pourtant-lair-juste","Cinq façons dont une sauvegarde est fausse et a pourtant l'air juste",[10,40,41],{},"Les cinq se terminent sans erreur dans la nuit, et les cinq laissent un fichier\nau nom habituel, à l'endroit habituel. Elles ne se distinguent qu'au moment où\nle fichier est rejoué.",[43,44,45,61],"table",{},[46,47,48],"thead",{},[49,50,51,55,58],"tr",{},[52,53,54],"th",{},"Ce qui ne va pas dans le fichier",[52,56,57],{},"Comment il en arrive là, le plus souvent",[52,59,60],{},"L'étape de l'exercice qui le repère",[62,63,64,88,106,124,135],"tbody",{},[49,65,66,70,85],{},[67,68,69],"td",{},"Il s'arrête en cours de route",[67,71,72,73,77,78,81,82,84],{},"Un script qui envoie ",[74,75,76],"code",{},"pg_dump"," dans ",[74,79,80],{},"gzip"," rapporte ce qu'a fait ",[74,83,80],{},". Un dump mort à mi-chemin est donc enregistré, et le job annonce un succès. Un disque plein ou un envoi abandonné font la même chose",[67,86,87],{},"La ligne de fin, puis les comptages",[49,89,90,93,103],{},[67,91,92],{},"Il a vos tables et aucune de leurs lignes",[67,94,95,98,99,102],{},[74,96,97],{},"supabase db dump"," a été lancé sans ",[74,100,101],{},"--data-only",", qui n'écrit alors que la structure",[67,104,105],{},"Les comptages : chaque table à zéro",[49,107,108,111,117],{},[67,109,110],{},"Il a les lignes et aucun des comptes",[67,112,113,114],{},"Le dump n'a nommé que votre propre schéma, et vos utilisateurs vivent dans un schéma appelé ",[74,115,116],{},"auth",[67,118,119,120,123],{},"La recherche de ",[74,121,122],{},"auth.users",", puis la connexion",[49,125,126,129,132],{},[67,127,128],{},"Ce sont les données d'un autre projet",[67,130,131],{},"La connection string pointe vers une copie de staging ou un ancien projet",[67,133,134],{},"La ligne la plus récente, du mauvais jour",[49,136,137,140,143],{},[67,138,139],{},"Il ne se charge pas du tout",[67,141,142],{},"Un dump de Postgres 17 rejoué dans Postgres 15, ou des lignes de propriétaire que le nouveau projet refuse",[67,144,145],{},"La restauration s'arrête sur une erreur",[10,147,148,149,154],{},"La deuxième et la troisième sont le sujet de\n",[150,151,153],"a",{"href":152},"\u002Fblog\u002Fsupabase-backup-auth-users","pourquoi votre dump Supabase ne contient aucun utilisateur",",\net toutes deux viennent d'une commande de dump lancée avec moins d'options\nqu'il ne lui en fallait. La première nous a surpris, elle a donc droit à une\nsection à elle.",[156,157],"diagram",{"alt":158,"caption":159,"src":160},"Six fichiers scellés identiques en rangée, chacun tombant dans une base restaurée. La première a des tables pleines et un registre de personnes, cochée. Cinq sont barrées : une table tronquée à côté d'une vide, toutes les tables vides, un registre vide, des lignes grises marquées différent, et un import arrêté par une barre.","Dans le stockage, les six fichiers se ressemblent. Rejoué, seul le premier vous rend la base que vous aviez.","\u002Fblog\u002Ftest-your-supabase-backup\u002Fsix-files-one-good-copy-1600x760.png",[25,162,164],{"id":163},"un-fichier-de-sauvegarde-coupé-échoue-t-il-à-la-restauration","Un fichier de sauvegarde coupé échoue-t-il à la restauration ?",[10,166,167,168,171],{},"Pas toujours. Nous en avons coupé un au milieu d'une table, nous l'avons\nrejoué avec les options qu'utilise le guide de Supabase lui-même, et ",[74,169,170],{},"psql"," a\nterminé sans erreur.",[10,173,174,175,177,178,181,182,185],{},"Le test était petit et facile à refaire. Le 27 septembre 2026, nous avons fait\nle dump d'une base de deux tables, l'une de 5 000 lignes et l'autre de 300,\ncoupé le fichier à trois endroits différents, et rejoué chaque version avec\n",[74,176,170],{}," de Postgres 17.11. Chaque essai utilisait ",[74,179,180],{},"--single-transaction"," et\n",[74,183,184],{},"--variable ON_ERROR_STOP=1",", les deux options censées arrêter une\nrestauration au premier problème et tout annuler.",[187,188,189,199,205],"ul",{},[190,191,192,195,196,198],"li",{},[17,193,194],{},"Coupé au milieu d'une valeur",", ",[74,197,170],{}," s'est arrêté sur une erreur et n'a\nrien écrit. C'est le résultat qu'on espère.",[190,200,201,204],{},[17,202,203],{},"Coupé dans la dernière colonne d'une ligne",", il a terminé avec le code de\nsortie 0, la façon dont un programme annonce qu'il a réussi. La première\ntable est revenue avec 2 596 de ses 5 000 lignes, la dernière amputée de la\nmoitié de son texte, et la seconde est revenue vide.",[190,206,207,210],{},[17,208,209],{},"Coupé exactement entre les deux tables",", il a aussi terminé avec 0. La\npremière table était complète et la seconde vide.",[10,212,213,214,217,218,220],{},"La raison tient à la façon dont un dump range les lignes. Les lignes de chaque\ntable forment un bloc qui se termine par une ligne contenant seulement ",[74,215,216],{},"\\.",",\net quand le fichier s'arrête avant cette ligne, ",[74,219,170],{}," prend la fin du fichier\npour la fin du bloc. Le seul signe qu'il devait y avoir une suite est une ligne\nqui aurait dû se trouver tout à la fin.",[10,222,223,224,226,227,230,231,234,235,237],{},"Cette ligne, c'est la signature de ",[74,225,76],{},". Un dump complet contient les mots\n",[74,228,229],{},"PostgreSQL database dump complete"," vers sa fin, et un dump coupé ne les\ncontient pas. Des trois fichiers qu'écrit la CLI Supabase, la ligne ne survit\nque dans ",[74,232,233],{},"data.sql",", parce que la CLI retire tous les commentaires du fichier\nde schéma (vérifié avec la version 2.111 de la CLI). C'est donc ",[74,236,233],{}," qu'il\nfaut fouiller, et cette recherche est la deuxième étape de l'exercice.",[156,239],{"alt":240,"caption":241,"src":242},"Un fichier au bord inférieur déchiré alimente une étape de restauration marquée ON_ERROR_STOP=1 avec une coche verte. Au-delà, deux tables : la première remplie à moitié, 2596 sur 5000, avec sa dernière ligne déchirée ; la seconde vide, 0 sur 300.","Le rejeu a annoncé un succès. La première table est revenue à moitié pleine et la seconde vide.","\u002Fblog\u002Ftest-your-supabase-backup\u002Fa-short-file-restores-clean-1600x680.png",[25,244,246],{"id":245},"où-la-restaurer","Où la restaurer ?",[10,248,249],{},"Dans un projet Supabase qui ne compte pas : un projet d'exercice dans votre\ncompte, ou un Supabase qui tourne sur votre propre ordinateur. Jamais dans le\nprojet qu'utilise votre app.",[10,251,252,255,256,262,263,268,269,274],{},[17,253,254],{},"Un projet Supabase d'exercice"," est ce qui ressemble le plus à votre vrai\nprojet, et c'est la cible pour laquelle\n",[150,257,261],{"href":258,"rel":259},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmigrating-within-supabase\u002Fbackup-restore",[260],"nofollow","le guide de sauvegarde et de restauration de Supabase","\nest écrit : sa première étape consiste à créer un nouveau projet. Avec le plan\ngratuit, vous avez\n",[150,264,267],{"href":265,"rel":266},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fbilling-faq",[260],"droit à deux projets gratuits actifs",",\net les projets en pause ne comptent pas, donc un projet d'exercice ne coûte en\ngénéral rien tant que votre base tient dans le plan gratuit. Dans une\norganisation payante, le calcul d'un nouveau projet est\n",[150,270,273],{"href":271,"rel":272},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmanage-your-usage\u002Fcompute",[260],"facturé à l'heure"," :\nsupprimez-le une fois l'exercice terminé.",[10,276,277,280,281,292,293,296,297,300],{},[17,278,279],{},"Supabase sur votre propre ordinateur"," ne coûte rien et ne demande aucun\ncompte. La CLI Supabase fait tourner toute la pile en local dans Docker :\n",[150,282,285,288,289],{"href":283,"rel":284},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Flocal-development\u002Fcli\u002Fgetting-started",[260],[74,286,287],{},"supabase init",", puis ",[74,290,291],{},"supabase start",",\net elle affiche une adresse de base sur le port 54322 et une publishable key\npour le projet local. Avant de le lancer, ouvrez ",[74,294,295],{},"supabase\u002Fconfig.toml"," et\nréglez ",[74,298,299],{},"major_version"," sur la version majeure de Postgres de votre projet. Le\ncommentaire au-dessus de ce réglage précise qu'elles doivent correspondre, et\nla version de votre projet se trouve dans Project Settings, puis General.",[10,302,303,304,306,307,310,311,313,314,318],{},"Il y a un piège sur Postgres 15. Sauf si la tâche de sauvegarde a fixé une\nversion, la CLI a pris la copie avec ",[74,305,76],{}," 17, et le fichier de données\ncontient alors, près du début, ",[74,308,309],{},"SET transaction_timeout = 0",", un réglage que\nPostgres 15 ne reconnaît pas : le rejeu s'arrête sur cette ligne. Pour\nl'exercice, réglez ",[74,312,299],{}," sur 17. Ajoutez ensuite à la tâche de\nsauvegarde la correction d'une ligne décrite dans\n",[150,315,317],{"href":316},"\u002Fblog\u002Fsupabase-backup-github-action","l'article sur la GitHub Action",", car le\nprojet dans lequel vous restaureriez pour de vrai est toujours en 15.",[10,320,321,322,324,325,328],{},"Un Postgres nu dans Docker, sans rien de Supabase dedans, ne suffit pas. Un\ndump Supabase fait référence à des choses que seul Supabase crée, comme le\nschéma ",[74,323,116],{}," où vivent vos utilisateurs et le rôle ",[74,326,327],{},"authenticated"," que\nnomment vos règles de sécurité, et la restauration s'arrête à la première\nligne qui en mentionne une.",[10,330,331],{},"Une précaution, parce que le projet d'exercice contient maintenant une vraie\ncopie. Les adresses e-mail de vos utilisateurs y figurent : ne branchez ni votre\napp ni ses webhooks dessus, et supprimez-le quand vous avez fini.",[10,333,334,335,338,339,342,343,346],{},"Les tâches planifiées sont la partie qui ne suit pas. Si votre projet en exécute\navec l'extension ",[74,336,337],{},"pg_cron",", les trois fichiers de la CLI ramènent l'extension et\naucune de ses tâches, parce que les tâches sont des lignes de ",[74,340,341],{},"cron.job"," et que\nle dump des données laisse ces lignes de côté. Nous l'avons vérifié le 4 octobre\n2026 avec la version 2.119 de la CLI, en restaurant une base qui avait une tâche\nplanifiée. Le projet d'exercice reste donc silencieux, et une vraie restauration\nà partir de ces fichiers démarre elle aussi sans aucune tâche planifiée : gardez\nvos appels à ",[74,344,345],{},"cron.schedule"," quelque part d'où vous pourrez les relancer.",[25,348,350],{"id":349},"comment-tester-une-sauvegarde-supabase-étape-par-étape","Comment tester une sauvegarde Supabase, étape par étape",[10,352,353],{},"Six étapes, et les trois premières ont lieu avant de restaurer quoi que ce\nsoit.",[355,356,357,363,385,401,416,422],"ol",{},[190,358,359,362],{},[17,360,361],{},"Trouvez la copie la plus récente et lisez sa date."," Si elle est plus\nancienne que la dernière exécution prévue, le job s'est arrêté, et c'est\nvotre première découverte.",[190,364,365,374,375],{},[17,366,367,368,77,371,373],{},"Cherchez ",[74,369,370],{},"dump complete",[74,372,233],{},"."," Une occurrence signifie que\nle fichier est allé jusqu'au bout. Aucune signifie qu'il a été coupé, quelle\nque soit sa taille. La recherche d'un éditeur de texte marche aussi bien\nqu'un terminal :",[376,377,382],"pre",{"className":378,"code":380,"language":381},[379],"language-text","grep -c 'dump complete' data.sql\n","text",[74,383,380],{"__ignoreMap":384},"",[190,386,387,390,391,394,395],{},[17,388,389],{},"Cherchez-y vos utilisateurs."," Une ligne qui commence par\n",[74,392,393],{},"COPY \"auth\".\"users\"",", suivie de lignes de données, signifie que vos comptes\nsont dans le fichier :",[376,396,399],{"className":397,"code":398,"language":381},[379],"grep -n 'COPY .*auth.*users' data.sql\n",[74,400,398],{"__ignoreMap":384},[190,402,403,406,407,373,410],{},[17,404,405],{},"Rejouez-le dans le projet d'exercice"," avec la commande du guide de\nSupabase, pointée vers la connection string du projet d'exercice. Pour un\nSupabase local, cette chaîne est\n",[74,408,409],{},"postgresql:\u002F\u002Fpostgres:postgres@127.0.0.1:54322\u002Fpostgres",[376,411,414],{"className":412,"code":413,"language":381},[379],"psql \\\n  --single-transaction \\\n  --variable ON_ERROR_STOP=1 \\\n  --file roles.sql \\\n  --file schema.sql \\\n  --command 'SET session_replication_role = replica' \\\n  --file data.sql \\\n  --dbname \"postgresql:\u002F\u002F…the spare's connection string…\"\n",[74,415,413],{"__ignoreMap":384},[190,417,418,421],{},[17,419,420],{},"Comptez les lignes et lisez la plus récente",", dans les deux bases. La\nrequête est dans la section suivante.",[190,423,424,427],{},[17,425,426],{},"Connectez-vous en votre nom au projet d'exercice."," La commande est dans\nla section d'après.",[10,429,430,431,435],{},"Si l'étape 4 s'arrête sur une erreur, l'exercice a fait son travail en avance.\nLes notes de dépannage en bas du guide de Supabase couvrent les deux erreurs\nles plus fréquentes, toutes deux liées aux rôles, et\n",[150,432,434],{"href":433},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","comment restaurer une sauvegarde Supabase","\nexplique ce dont chaque option de cette commande vous protège.",[10,437,438,439,442,443,446,447,450,451,454,455,458,459,462,463,468],{},"Deux autres arrêts dans ",[74,440,441],{},"roles.sql"," manquent à ces notes. Nous les avons\nrencontrés tous les deux le 4 octobre 2026, en rejouant les fichiers de deux\nbases Postgres 17, dont un projet Supabase, dans une copie locale neuve de\nSupabase : ",[74,444,445],{},"\"supabase_admin\" is a reserved role, only superusers can modify it",",\nsur une ligne qui commence par ",[74,448,449],{},"ALTER ROLE \"supabase_admin\"",", et\n",[74,452,453],{},"permission denied for parameter log_min_messages",", sur une ligne qui commence\npar ",[74,456,457],{},"GRANT SET ON PARAMETER",". Ces deux lignes configurent des rôles que Supabase\ncrée lui-même dans chaque projet : mettez ",[74,460,461],{},"--"," au début de chacune pour la\ntransformer en commentaire, puis relancez la commande.\n",[150,464,467],{"href":465,"rel":466},"https:\u002F\u002Fgithub.com\u002FReeve-page\u002Fsupabase-backup-action",[260],"Notre Action de sauvegarde","\nles met en commentaire dès qu'elle prend la copie.",[25,470,472],{"id":471},"quoi-compter-et-par-rapport-à-quoi","Quoi compter, et par rapport à quoi",[10,474,475],{},"Comptez chaque table dans le projet d'exercice et dans votre projet en\nproduction avec la même requête, et mettez les deux listes côte à côte. La\ncopie doit avoir une nuit de retard sur la production : un peu plus basse sur\nune table qui grandit, et jamais à zéro sur une table qui avait des lignes.",[10,477,478,479,481],{},"C'est l'appel des présents d'après la liste de ceux qui étaient à l'intérieur.\nCollez la requête dans l'éditeur SQL de chaque projet et appuyez sur Run. Elle\ncompte les lignes de chaque table de votre propre schéma et de ",[74,480,116],{}," :",[376,483,488],{"className":484,"code":486,"language":487,"meta":384},[485],"language-sql","select table_schema, table_name,\n       (xpath('\u002Frow\u002Fn\u002Ftext()',\n         query_to_xml(format('select count(*) as n from %I.%I', table_schema, table_name),\n                      false, true, '')))[1]::text::bigint as row_count\n  from information_schema.tables\n where table_schema in ('public', 'auth')\n   and table_type = 'BASE TABLE'\n order by table_schema, table_name;\n","sql",[74,489,486],{"__ignoreMap":384},[10,491,492],{},"Elle lit chaque ligne de chaque table : sur une grosse base, lancez-la en\ndehors de vos heures les plus chargées.",[10,494,495,496,499,500,481],{},"Lisez ensuite la ligne la plus récente d'une table que vous connaissez, dans le\nprojet d'exercice seulement. N'importe quelle table avec une colonne\n",[74,497,498],{},"created_at"," fera l'affaire ; mettez son nom à la place de ",[74,501,502],{},"orders",[376,504,507],{"className":505,"code":506,"language":487,"meta":384},[485],"select max(created_at) from public.orders;\n",[74,508,506],{"__ignoreMap":384},[10,510,511],{},"La réponse doit être proche de l'heure à laquelle la sauvegarde a tourné. Une\ndate plus ancienne de plusieurs semaines, ou des lignes que vous ne\nreconnaissez pas, signifient que le fichier vient d'un autre projet.",[43,513,514,527],{},[46,515,516],{},[49,517,518,521,524],{},[52,519,520],{},"Vérification",[52,522,523],{},"Où",[52,525,526],{},"Ce que montre une bonne copie",[62,528,529,540,551,563],{},[49,530,531,534,537],{},[67,532,533],{},"Les lignes de chaque table",[67,535,536],{},"Les deux",[67,538,539],{},"Les mêmes tables, chacune un peu en retard sur la production, aucune vide qui avait des lignes",[49,541,542,545,548],{},[67,543,544],{},"La ligne la plus récente",[67,546,547],{},"Projet d'exercice",[67,549,550],{},"Une heure de la nuit où la copie a été prise",[49,552,553,556,558],{},[67,554,555],{},"Votre propre compte",[67,557,547],{},[67,559,560,561],{},"Votre e-mail dans ",[74,562,122],{},[49,564,565,568,570],{},[67,566,567],{},"Une connexion",[67,569,547],{},[67,571,572],{},"Un jeton revient",[25,574,576],{"id":575},"pourquoi-la-connexion-est-le-test-qui-prouve-vos-comptes","Pourquoi la connexion est le test qui prouve vos comptes",[10,578,579,580,582],{},"Un comptage de ",[74,581,122],{}," prouve que les lignes sont arrivées. Une connexion\nprouve qu'elles fonctionnent : que le mot de passe enregistré, le service de\nconnexion du projet d'exercice et votre adresse e-mail s'accordent encore.",[10,584,585,586,588],{},"Utilisez votre propre compte, avec un mot de passe que vous connaissez.\nL'adresse du projet et la publishable key du projet d'exercice sont dans son\npanneau Connect, ou dans la sortie de ",[74,587,291],{}," pour un Supabase local :",[376,590,593],{"className":591,"code":592,"language":381},[379],"curl -X POST 'https:\u002F\u002F…the spare's project ref….supabase.co\u002Fauth\u002Fv1\u002Ftoken?grant_type=password' \\\n  -H \"apikey: sb_publishable_…\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"email\": \"you@example.com\", \"password\": \"…\"}'\n",[74,594,592],{"__ignoreMap":384},[10,596,597,598,603,604,607,608,611,612,615],{},"C'est l'appel de connexion de\n",[150,599,602],{"href":600,"rel":601},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Fpasswords",[260],"la documentation de Supabase elle-même",",\ndirigé vers le projet d'exercice. Une réponse qui contient ",[74,605,606],{},"access_token","\nsignifie que votre compte est arrivé avec un mot de passe qui marche.\n",[74,609,610],{},"Invalid login credentials",", pour un compte qui se connecte sans problème sur\nvotre app en production, signifie qu'il n'est pas arrivé, et\n",[150,613,614],{"href":152},"pourquoi un dump arrive sans les comptes","\nest l'article pour ce résultat.",[10,617,618,619,621],{},"Si tout le monde se connecte à votre app avec Google, cet appel n'a rien à\ntester, parce que le projet d'exercice n'a pas de connexion Google configurée.\nCherchez plutôt votre propre e-mail dans ",[74,620,122],{}," après la restauration.\nCela montre que la ligne du compte est arrivée, mais pas que son mot de passe\nfonctionne.",[25,623,625],{"id":624},"les-fichiers-la-moitié-quune-restauration-de-base-ne-peut-pas-tester","Les fichiers : la moitié qu'une restauration de base ne peut pas tester",[10,627,628,629,633],{},"La copie de la base contient une ligne pour chaque fichier envoyé, et aucun des\nfichiers. Si vous copiez vos buckets Storage avec un job à part, ce qui\n",[150,630,632],{"href":631},"\u002Fblog\u002Fsupabase-storage-backup","est la seule façon dont ils sont copiés",",\nfaites faire l'exercice à cette copie aussi.",[10,635,636],{},"Prenez les trois lignes les plus récentes dans la base restaurée :",[376,638,641],{"className":639,"code":640,"language":487,"meta":384},[485],"select bucket_id, name from storage.objects order by created_at desc limit 3;\n",[74,642,640],{"__ignoreMap":384},[10,644,645],{},"Retrouvez ces trois chemins dans votre copie des fichiers et ouvrez chacun\nd'eux. Un chemin sans fichier derrière est une image que vos utilisateurs\nverraient cassée après une vraie restauration.",[25,647,649],{"id":648},"peut-on-tester-les-sauvegardes-que-supabase-fait-pour-vous","Peut-on tester les sauvegardes que Supabase fait pour vous ?",[10,651,652,653,373],{},"Avec un plan payant, oui, avec Restore to a New Project. C'est la seule façon\nd'ouvrir l'une des copies quotidiennes de Supabase, car sur les projets\nactuels\n",[150,654,656],{"href":655},"\u002Fblog\u002Fdownload-your-supabase-backup","vous ne pouvez pas les télécharger",[10,658,659,660,665,666,195,668,671],{},"Supabase présente la fonction comme un moyen de\n",[150,661,664],{"href":662,"rel":663},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fclone-project",[260],"tester sans risque",".\nChoisissez une copie dans l'onglet Restore to a New Project de la page Backups,\net Supabase en construit un nouveau projet avec vos utilisateurs et leurs mots\nde passe hachés, prêt pour les mêmes comptages et la même connexion. Deux\nchoses à savoir avant d'appuyer. Le nouveau projet est facturé comme un projet\nà part entière, et Supabase vous en montre le coût avant de commencer. Et il\ncopie tout, tâches planifiées comprises : Supabase indique que les tâches de\n",[74,667,337],{},[74,669,670],{},"pg_net"," et des wrappers démarrent dès la fin de la restauration,\nsans moyen de les mettre en pause avant. Si une tâche de votre app envoie des\ne-mails ou débite une carte, le projet de test le fera aussi.",[10,673,674],{},"Si vous gardez aussi un fichier hors du compte, ce fichier a besoin de son\npropre exercice.",[25,676,678],{"id":677},"à-quelle-fréquence-tester-une-restauration","À quelle fréquence tester une restauration ?",[10,680,681],{},"Une fois maintenant, puis tous les trois mois, et de nouveau dès que quelque\nchose change dans la façon dont la sauvegarde est prise.",[10,683,684],{},"Les changements qui comptent sont ceux qui cassent une sauvegarde sans bruit :\nun workflow nouveau ou modifié, un mot de passe de base réinitialisé, un\npassage à un nouveau plan ou à une nouvelle version de Postgres, une nouvelle\ntable dans laquelle votre app s'est mise à écrire. Après chacun d'eux,\nl'exercice du trimestre dernier ne décrit plus le fichier de ce trimestre.",[10,686,687],{},"Ensuite, notez-le : c'est la feuille près de la porte. Une ligne par exercice,\nà un endroit que vous pouvez atteindre sans ce qui est tombé en panne : la\ndate, quel fichier, les comptages qui comptaient, si la connexion a marché, et\ncombien de temps a duré l'exercice entier. Un fichier texte dans le dépôt de\nsauvegarde suffit, tout comme une entrée d'agenda récurrente où vous collez les\nrésultats. La date répond à « quand l'avons-nous prouvé pour la dernière fois »\ndans l'heure où quelqu'un a besoin de le savoir, et la durée est votre première\nestimation du temps pendant lequel une vraie restauration mettrait votre app à\nl'arrêt.",[25,689,691],{"id":690},"où-reeve-care-intervient","Où Reeve Care intervient",[10,693,694],{},[17,695,696],{},"Care garde des copies de votre base Supabase hors de votre compte Supabase,\nselon l'horaire de votre plan, vérifie chaque copie au moment où elle est\nprise, et la remet en place d'un bouton.",[187,698,699,705,714,720,726,732],{},[190,700,701,704],{},[17,702,703],{},"Les copies suivent l'horaire de votre plan",", d'une fois par jour à toutes\nles six heures.",[190,706,707,710,711,713],{},[17,708,709],{},"Une copie coupée est repérée au moment où elle est prise."," La ligne de fin\nde ",[74,712,76],{}," doit être dans le fichier, sinon la copie échoue à la\nvérification et ne devient jamais la date affichée dans votre tableau de\nbord.",[190,715,716,719],{},[17,717,718],{},"Chaque table est comptée pendant que la copie s'écrit."," Quand une table\nqui avait des lignes dans la copie précédente n'en a plus aucune dans\ncelle-ci, une personne chez Reeve en est informée.",[190,721,722,725],{},[17,723,724],{},"Vos comptes sont dans la copie",", et vos fichiers envoyés suivent dès que\nvous connectez un accès Storage.",[190,727,728,731],{},[17,729,730],{},"Restaurer, c'est un bouton",", et une copie de l'état actuel est prise avant\nque quoi que ce soit ne soit remplacé.",[190,733,734,737,738,195,741,743,744,746],{},[17,735,736],{},"Chaque copie se télécharge en zip"," avec ",[74,739,740],{},"schema.sql",[74,742,233],{},",\n",[74,745,441],{}," et un manifeste qui donne le nombre de lignes de chaque table :\nla moitié « par rapport à quoi » de cet article, déjà écrite.",[10,748,749,750,450,754,758],{},"Un exercice trimestriel prouve la copie que vous avez choisie ce jour-là, et la\nvérification porte sur chaque copie au moment où elle est prise. La copie, la\nvérification et la restauration sont dessinées étape par étape sur la\n",[150,751,753],{"href":752},"\u002Fsupabase-backups","page des sauvegardes Supabase",[150,755,757],{"href":756},"\u002Fpricing","ce que comprend chaque plan",", horaire compris, est sur la page des\ntarifs.",[25,760,762],{"id":761},"que-faire-cette-semaine","Que faire cette semaine",[764,765,766],"key-takeaways",{},[187,767,768,771,781,787,790,792],{},[190,769,770],{},"Trouvez votre sauvegarde la plus récente et lisez sa date. Si elle est plus ancienne que la dernière exécution prévue, réparez le job avant tout le reste.",[190,772,367,773,775,776,77,778,780],{},[74,774,370],{}," et ",[74,777,393],{},[74,779,233],{},". Deux recherches vous disent si le fichier va jusqu'au bout et si vos comptes y sont.",[190,782,783,784,786],{},"Créez un projet d'exercice, ou lancez Supabase sur votre propre ordinateur, et rejouez le fichier avec la commande ",[74,785,170],{}," du guide de Supabase.",[190,788,789],{},"Lancez la requête de comptage sur les deux bases et mettez les deux listes côte à côte. Lisez la ligne la plus récente d'une table que vous connaissez.",[190,791,426],{},[190,793,794],{},"Notez la date, les comptages et la durée, puis supprimez le projet d'exercice.",[10,796,797,798,800,801,803,804,807],{},"Avant de fermer cet onglet, cherchez ",[74,799,370],{}," dans votre ",[74,802,233],{}," le\nplus récent. C'est une seule recherche, et elle vous dit si le fichier que vous\nappelez une sauvegarde atteint sa propre dernière ligne. Si vous n'avez pas\nencore de fichier à fouiller,\n",[150,805,806],{"href":316},"une GitHub Action gratuite"," est la façon\nla plus rapide de commencer à en produire.",{"title":384,"searchDepth":809,"depth":809,"links":810},3,[811,813,814,815,816,817,818,819,820,821,822,823],{"id":27,"depth":812,"text":28},2,{"id":37,"depth":812,"text":38},{"id":163,"depth":812,"text":164},{"id":245,"depth":812,"text":246},{"id":349,"depth":812,"text":350},{"id":471,"depth":812,"text":472},{"id":575,"depth":812,"text":576},{"id":624,"depth":812,"text":625},{"id":648,"depth":812,"text":649},{"id":677,"depth":812,"text":678},{"id":690,"depth":812,"text":691},{"id":761,"depth":812,"text":762},"Backups","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcover-1200x630.png","Une rangée de fichiers de sauvegarde scellés identiques, le premier éclairé, près d'une base vide en pointillés qui en attend un.","Comment tester votre sauvegarde Supabase : la restaurer dans un projet d'exercice, compter les lignes, se connecter, chercher la ligne qui manque.",false,"md",[831,833,835,838,841,844],{"q":28,"a":832},"Restaurez-la dans un projet qui ne compte pas et regardez ce qui revient. Comparez le nombre de lignes de chaque table avec la base en production, vérifiez que la ligne la plus récente date de la nuit où la copie a été prise, et connectez-vous en votre nom. Rien dans le fichier lui-même ne distingue un bon dump d'un dump cassé : son nom, sa taille et la coche verte à côté du job sont les mêmes dans les deux cas.",{"q":678,"a":834},"Une fois maintenant, puis tous les trois mois, et de nouveau dès que la façon dont la sauvegarde est prise change : un workflow nouveau ou modifié, un mot de passe de base réinitialisé, un nouveau plan ou une nouvelle version de Postgres, ou une nouvelle table dans laquelle votre app écrit. Notez la date à chaque fois, avec les comptages et la durée, pour que la question de la dernière preuve ait une réponse.",{"q":836,"a":837},"Peut-on tester une restauration sans toucher à la base en production ?","Oui, et c'est toujours ainsi qu'il faut faire. Restaurez dans un projet Supabase d'exercice, ce que le plan gratuit permet, ou dans un Supabase qui tourne sur votre propre ordinateur grâce à la CLI et à Docker. L'exercice se contente de lire la base en production une fois, pour compter ses lignes. Supprimez le projet d'exercice ensuite, car il contient une vraie copie de vos utilisateurs.",{"q":839,"a":840},"Que vérifier après avoir restauré une sauvegarde ?","Quatre choses. Le nombre de lignes de chaque table à côté de celui de la production, la copie devant être un peu en retard et jamais à zéro pour une table qui avait des lignes. La ligne la plus récente d'une table que vous connaissez, qui doit dater de la nuit de la copie. Votre propre e-mail dans auth.users. Et une connexion en votre nom, la seule vérification qui prouve que les comptes fonctionnent et pas seulement qu'ils sont arrivés.",{"q":842,"a":843},"La restauration a marché, mais personne ne peut se connecter. Pourquoi ?","Le plus souvent parce que le fichier n'a jamais contenu vos comptes. Supabase les garde dans un schéma appelé auth, et un dump qui ne nomme que votre propre schéma, ou un supabase db dump sans option, les laisse de côté pendant que chacune de vos tables se restaure proprement. Cherchez d'abord COPY \"auth\".\"users\" dans le fichier. S'il manque, faites un dump des données avec --data-only, qui parcourt le schéma auth et emporte vos utilisateurs.",{"q":164,"a":845},"Pas toujours. Nous avons coupé un fichier pg_dump à trois endroits et rejoué chaque version avec --single-transaction et ON_ERROR_STOP, les options du guide de restauration de Supabase. Une coupure au milieu d'une valeur s'est arrêtée sur une erreur. Une coupure dans la dernière colonne d'une ligne et une coupure entre deux tables ont toutes deux terminé sans erreur, avec des tables incomplètes. Un dump complet porte la ligne PostgreSQL database dump complete vers sa fin : cherchez-la avant de faire confiance à un fichier.","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",[848,849,850,851,852,853,854,855],"tester sauvegarde supabase","vérifier sauvegarde supabase","test de restauration supabase","tester une sauvegarde de base de données","restaurer une sauvegarde dans une base de test","ma sauvegarde supabase fonctionne-t-elle","vérification sauvegarde supabase","exercice de restauration",{},true,"\u002Fblog\u002Ftest-your-supabase-backup","2026-09-28",{"title":5,"description":827},"blog\u002Ftest-your-supabase-backup",[863,864,865],"Pour tester une sauvegarde Supabase, restaurez-la dans un projet qui ne compte pas, comparez ses nombres de lignes avec la base en production et connectez-vous en votre nom. Seule une restauration distingue un bon fichier d'un fichier cassé.","Nous avons coupé un dump au milieu d'une table et l'avons rejoué avec les options que recommande Supabase. psql a terminé sans erreur, et les tables sont revenues incomplètes.","Faites l'exercice une fois maintenant, puis tous les trois mois et après tout changement dans la façon dont la sauvegarde est prise, et notez la date à chaque fois.","2026-10-05","Dot3NtQrFv4RjA6iz3bLJNlEDi05At84hartLLsFjn4",[869,876,882,888,894,900,906,911,917,923,929,935,941,947,948,953,958,963,969,975,980,986,992,998,1004,1010,1016,1022,1028,1033,1039,1045,1051,1057,1063,1069,1075,1081,1087,1093,1099,1105,1111,1117,1123,1129,1135,1141,1147,1153,1158,1164,1170,1176,1182,1187,1193,1199,1205,1210,1216],{"path":870,"title":871,"description":872,"published":873,"category":874,"image":875,"draft":828},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" à l'upload","\"New row violates row-level security policy for table objects\" signifie que votre upload n'a pas de règle insert. Rendre le bucket public n'en ajoute aucune.","2026-10-11","Bases de la sécurité","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":877,"title":878,"description":879,"published":880,"category":874,"image":881,"draft":828},"\u002Fblog\u002Fbase44-security-scan","Scan de sécurité Base44 : ce que lui seul peut voir","Le scan de sécurité Base44 vérifie sept types de problèmes depuis l’intérieur. Voici la moitié que lui seul lit, et celle qu’il ne regarde jamais.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":883,"title":884,"description":885,"published":886,"category":874,"image":887,"draft":828},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Votre clé API a fuité. L'ordre dans lequel agir","Une clé API a fuité et vous ne savez pas par quoi commencer. Toutes les clés de votre frontend n'en sont pas une, et l'ordre compte plus que la vitesse.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":889,"title":890,"description":891,"published":892,"category":874,"image":893,"draft":828},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" sans désactiver RLS","\"Infinite recursion detected in policy for relation\" signifie que votre policy a interrogé la table qu'elle protège. Voici comment rompre le cercle.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":895,"title":896,"description":897,"published":898,"category":874,"image":899,"draft":828},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" sur Supabase, et le mauvais correctif","\"No API key found in request\" veut dire que votre requête est arrivée sans clé. La plupart des réponses pointent vers les règles de votre base.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":901,"title":902,"description":903,"published":904,"category":874,"image":905,"draft":828},"\u002Fblog\u002Fis-base44-safe","Base44 est-il sûr ? Ce que 5 442 applications ont montré","Base44 est-il sûr ? Neuf vérifications sur 5 442 applications Base44 en ligne. Presque toutes ont eu un B, pour des raisons que personne n’a choisies.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":907,"title":908,"description":909,"published":866,"category":874,"image":910,"draft":828},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Cacher une clé API : la déplacer dans une Edge Function Supabase","Cacher une clé API veut dire la sortir du navigateur, et une Edge Function Supabase est le plus petit endroit où la mettre. Deux étapes comptent davantage.","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":912,"title":913,"description":914,"published":915,"category":874,"image":916,"draft":828},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Votre fichier .env est-il exposé ? Les douze chemins à vérifier","Votre fichier .env est-il exposé sur votre propre serveur web ? Douze adresses vous le disent, et une réponse signifie que tout son contenu est public.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":918,"title":919,"description":920,"published":921,"category":874,"image":922,"draft":828},"\u002Fblog\u002Fis-v0-safe","Sécurité de v0 : les 1 790 applications scannées ont toutes eu A","La sécurité de v0 mesurée sur 1 790 applications en ligne : toutes ont eu A. Seules 17 citaient une base de données, et c’est surtout cela que ce A mesure.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":924,"title":925,"description":926,"published":927,"category":874,"image":928,"draft":828},"\u002Fblog\u002Fis-bolt-safe","Bolt est-il sûr ? Ce que 1 123 applications Bolt ont montré","Bolt est-il sûr ? Neuf vérifications sur 1 123 applications Bolt en ligne. L’hébergement était propre. Les trouvailles : des clés et des tables ouvertes.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":930,"title":931,"description":932,"published":933,"category":874,"image":934,"draft":828},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase en panne, ou est-ce votre app ? Comment le savoir","Supabase est-il en panne, ou est-ce votre app ? Un projet en pause, une base pleine et un bug chez vous se ressemblent. Quatre vérifications les séparent.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":936,"title":937,"description":938,"published":939,"category":874,"image":940,"draft":828},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Supabase chiffre-t-il mes données ? Oui. Ce que cela arrête","Supabase chiffre-t-il les données ? Oui : AES-256 au repos, TLS en transit, SOC 2 et ISO 27001. Ce que couvre chacun, et la fuite qu'aucun n'arrête.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":942,"title":943,"description":944,"published":945,"category":874,"image":946,"draft":828},"\u002Fblog\u002Fsupabase-free-plan-limits","Limites du plan gratuit Supabase : ce qui se passe à chacune","Les limites du plan gratuit Supabase : 500 Mo de base, 5 Go d'egress, aucune sauvegarde. Ce qui se passe à chaque seuil, et ce que change Pro à $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":858,"title":5,"description":827,"published":859,"category":824,"image":846,"draft":828},{"path":316,"title":949,"description":950,"published":951,"category":824,"image":952,"draft":828},"Sauvegarde Supabase gratuite avec une GitHub Action, et le piège","Une sauvegarde Supabase par GitHub Action est gratuite et convient à beaucoup d'apps. Le workflow, la bonne connection string et l'egress de chaque run.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":655,"title":954,"description":955,"published":956,"category":824,"image":957,"draft":828},"Pourquoi vous ne pouvez pas télécharger votre sauvegarde Supabase","Impossible de télécharger votre sauvegarde Supabase sur un projet récent : la copie quotidienne est physique. Comment le vérifier et garder la vôtre.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":959,"title":960,"description":961,"published":956,"category":874,"image":962,"draft":828},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\" : le grant manquant","Dès le 30 octobre, une nouvelle table Supabase répond \"permission denied for table\" tant que l'accès n'est pas accordé. Le grant de l'e-mail est la moitié.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":964,"title":965,"description":966,"published":967,"category":874,"image":968,"draft":828},"\u002Fblog\u002Fopen-api-endpoint-exposed","Un endpoint d'API ouvert est-il un problème de sécurité ?","Votre scan a signalé un endpoint d'API ouvert. Que cela compte dépend de ce qui est revenu, et la plupart de ceux trouvés étaient à la plateforme.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":970,"title":971,"description":972,"published":973,"category":874,"image":974,"draft":828},"\u002Fblog\u002Flovable-security-scan","Scan de sécurité Lovable : ce qu’il ne peut pas prouver","Scan de sécurité Lovable : ce que vérifient le Quick scan et le Deep scan, quand chacun part, et la seule chose qu’un scan de l’intérieur ne prouve pas.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":152,"title":976,"description":977,"published":978,"category":824,"image":979,"draft":828},"Pourquoi votre dump Supabase ne contient aucun utilisateur","Lancez supabase db dump tout seul et vous obtenez la forme de votre base et aucune de ses lignes, sans le schéma auth où vivent vos utilisateurs.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":981,"title":982,"description":983,"published":984,"category":874,"image":985,"draft":828},"\u002Fblog\u002Fdomain-and-certificate-expiry","Domaine expiré, site hors ligne : ce qui se passe ensuite","Votre domaine a expiré et votre site est hors ligne. Le compte à rebours qui démarre, pourquoi le certificat est le moindre souci, et comment vérifier les deux.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":987,"title":988,"description":989,"published":990,"category":874,"image":991,"draft":828},"\u002Fblog\u002Fis-lovable-safe","Lovable est-il sûr ? Ce que 18 554 applications Lovable ont montré","Lovable est-il sûr ? 18 554 applications, neuf vérifications. La plateforme était la plus propre des cinq. Les trouvailles étaient dans les applications.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":993,"title":994,"description":995,"published":996,"category":874,"image":997,"draft":828},"\u002Fblog\u002Fvibe-coded-app-security-checklist","La checklist de sécurité du vibe coding, en neuf vérifications","Une checklist de sécurité du vibe coding en neuf points, chacun vérifiable de l’extérieur sur votre appli en ligne, et chacun avec un test d’une ligne.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":999,"title":1000,"description":1001,"published":1002,"category":874,"image":1003,"draft":828},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Une clé secrète Stripe dans votre frontend peut déplacer de l’argent","Une clé secrète Stripe exposée dans votre frontend peut rembourser, débiter et lire chaque fiche client que vous détenez. Votre clé pk_live_ y a sa place.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":1005,"title":1006,"description":1007,"published":1008,"category":874,"image":1009,"draft":828},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variables d’environnement Vite exposées : le préfixe dit publier","Variables d’environnement Vite exposées : votre appli a fait ce que le préfixe demandait. VITE_ et NEXT_PUBLIC_ veulent dire publier, et l’IA ignorait le prix.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":1011,"title":1012,"description":1013,"published":1014,"category":874,"image":1015,"draft":828},"\u002Fblog\u002Fbase44-source-maps","Sécurité Base44 : ce qu’un scan signale, et ce qui dépend de vous","Sécurité Base44 sur 5 438 applis : trois signalements sur presque chacune sont ceux de la plateforme, la source map est le badge Base44, votre part est courte.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":1017,"title":1018,"description":1019,"published":1020,"category":874,"image":1021,"draft":828},"\u002Fblog\u002Fis-cursor-ai-safe","Cursor AI est-il sûr ? L’éditeur, le code et l’appli publiée","Cursor AI est-il sûr ? Trois questions dans une recherche : ce que Cursor garde, ce que son code rate, et si l’appli que vous avez publiée est ouverte.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":1023,"title":1024,"description":1025,"published":1026,"category":874,"image":1027,"draft":828},"\u002Fblog\u002Fis-replit-safe","Replit est-il sûr ? Ce que 3 042 applications Replit nous ont montré","Replit est-il sûr ? 3 042 applications Replit en ligne, neuf vérifications externes. Les trouvailles étaient dans l’application publiée, pas chez l’hébergeur.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":631,"title":1029,"description":1030,"published":1031,"category":824,"image":1032,"draft":828},"Supabase storage backup : votre copie de base n'a aucun fichier","Un Supabase storage backup est une tâche à part. Les sauvegardes de la base gardent la liste de vos fichiers et aucun des fichiers, donc chaque upload casse.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":1034,"title":1035,"description":1036,"published":1037,"category":824,"image":1038,"draft":828},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery Supabase : prix et limites","Le point-in-time recovery de Supabase rembobine votre base à la seconde près sur la dernière semaine. $100 par mois en plus de Pro, et rien que la base.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":1040,"title":1041,"description":1042,"published":1043,"category":824,"image":1044,"draft":828},"\u002Fblog\u002Fsupabase-project-paused-recover","Projet Supabase en pause ? Vos données sont toujours là","Supabase a mis votre projet en pause après une semaine sans activité. Rien n'est supprimé, Restaurer est à côté du nom, et vous avez un an pour cliquer.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":1046,"title":1047,"description":1048,"published":1049,"category":874,"image":1050,"draft":828},"\u002Fblog\u002Fsafest-ai-app-builder","Quel builder d'app IA est le plus sûr ? 30 998 apps testées","Quel builder d'app IA est le plus sûr ? Nous avons scanné 30 998 apps actives de Lovable, Base44, Replit, v0 et Bolt. Ce n'est pas le builder qui décide.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":1052,"title":1053,"description":1054,"published":1055,"category":874,"image":1056,"draft":828},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Activer Row Level Security sur chaque table Supabase, et le prouver","Activer Row Level Security dans Supabase sans politique ferme la table entièrement. Une politique sans le réglage ne fait rien. Voici le SQL, et le test.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":1058,"title":1059,"description":1060,"published":1061,"category":874,"image":1062,"draft":828},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\" : ce que l'alerte rate","Supabase signale \"RLS disabled in public\" comme une erreur. Elle ne dit rien de la politique de lecture qui laisse votre table tout aussi ouverte.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":1064,"title":1065,"description":1066,"published":1067,"category":874,"image":1068,"draft":828},"\u002Fblog\u002Frotate-supabase-service-role-key","Faire tourner une clé service_role Supabase qui a fuité","Supabase dit de colmater la fuite d'abord. D'autres guides disent de faire tourner la clé tout de suite. Tout dépend d'où votre clé service_role a fuité.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":1070,"title":1071,"description":1072,"published":1073,"category":874,"image":1074,"draft":828},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Scanners de sécurité vibe coding comparés, le nôtre compris","Le meilleur scanner de sécurité vibe coding tient à trois questions qu'aucune liste de fonctions ne traite. Dix outils comparés, avec les prix.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":1076,"title":1077,"description":1078,"published":1079,"category":874,"image":1080,"draft":828},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker : les cinq vérifications à faire soi-même","Un Supabase security checker lit votre app publiée plutôt que les réglages de votre projet. Voici les cinq vérifications, et comment faire chacune vous-même.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":1082,"title":1083,"description":1084,"published":1085,"category":874,"image":1086,"draft":828},"\u002Fblog\u002Fvibe-coding-security-scanner","Scanner de sécurité vibe coding : ce qu’un scan d’URL rate","Un scanner de sécurité vibe coding lit votre app en ligne depuis l’extérieur. Ce qu’il couvre, les quatre choses qu’il ne voit pas, et comment lire le résultat.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":1088,"title":1089,"description":1090,"published":1091,"category":874,"image":1092,"draft":828},"\u002Fblog\u002Fmissing-security-headers","En-têtes de sécurité manquants : quand cela compte","Les en-têtes de sécurité manquants sont notre constat le plus fréquent. Contre quoi ils protègent, et quand ils comptent le moins dans votre rapport.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":1094,"title":1095,"description":1096,"published":1097,"category":874,"image":1098,"draft":828},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Votre clé API OpenAI est exposée dans votre frontend. Changez-la.","Une clé API OpenAI exposée dans votre frontend ne peut être liée à aucun domaine. Changez-la aujourd'hui, passez par votre serveur et plafonnez la dépense.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":1100,"title":1101,"description":1102,"published":1103,"category":874,"image":1104,"draft":828},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Clé API exposée dans le frontend : ce que 30 998 applis livrent","Une clé API exposée dans votre frontend est le plus souvent une clé Google Maps. Nous avons scanné 30 998 applis vibe-codées et compté ce qui fuit vraiment.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":1106,"title":1107,"description":1108,"published":1109,"category":824,"image":1110,"draft":828},"\u002Fblog\u002Fsupabase-backup-tools-compared","Outils de sauvegarde Supabase comparés, le nôtre compris","Quatre familles d'outil de sauvegarde Supabase, ce que chacun copie vraiment, et quand une GitHub Action gratuite bat le fait de payer, nous compris.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":1112,"title":1113,"description":1114,"published":1115,"category":874,"image":1116,"draft":828},"\u002Fblog\u002Freplit-secrets-explained","Utiliser les secrets sur Replit, et ce qui est publié quand même","Utiliser les secrets sur Replit : en ajouter un, le relire, corriger les deux causes du undefined. Et les clés que l'outil Secrets ne peut pas protéger.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":1118,"title":1119,"description":1120,"published":1121,"category":824,"image":1122,"draft":828},"\u002Fblog\u002Fback-up-supabase-free-tier","Sauvegardes du plan gratuit Supabase : en faire une sans terminal","Le plan gratuit de Supabase ne fait aucune sauvegarde : la copie vient de vous. Comment la faire depuis le tableau de bord, et ce que le CSV oublie.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":1124,"title":1125,"description":1126,"published":1127,"category":874,"image":1128,"draft":828},"\u002Fblog\u002Fis-supabase-secure","Supabase est-il sûr ? Oui. Votre projet est une autre question","Supabase est-il sûr ? La plateforme est auditée, chiffrée et testée en intrusion. Sa documentation dit où cela s'arrête et où vos réglages commencent.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":1130,"title":1131,"description":1132,"published":1133,"category":874,"image":1134,"draft":828},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Où trouver vos clés API Supabase : anon, service_role et URL","L'URL du projet, la clé anon et la clé service_role tiennent sur une page du tableau de bord. Voici où elle est, et laquelle des quatre va dans votre app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":1136,"title":1137,"description":1138,"published":1139,"category":874,"image":1140,"draft":828},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy sur Supabase : et après ?","\"New row violates row-level security policy\" signifie que Supabase a refusé une écriture. Le correctif rapide rouvre la table à tout le monde.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":1142,"title":1143,"description":1144,"published":1145,"category":874,"image":1146,"draft":828},"\u002Fblog\u002Fcors-wildcard-security-risk","Un joker CORS est-il un risque de sécurité ? Rarement.","Un joker CORS est-il un risque de sécurité ? C'est souvent le réglage par défaut de votre builder, et il ne livre rien que votre serveur ne donnait déjà.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":1148,"title":1149,"description":1150,"published":1151,"category":824,"image":1152,"draft":828},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Le branching Supabase n'est pas une sauvegarde de vos données.","Pourquoi le branching Supabase n'est pas une sauvegarde : une branche démarre sans vos données, et un merge ne déplace que le schéma. À quoi il sert vraiment.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":433,"title":1154,"description":1155,"published":1156,"category":824,"image":1157,"draft":828},"Restaurer une sauvegarde Supabase, et ce qui casse après","Restaurer une sauvegarde Supabase depuis le tableau de bord ou un fichier de dump, ce que la restauration remplace et pourquoi votre app peut rester cassée.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":1159,"title":1160,"description":1161,"published":1162,"category":874,"image":1163,"draft":828},"\u002Fblog\u002Fsupabase-storage-bucket-public","Votre bucket Supabase Storage est public. Est-ce un problème ?","Un bucket Supabase Storage public signifie que celui qui a l'URL d'un fichier peut l'ouvrir. Il ne signifie pas que quelqu'un peut lister ce qu'il contient.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":1165,"title":1166,"description":1167,"published":1168,"category":874,"image":1169,"draft":828},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Une clé API Google dans votre frontend, est-ce un problème ?","Une clé API Google exposée dans votre frontend est la clé que notre scanner trouve le plus souvent, et en général tout va bien. Un réglage gratuit tranche.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":1171,"title":1172,"description":1173,"published":1174,"category":824,"image":1175,"draft":828},"\u002Fblog\u002Fai-agent-deleted-my-database","Un agent IA a supprimé mes données Supabase. Que puis-je récupérer ?","Un agent IA a supprimé des données de votre base. Ce que vous pouvez récupérer était déjà décidé avant, et les prochaines minutes décident du reste.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":1177,"title":1178,"description":1179,"published":1180,"category":874,"image":1181,"draft":828},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Qui peut lire votre base Supabase ? Nous avons testé 3 680 apps","N'importe qui peut-il lire votre base de données Supabase sans se connecter ? Nous avons scanné 30 998 apps en ligne créées avec des builders IA.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":1183,"title":1184,"description":1185,"published":1180,"category":874,"image":1186,"draft":828},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source maps exposées : votre app publie son code original","Une source map exposée laisse n'importe qui lire le code original de votre app, commentaires compris. Le test de 30 secondes, et ce qui compte vraiment.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":1188,"title":1189,"description":1190,"published":1191,"category":874,"image":1192,"draft":828},"\u002Fblog\u002Fsupabase-new-api-keys","Les nouvelles clés API Supabase : laquelle va dans votre app ?","Supabase a remplacé anon et service_role par des clés publiables et secrètes. Laquelle a sa place dans votre app, et laquelle jamais ?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":1194,"title":1195,"description":1196,"published":1197,"category":824,"image":1198,"draft":828},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Supabase sauvegarde-t-il ma base de données ? Cela dépend du plan.","Supabase sauvegarde-t-il votre base de données ? Chaque jour sur les plans payants, jamais sur le gratuit. Comment savoir ce que vous avez vraiment.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":1200,"title":1201,"description":1202,"published":1203,"category":874,"image":1204,"draft":828},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security est activé. La table reste publique.","Activer Supabase Row Level Security ne protège pas une table. Ce sont vos politiques, et celle qui a réparé votre app laisse peut-être entrer tout le monde.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":1206,"title":1207,"description":1208,"published":1203,"category":824,"image":1209,"draft":828},"\u002Fblog\u002Fversion-history-is-not-a-backup","L'historique des versions n'est pas une sauvegarde de vos données.","Lovable et Bolt tiennent un historique des versions de votre code. Votre base de données est un service à part, et revenir en arrière ne la ramène pas.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":1211,"title":1212,"description":1213,"published":1214,"category":824,"image":1215,"draft":828},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Trois façons de sauvegarder une base Supabase, et ce qui manque","Le tableau de bord, pg_dump et un service géré. Ce que chacun enregistre, ce qu'il laisse de côté sans le dire, et lequel survit à la perte du compte.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":1217,"title":1218,"description":1219,"published":1214,"category":874,"image":1220,"draft":828},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Quelles clés API sont sûres côté navigateur, et lesquelles non","Votre clé anon Supabase est faite pour être publique. Votre clé service_role non, et elle ignore toutes les règles que vous posez. Comment les distinguer.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1791705960659]