[{"data":1,"prerenderedAt":1161},["ShallowReactive",2],{"blog-fr-supabase-backup-github-action":3,"blog-index-fr":815},{"id":4,"title":5,"body":6,"category":768,"cover":769,"coverAlt":770,"description":771,"draft":772,"extension":773,"faq":774,"image":792,"keywords":793,"meta":802,"navigation":803,"ogTitle":804,"path":805,"published":806,"seo":807,"stem":808,"tldr":809,"updated":813,"__hash__":814},"blog_fr\u002Fblog\u002Fsupabase-backup-github-action.md","Sauvegarde Supabase gratuite avec une GitHub Action, et le piège",{"type":7,"value":8,"toc":752},"minimark",[9,13,21,24,29,40,49,57,60,64,72,82,85,139,146,153,157,160,177,191,197,200,203,207,216,225,233,242,245,249,252,255,335,338,341,346,349,357,360,364,377,398,404,407,410,416,422,459,465,468,472,475,478,515,518,522,530,548,552,555,571,579,584,592,601,607,610,614,617,645,649,654,697,710,714,744],[10,11,12],"p",{},"Votre projet Supabase est sur le plan gratuit, donc rien n'est copié nulle\npart, ou il est sur Pro et chaque copie qu'il prend vit à l'intérieur du compte\nque vous avez peur de perdre. Dans un fil de discussion sur ce sujet précis,\nquelqu'un a dit que la réponse était une GitHub Action de sauvegarde Supabase :\nun petit fichier dans un dépôt, qui exporte votre base chaque nuit et ne coûte\nrien.",[10,14,15,16,20],{},"Le conseil était bon. Supabase publie lui-même le workflow, et pour beaucoup\nd'apps c'est ce qu'il faut mettre en place cette semaine. Voici ce que ces fils\nlaissent de côté : ",[17,18,19],"strong",{},"cela ne coûte pas d'argent, et cela a quand même un prix.","\nChaque exécution télécharge toute votre base de données, et Supabase mesure ce\ntéléchargement.",[10,22,23],{},"Voyez-le comme la data de votre forfait mobile. Votre plan vient avec un quota\nmensuel, tout ce que fait votre app puise dedans, et une sauvegarde est un gros\ntéléchargement sur le même forfait. Sur le plan gratuit, une copie nocturne\nd'une base proche de sa taille maximale consomme le quota de tout le mois en\nune dizaine de jours. Cela, plus une connection string que GitHub ne peut pas\njoindre, sont les deux choses entre vous et une sauvegarde qui fonctionne, et ni\nl'une ni l'autre ne figure sur la page de Supabase.",[25,26,28],"h2",{"id":27},"peut-on-sauvegarder-supabase-gratuitement-avec-une-github-action","Peut-on sauvegarder Supabase gratuitement avec une GitHub Action ?",[10,30,31,32,39],{},"Oui, et Supabase documente comment. Sa page sur les\n",[33,34,38],"a",{"href":35,"rel":36},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fdeployment\u002Fci\u002Fbackups",[37],"nofollow","sauvegardes automatiques avec GitHub Actions","\ndonne un workflow qui installe la CLI Supabase, exporte vos rôles, votre schéma\net vos données dans trois fichiers, et les commite dans le dépôt selon un\nhoraire.",[10,41,42,43,48],{},"GitHub ne vous facture rien non plus, dans certaines limites. Un dépôt privé sur\nGitHub Free reçoit\n",[33,44,47],{"href":45,"rel":46},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fbilling\u002Fconcepts\u002Fproduct-billing\u002Fgithub-actions",[37],"2 000 minutes Actions par mois",",\net un dump nocturne d'une petite base en consomme une petite partie.",[10,50,51,52,56],{},"Ce que vous obtenez, c'est une copie qui quitte Supabase chaque nuit et atterrit\nsur les serveurs d'une autre entreprise. C'est précisément ce que les\nsauvegardes de Supabase ne peuvent pas vous donner, car les copies quotidiennes\nd'un plan payant\n",[33,53,55],{"href":54},"\u002Fblog\u002Fdownload-your-supabase-backup","restent dans le compte qu'elles protègent",".",[10,58,59],{},"C'est la bonne réponse quand trois conditions sont réunies. Votre app vit déjà\ndans un dépôt GitHub, ce qui est le cas si vous avez activé la synchronisation\nGitHub dans Lovable ou un builder du même genre. Modifier un fichier YAML ne\nvous inquiète pas. Et votre base est petite par rapport au quota d'egress de\nvotre plan. Les deux premières, vous les connaissez déjà. La troisième relève de\nl'arithmétique, et elle a sa propre section plus bas.",[25,61,63],{"id":62},"le-workflow-avec-lhoraire-et-le-secret","Le workflow, avec l'horaire et le secret",[10,65,66,67,71],{},"Enregistrez ceci sous ",[68,69,70],"code",{},".github\u002Fworkflows\u002Fsupabase-backup.yml"," dans un dépôt\nprivé qui ne contient rien d'autre :",[73,74,80],"pre",{"className":75,"code":77,"language":78,"meta":79},[76],"language-yaml","name: supabase-backup\n\non:\n  schedule:\n    - cron: '17 3 * * *' # tous les jours à 03:17 UTC\n  workflow_dispatch:\n\njobs:\n  backup:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    env:\n      SUPABASE_DB_URL: ${{ secrets.SUPABASE_DB_URL }}\n    steps:\n      - uses: actions\u002Fcheckout@v7\n      - uses: supabase\u002Fsetup-cli@v3\n        with:\n          version: latest\n      - name: Back up roles\n        run: supabase db dump --db-url \"$SUPABASE_DB_URL\" -f roles.sql --role-only\n      - name: Back up schema\n        run: supabase db dump --db-url \"$SUPABASE_DB_URL\" -f schema.sql\n      - name: Back up data\n        run: >\n          supabase db dump --db-url \"$SUPABASE_DB_URL\" -f data.sql --use-copy --data-only\n          -x \"storage.buckets_vectors\" -x \"storage.vector_indexes\"\n      - uses: stefanzweifel\u002Fgit-auto-commit-action@v7\n        with:\n          commit_message: Supabase backup\n","yaml","",[68,81,77],{"__ignoreMap":79},[10,83,84],{},"C'est le workflow de Supabase avec trois changements.",[86,87,88,99,123],"ul",{},[89,90,91,94,95,98],"li",{},[17,92,93],{},"Il s'exécute selon l'horaire et quand vous appuyez sur le bouton, et\njamais autrement."," La version de Supabase s'exécute aussi à chaque push et à\nchaque pull request sur ",[68,96,97],{},"main",". Chaque exécution est un téléchargement complet\nde votre base, donc dans un dépôt qui contient aussi votre app, chaque\nchangement livré coûterait l'équivalent d'une sauvegarde en quota.",[89,100,101,104,105,110,111,114,115,118,119,122],{},[17,102,103],{},"Il s'exécute à 03:17, en dehors de l'heure pile."," GitHub indique que les\nexécutions planifiées\n",[33,106,109],{"href":107,"rel":108},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Freference\u002Fworkflows-and-actions\u002Fevents-that-trigger-workflows#schedule",[37],"peuvent être retardées au début de chaque heure",",\net qu'en cas de charge suffisante certaines tâches en file d'attente sont\nabandonnées. L'exemple de Supabase utilise ",[68,112,113],{},"0 0 * * *",", qui tombe pile sur\nl'heure. Les horaires sont en UTC sauf si vous ajoutez un ",[68,116,117],{},"timezone",", et\nn'importe quelle minute autre que ",[68,120,121],{},"0"," convient.",[89,124,125,134,135,138],{},[17,126,127,128,133],{},"La ligne des données reprend le\n",[33,129,132],{"href":130,"rel":131},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmigrating-within-supabase\u002Fbackup-restore",[37],"guide de sauvegarde et de restauration","\nactuel de Supabase",", qui ajoute deux exclusions ",[68,136,137],{},"-x"," absentes de la page du\nworkflow. Les fichiers que vous gardez sont alors ceux pour lesquels les\ninstructions de restauration de Supabase sont écrites.",[10,140,141,142,145],{},"Ensuite, le secret. Dans le dépôt, ouvrez Settings, puis Secrets and variables,\npuis Actions, et ajoutez un secret de dépôt nommé ",[68,143,144],{},"SUPABASE_DB_URL",". Ce qu'on y\nmet décide si tout cela fonctionne, alors il a la section suivante pour lui\nseul.",[10,147,148,149,152],{},"Une fois qu'il est enregistré, lancez le workflow à la main depuis l'onglet\nActions, pour que la première exécution ait lieu sous vos yeux.\n",[68,150,151],{},"workflow_dispatch"," est la ligne qui vous donne le bouton Run workflow.",[25,154,156],{"id":155},"quelle-connection-string-mettre-dans-le-secret","Quelle connection string mettre dans le secret ?",[10,158,159],{},"La chaîne du Session pooler, depuis le bouton Connect en haut de votre projet\nSupabase. Prenez-la même si la page du workflow de Supabase montre la connexion\ndirecte dans son exemple.",[10,161,162,163,166,167,170,171,176],{},"La raison, c'est IPv6, le type d'adresse internet le plus récent. La connexion\ndirecte de Supabase, l'hôte qui commence par ",[68,164,165],{},"db."," et finit par ",[68,168,169],{},"supabase.co",",\n",[33,172,175],{"href":173,"rel":174},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fipv4-address",[37],"utilise IPv6 par défaut",",\net la même page range GitHub Actions parmi les services qui n'acceptent que\nl'IPv4. Le runner reçoit une adresse vers laquelle il n'a aucune route, et le\npremier dump échoue avant d'avoir écrit un seul octet. L'erreur dit que le nom\nd'hôte n'a pas pu être traduit, ou que le réseau est injoignable, souvent avec\nune longue adresse pleine de deux-points à côté. Cette adresse, c'est l'adresse\nIPv6. On dirait un mauvais mot de passe ou une base en panne, et la vraie cause\nest un réseau sur lequel le runner ne se trouve pas.",[10,178,179,180,183,184,187,188,56],{},"Le guide de sauvegarde et de restauration de Supabase dit d'utiliser par défaut\nla chaîne du Session pooler, et la directe seulement si votre réseau prend en\ncharge IPv6 ou si vous payez l'option IPv4. Vous reconnaîtrez la chaîne du\npooler à trois choses : son nom d'utilisateur est ",[68,181,182],{},"postgres."," suivi de la\nréférence de votre projet, son hôte se termine par ",[68,185,186],{},"pooler.supabase.com",", et son\nport est ",[68,189,190],{},"5432",[192,193],"diagram",{"alt":194,"caption":195,"src":196},"Un runner GitHub à gauche avec deux routes qui en partent. Celle du haut porte l'hôte direct db.[ref].supabase.co, marqué IPv6, et s'arrête sur un mur avec une croix avant la base de données. Celle du bas porte l'hôte pooler.supabase.com, marqué IPv4, et atteint la base avec une coche.","Le runner n'a aucune route vers l'adresse IPv6 de la connexion directe. Le Session pooler répond en IPv4 et atteint la même base.","\u002Fblog\u002Fsupabase-backup-github-action\u002Fwhich-string-reaches-the-runner-1600x620.png",[10,198,199],{},"Le mot de passe qu'elle contient est celui de votre base de données, choisi à la\ncréation du projet, et pas une clé d'API. Si personne ne l'a noté, Supabase vous\nlaisse le réinitialiser dans Database Settings ; tout ce qui se connecte avec\nl'ancien cesse alors de fonctionner jusqu'à ce que vous lui donniez le nouveau.",[10,201,202],{},"Cette chaîne peut lire et modifier chaque ligne de votre base. Elle vit dans le\nsecret et nulle part ailleurs : jamais dans le fichier du workflow, jamais dans\nun message de commit, et jamais collée dans un assistant IA avec l'erreur sur\nlaquelle vous vouliez l'interroger.",[25,204,206],{"id":205},"une-sauvegarde-supabase-compte-t-elle-dans-mon-egress","Une sauvegarde Supabase compte-t-elle dans mon egress ?",[10,208,209,210,215],{},"Oui, en entier. Supabase compte comme\n",[33,211,214],{"href":212,"rel":213},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmanage-your-usage\u002Fegress",[37],"egress",",\nc'est-à-dire comme trafic sortant, les données que n'importe lequel de ses\nservices envoie vers l'extérieur, et un dump passé par le pooler est classé en\nShared Pooler Egress, dans le même quota que votre trafic d'API, vos\ntéléchargements de fichiers et tout ce que votre app sert par ailleurs.",[10,217,218,219,224],{},"Revenons au forfait mobile. Le quota se remet à zéro à chaque mois de\nfacturation, chaque service utilisé par votre app puise dedans, et une\nsauvegarde est un gros téléchargement de plus. C'est aussi un forfait famille :\nSupabase applique le quota à\n",[33,220,223],{"href":221,"rel":222},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fbilling-on-supabase",[37],"toute votre organisation",",\ndonc tous les projets qu'elle contient partagent le même quota.",[10,226,227,228,232],{},"Le 26 septembre 2026, la page des tarifs de Supabase donnait au plan gratuit\n5 Go d'egress par mois et une limite de 500 Mo pour la base de chaque projet, et\nau plan Pro 250 Go d'egress. Le plan gratuit a aussi 5 Go de cached egress, qui\ncouvrent les fichiers servis depuis le CDN de Supabase, et une sauvegarde n'y\ntouche jamais. Les autres limites du plan gratuit, et ",[33,229,231],{"href":230},"\u002Fblog\u002Fsupabase-free-plan-limits","ce que fait chacune quand vous la franchissez",", ont leur propre article.",[10,234,235,236,241],{},"Dépasser le quota sur le plan gratuit ne produit pas de facture. Supabase\n",[33,237,240],{"href":238,"rel":239},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fbilling-faq",[37],"vous prévient et vous accorde un délai de grâce",",\net si vous continuez à le dépasser, il restreint chaque projet de\nl'organisation. Selon Supabase, cela peut vouloir dire des requêtes d'API\nrefusées avec une erreur 402, une base passée en lecture seule ou des projets\nmis en pause. Pour une app qui a des clients, c'est une panne déclenchée par\nvotre sauvegarde.",[10,243,244],{},"C'est vrai de toute sauvegarde qui sort de Supabase, y compris celle que nous\nvendons. Une copie gardée hors du compte doit être téléchargée pour y arriver.",[25,246,248],{"id":247},"à-quelle-fréquence-la-sauvegarde-doit-elle-tourner","À quelle fréquence la sauvegarde doit-elle tourner ?",[10,250,251],{},"Aussi souvent que votre quota peut le payer, et cela se résume à une seule\nmultiplication : la taille de votre base, fois le nombre d'exécutions dans le\nmois.",[10,253,254],{},"Supabase affiche la taille de votre base dans le rapport Database, sous\nObservability dans votre projet. Un dump ne fait pas exactement cette taille. Il\nlaisse de côté les index, reconstruits à partir de leur définition, et il écrit\nchaque valeur sous forme de texte. C'est assez proche pour planifier, et c'est\nle chiffre que vous pouvez consulter.",[256,257,258,277],"table",{},[259,260,261],"thead",{},[262,263,264,268,271,274],"tr",{},[265,266,267],"th",{},"Taille de la base",[265,269,270],{},"Quotidien (30 exécutions)",[265,272,273],{},"Deux fois par semaine",[265,275,276],{},"Hebdomadaire",[278,279,280,295,308,322],"tbody",{},[262,281,282,286,289,292],{},[283,284,285],"td",{},"50 Mo",[283,287,288],{},"1,5 Go",[283,290,291],{},"0,4 Go",[283,293,294],{},"0,2 Go",[262,296,297,300,303,306],{},[283,298,299],{},"100 Mo",[283,301,302],{},"3 Go",[283,304,305],{},"0,9 Go",[283,307,291],{},[262,309,310,313,316,319],{},[283,311,312],{},"250 Mo",[283,314,315],{},"7,5 Go",[283,317,318],{},"2,2 Go",[283,320,321],{},"1,1 Go",[262,323,324,327,330,333],{},[283,325,326],{},"500 Mo",[283,328,329],{},"15 Go",[283,331,332],{},"4,3 Go",[283,334,318],{},[10,336,337],{},"Un mois compte environ 4,3 semaines, d'où viennent les deux dernières colonnes.",[10,339,340],{},"Sur le plan gratuit, les deux chiffres quotidiens du bas dépensent plus que le\nquota de tout le mois avant que votre app ait répondu à une seule requête. Un\nhoraire quotidien consomme les 5 Go entiers vers 160 Mo, et le trafic de votre\napp sort du même quota, alors regardez l'egress du mois dernier sur la page\nUsage de votre organisation avant de choisir. L'hebdomadaire tient à toutes les\ntailles que le plan gratuit autorise.",[192,342],{"alt":343,"caption":344,"src":345},"Une base de données avec un symbole de répétition à côté de deux colonnes de blocs : trente copies dans le mois à gauche, quatre à droite. Une ligne pointillée marque le quota mensuel. La colonne de gauche la dépasse au tiers de sa hauteur et ses blocs au-dessus de la ligne sont ambre. Celle de droite reste loin en dessous, en turquoise.","Une base à la limite de 500 Mo du plan gratuit, sauvegardée chaque jour et chaque semaine. La ligne pointillée représente les 5 Go d'egress du plan gratuit pour le mois.","\u002Fblog\u002Fsupabase-backup-github-action\u002Fthirty-copies-four-copies-1600x680.png",[10,347,348],{},"La ligne de cron est la seule chose que vous changez :",[73,350,355],{"className":351,"code":353,"language":354},[352],"language-text","17 3 * * *      tous les jours à 03:17 UTC\n17 3 * * 1,4    le lundi et le jeudi\n17 3 * * 0      le dimanche\n","text",[68,356,353],{"__ignoreMap":79},[10,358,359],{},"Sur Pro, l'arithmétique ne compte presque plus. 250 Go par mois paient un dump\nquotidien d'un projet jusqu'à environ 8 Go, ce qui est l'espace disque que le\nplan Pro inclut par projet.",[25,361,363],{"id":362},"pourquoi-mon-workflow-échoue-t-il-avec-une-erreur-de-version-de-pg_dump","Pourquoi mon workflow échoue-t-il avec une erreur de version de pg_dump ?",[10,365,366,367,370,371,373,374,376],{},"Parce que le ",[68,368,369],{},"pg_dump"," qu'il a lancé est plus ancien que votre base. Cela\nn'arrive qu'à un workflow qui appelle ",[68,372,369],{}," directement plutôt que par la\nCLI Supabase. La CLI apporte son propre ",[68,375,369],{},", et c'est l'une des raisons\npour lesquelles le workflow ci-dessus l'utilise.",[10,378,379,380,383,384,389,390,392,397],{},"Le runner ",[68,381,382],{},"ubuntu-latest"," de GitHub arrive avec\n",[33,385,388],{"href":386,"rel":387},"https:\u002F\u002Fgithub.com\u002Factions\u002Frunner-images\u002Fblob\u002Fmain\u002Fimages\u002Fubuntu\u002FUbuntu2404-Readme.md",[37],"PostgreSQL 16 installé",".\nLes projets Supabase peuvent tourner sous Postgres 17, et Postgres documente que\n",[68,391,369],{},[33,393,396],{"href":394,"rel":395},"https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fapp-pgdump.html",[37],"n'exporte pas depuis un serveur d'une version majeure plus récente que la sienne",",\net préfère refuser plutôt que risquer un fichier défectueux. L'exécution\ns'arrête sur :",[73,399,402],{"className":400,"code":401,"language":354},[352],"pg_dump: error: aborting because of server version mismatch\npg_dump: detail: server version: 17.…; pg_dump version: 16.…\n",[68,403,401],{"__ignoreMap":79},[10,405,406],{},"La version de votre projet se trouve sous Project Settings, puis General, si\nvous voulez la vérifier. Vos identifiants n'y sont pour rien.",[10,408,409],{},"La correction tient en deux étapes. Ajoutez le dépôt de paquets de PostgreSQL\nlui-même pour que le runner puisse installer le client en version 17, puis\nappelez ce client par son chemin complet :",[73,411,414],{"className":412,"code":413,"language":78,"meta":79},[76],"- name: Install the Postgres 17 client\n  run: |\n    sudo apt-get install -y postgresql-common\n    sudo \u002Fusr\u002Fshare\u002Fpostgresql-common\u002Fpgdg\u002Fapt.postgresql.org.sh -y\n    sudo apt-get install -y postgresql-client-17\n- name: Back up\n  run: \u002Fusr\u002Flib\u002Fpostgresql\u002F17\u002Fbin\u002Fpg_dump \"$SUPABASE_DB_URL\" …\n",[68,415,413],{"__ignoreMap":79},[10,417,418,419,421],{},"Gardez après la connection string les arguments que vous aviez déjà. Le chemin\ncomplet compte : sur Ubuntu, le ",[68,420,369],{}," tout court est un intermédiaire qui\nchoisit une version pour vous, et le runner a déjà une installation de\nPostgreSQL 16 à lui proposer.",[10,423,424,425,427,428,431,432,440,441,444,445,448,449,451,452,455,456,458],{},"Le ",[68,426,369],{}," de la CLI a lui aussi une version, et elle ne vient pas de votre\nprojet. Sans ",[68,429,430],{},"supabase\u002Fconfig.toml"," à côté du workflow, ce qui est le cas dans\nun dépôt qui ne contient rien d'autre, la CLI\n",[33,433,436,437,439],{"href":434,"rel":435},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fcli\u002Fblob\u002F66ccc6f63a9a26b29c368698994a0843d23b80be\u002Fapps\u002Fcli\u002Fsrc\u002Fcommand-internal\u002Fdb-config.toml-read.ts#L176",[37],"prend ",[68,438,369],{}," 17",".\nSur un projet encore en Postgres 15, le ",[68,442,443],{},"data.sql"," qu'elle écrit contient alors\n",[68,446,447],{},"SET transaction_timeout = 0",", un réglage que Postgres 15 ne connaît pas, et le\nrejeu s'arrête sur cette ligne dans n'importe quelle base Postgres 15, y compris\nle projet d'où vient le fichier. Nous l'avons reproduit le 4 octobre 2026 avec\n",[68,450,369],{}," 17.11 et Postgres 15.19. Si votre projet est en 15, ajoutez une ligne\nau bloc ",[68,453,454],{},"env"," du job pour que la CLI utilise le ",[68,457,369],{}," correspondant :",[73,460,463],{"className":461,"code":462,"language":78,"meta":79},[76],"env:\n  SUPABASE_DB_URL: ${{ secrets.SUPABASE_DB_URL }}\n  SUPABASE_DB_MAJOR_VERSION: '15'\n",[68,464,462],{"__ignoreMap":79},[10,466,467],{},"La sauvegarde elle-même se termine sans erreur dans les deux cas, donc sans\ncette ligne l'écart n'apparaît que le jour où le fichier est rejoué.",[25,469,471],{"id":470},"puis-je-commiter-la-sauvegarde-dans-mon-dépôt","Puis-je commiter la sauvegarde dans mon dépôt ?",[10,473,474],{},"Dans un dépôt privé, oui. C'est ce que fait le workflow de Supabase, et sa page\ndit deux fois de ne jamais sauvegarder vos données dans un dépôt public.",[10,476,477],{},"Trois choses sur un dépôt comme lieu de vie d'une base de données, dont aucune\nne figure sur cette page :",[86,479,480,494,500],{},[89,481,482,485,486,488,489,493],{},[17,483,484],{},"Quiconque peut lire le dépôt peut lire vos utilisateurs."," ",[68,487,443],{},"\ncontient chaque ligne : adresses e-mail, noms, tout ce que gardent vos tables,\net ",[33,490,492],{"href":491},"\u002Fblog\u002Fsupabase-backup-auth-users","vos comptes aussi",". C'est pour cela que\nle workflow a son propre dépôt, avec personne d'autre dessus, et pas celui qui\ncontient le code de votre app, que votre builder synchronise peut-être et où\nun freelance sera peut-être un jour invité.",[89,495,496,499],{},[17,497,498],{},"La copie de chaque nuit reste dans l'historique."," Git garde chaque version\nde chaque fichier. Quand une personne de votre clientèle vous demande de\nsupprimer son compte, sa ligne reste dans chaque commit antérieur de ce dépôt\ntant que vous n'avez pas réécrit son historique.",[89,501,502,505,506,511,512,514],{},[17,503,504],{},"Tout s'arrête à 100 Mio."," GitHub avertit au-delà de 50 Mio et\n",[33,507,510],{"href":508,"rel":509},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Frepositories\u002Fworking-with-files\u002Fmanaging-large-files\u002Fabout-large-files-on-github",[37],"bloque les fichiers de plus de 100 Mio",",\net la même page dit que Git n'est pas conçu pour gérer de gros fichiers SQL.\nLa nuit où ",[68,513,443],{}," franchit cette limite, l'étape de commit échoue, et\nchaque exécution suivante échoue de la même manière.",[10,516,517],{},"Quand vous approchez de la limite, le même workflow peut envoyer les trois\nfichiers dans un bucket de stockage qui vous appartient au lieu de les commiter.\nOu c'est le moment où le faire vous-même a cessé d'être bon marché, et c'est là\nque commence la dernière section.",[25,519,521],{"id":520},"quest-ce-que-le-workflow-ne-copie-pas","Qu'est-ce que le workflow ne copie pas ?",[10,523,524,525,529],{},"Vos fichiers envoyés. Supabase Storage garde chaque fichier hors de la base de\ndonnées et une ligne qui le décrit à l'intérieur, donc le dump emporte la ligne\net pas l'image. ",[33,526,528],{"href":527},"\u002Fblog\u002Fsupabase-storage-backup","Sauvegarder Storage"," est un\ntravail à part, quelle que soit la méthode.",[10,531,532,533,536,537,540,541,543,544,547],{},"Vos utilisateurs, eux, y sont. Le dump des données parcourt le schéma ",[68,534,535],{},"auth"," où\nvivent vos comptes, et chercher ",[68,538,539],{},"auth.users"," dans ",[68,542,443],{}," vous les montre. Le\nprojet autour de la base, en revanche, n'y est pas : Edge Functions, réglages\ndes fournisseurs d'authentification, clés d'API et secrets relèvent de la\nconfiguration et non des données, et\n",[33,545,546],{"href":54},"la liste de ce qu'aucune des deux copies ne contient","\nest celle à lire avant d'en avoir besoin.",[25,549,551],{"id":550},"une-exécution-verte-veut-elle-dire-que-la-sauvegarde-a-marché","Une exécution verte veut-elle dire que la sauvegarde a marché ?",[10,553,554],{},"Elle veut dire que la tâche s'est terminée sans erreur, ce qui est une\naffirmation plus modeste. Trois résultats très différents finissent par la même\ncoche verte :",[556,557,558,561,564],"ol",{},[89,559,560],{},"Un bon dump du bon projet.",[89,562,563],{},"Un dump du mauvais projet, parce que le secret contient la chaîne d'une copie\nde staging.",[89,565,566,567,570],{},"Un dump sans aucune ligne, parce que quelqu'un a modifié la ligne des données\net que ",[68,568,569],{},"--data-only"," a disparu, ce qui la retransforme en dump du schéma.",[10,572,573,574,578],{},"Un résultat ne laisse aucune trace. Une exécution planifiée que GitHub abandonne\nsous la charge n'apparaît pas comme un échec, puisqu'il n'y a aucune exécution\npour échouer. Et quand une exécution échoue bel et bien, GitHub envoie la\nnotification à\n",[33,575,577],{"href":107,"rel":576},[37],"la personne qui a modifié la ligne de cron en dernier",".\nSi un freelance a mis cela en place pour vous, l'e-mail sur votre sauvegarde\narrive dans sa boîte.",[192,580],{"alt":581,"caption":582,"src":583},"Une tâche terminée, marquée d'une coche verte. Une ligne en part et se divise vers deux panneaux de fichier identiques. Dans le fichier du haut, toutes les lignes sont remplies. Dans celui du bas, elles s'arrêtent après deux et le reste n'est que contours pointillés vides.","Les deux fichiers sont sortis d'une exécution terminée sans erreur. Rien dans l'exécution ne vous dit lequel vous avez.","\u002Fblog\u002Fsupabase-backup-github-action\u002Fgreen-run-short-file-1600x740.png",[10,585,586,587,591],{},"Seule une restauration les distingue. Rejouez les trois fichiers dans un projet\nSupabase jetable ou en local, comparez le nombre de lignes des tables qui\ncomptent pour vous avec celles de la vraie base, et connectez-vous en tant que\nvrai utilisateur.\n",[33,588,590],{"href":589},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Comment restaurer une sauvegarde Supabase","\ndonne les commandes, dans l'ordre indiqué par Supabase. Faites-le une fois\nmaintenant, puis à chaque modification du workflow.",[10,593,594,595,600],{},"Vous pouvez aussi confier la restauration et le comptage à chaque run. Nous\navons publié une version de ce workflow sous forme de GitHub Action open source,\n",[33,596,599],{"href":597,"rel":598},"https:\u002F\u002Fgithub.com\u002FReeve-page\u002Fsupabase-backup-action",[37],"Reeve-page\u002Fsupabase-backup-action",".\nElle réalise les trois mêmes dumps, garde la copie comme artefact du\nworkflow ou dans un bucket S3 ou R2, puis la rejoue dans une base Supabase\njetable sur le runner et compare le nombre de lignes de chaque table avec le\nfichier. Le run ne passe au vert que si chaque table est revenue avec les lignes\nque contient le fichier :",[73,602,605],{"className":603,"code":604,"language":78,"meta":79},[76],"- uses: Reeve-page\u002Fsupabase-backup-action@v1\n  with:\n    db-url: ${{ secrets.SUPABASE_DB_URL }}\n",[68,606,604],{"__ignoreMap":79},[10,608,609],{},"Elle est gratuite et sous licence MIT. Chaque run télécharge toujours toute la\nbase, donc le calcul d'egress plus haut s'applique tel quel, et la connexion\nreste à tester par vous.",[25,611,613],{"id":612},"quand-arrêter-de-le-faire-moi-même","Quand arrêter de le faire moi-même ?",[10,615,616],{},"Quand l'arithmétique ne tient plus, quand le fichier devient trop gros pour le\ndépôt, ou quand personne ne restaure les copies. Une seule de ces raisons\nsuffit.",[86,618,619,625,633,639],{},[89,620,621,624],{},[17,622,623],{},"Votre base a dépassé le quota gratuit."," Pro porte l'egress à 250 Go et\najoute les sauvegardes quotidiennes de Supabase, conservées sept jours, qui se\nrestaurent d'un bouton. Laissez le workflow tourner à côté, car ces copies\nvivent dans le compte.",[89,626,627,632],{},[17,628,629,631],{},[68,630,443],{}," approche des 100 Mio."," Le déplacer vers un bucket, c'est plus de\nYAML, et plus de choses que quelqu'un doit maintenir en état de marche.",[89,634,635,638],{},[17,636,637],{},"Personne n'a jamais restauré une copie."," Le workflow continuera d'écrire\ndes fichiers, qu'ils s'ouvrent ou non.",[89,640,641,644],{},[17,642,643],{},"Vos utilisateurs envoient des fichiers."," Le workflow ne les atteint pas, et\nla tâche qui les atteint est une deuxième tâche à maintenir en vie.",[25,646,648],{"id":647},"où-reeve-care-intervient","Où Reeve Care intervient",[10,650,651],{},[17,652,653],{},"Care prend la copie selon un horaire, la garde hors de votre compte Supabase\net vérifie chaque copie avant qu'elle compte.",[86,655,656,662,668,674,680],{},[89,657,658,661],{},[17,659,660],{},"Chaque jour avec Care, et plus souvent avec les plans au-dessus",", sans rien\ndans votre dépôt et sans connection string dans une CI.",[89,663,664,667],{},[17,665,666],{},"Relue et comptée."," Chaque copie est ouverte et comptée par rapport à ce qui\ny est entré, et la date affichée dans votre tableau de bord est celle de la\ndernière copie qui a passé cette vérification, jamais celle de la dernière\nexécution.",[89,669,670,673],{},[17,671,672],{},"Vos comptes sont dedans",", et vos fichiers envoyés suivent dès que vous\nconnectez un accès Storage.",[89,675,676,679],{},[17,677,678],{},"Restaurer, c'est un bouton",", et une copie de l'état actuel est prise avant\nque quoi que ce soit ne soit remplacé.",[89,681,682,685,686,689,690,692,693,696],{},[17,683,684],{},"Chaque copie se télécharge en zip"," avec ",[68,687,688],{},"schema.sql",", ",[68,691,443],{}," et\n",[68,694,695],{},"roles.sql",", les trois mêmes fichiers que ce workflow, plus le nombre de\nlignes de chaque table.",[10,698,699,700,704,705,709],{},"Care garde une copie de votre base Supabase. La copie, la vérification et la\nrestauration sont dessinées étape par étape sur la\n",[33,701,703],{"href":702},"\u002Fsupabase-backups","page des sauvegardes Supabase",", et\n",[33,706,708],{"href":707},"\u002Fpricing","ce que comprend chaque plan"," est sur la page des tarifs.",[25,711,713],{"id":712},"ce-quil-faut-faire-cette-semaine","Ce qu'il faut faire cette semaine",[715,716,717],"key-takeaways",{},[86,718,719,722,727,730,738,741],{},[89,720,721],{},"Relevez la taille de votre base et l'egress du mois dernier, et choisissez l'horaire dans le tableau avant d'écrire la ligne de cron.",[89,723,724,725,56],{},"Créez un dépôt privé qui ne contient que le workflow, et mettez la chaîne du Session pooler dans son secret ",[68,726,144],{},[89,728,729],{},"Si vous avez commencé avec l'exemple de Supabase, supprimez les déclencheurs push et pull request et décalez le cron hors de l'heure pile.",[89,731,732,733,485,735,737],{},"Lancez-le une fois à la main depuis l'onglet Actions, puis cherchez dans ",[68,734,443],{},[68,736,539],{}," et une table dont vous savez qu'elle a des lignes.",[89,739,740],{},"Restaurez une copie dans un projet jetable et connectez-vous en tant que vrai utilisateur.",[89,742,743],{},"Copiez vos fichiers Storage avec une tâche à part.",[10,745,746,747,751],{},"Avant de fermer cet onglet, ouvrez dans Supabase la page Usage de votre\norganisation et lisez l'egress du mois dernier. Ce chiffre, à côté de la taille\nde votre base, choisit votre ligne de cron. Et si vous comparez encore la voie\ngratuite aux voies payantes,\n",[33,748,750],{"href":749},"\u002Fblog\u002Fsupabase-backup-tools-compared","les quatre types d'outils de sauvegarde Supabase","\nsont comparés côte à côte.",{"title":79,"searchDepth":753,"depth":753,"links":754},3,[755,757,758,759,760,761,762,763,764,765,766,767],{"id":27,"depth":756,"text":28},2,{"id":62,"depth":756,"text":63},{"id":155,"depth":756,"text":156},{"id":205,"depth":756,"text":206},{"id":247,"depth":756,"text":248},{"id":362,"depth":756,"text":363},{"id":470,"depth":756,"text":471},{"id":520,"depth":756,"text":521},{"id":550,"depth":756,"text":551},{"id":612,"depth":756,"text":613},{"id":647,"depth":756,"text":648},{"id":712,"depth":756,"text":713},"Backups","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcover-1200x630.png","Une base de données dans une enceinte Supabase, un tuyau qui traverse un compteur à l'aiguille dans la zone ambre, puis des fichiers.","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.",false,"md",[775,778,781,783,786,789],{"q":776,"a":777},"Puis-je sauvegarder Supabase gratuitement ?","Oui. Supabase documente un workflow GitHub Actions qui installe sa CLI, exporte vos rôles, votre schéma et vos données dans trois fichiers selon un horaire, et les commite dans le dépôt. Un dépôt privé sur GitHub Free reçoit 2 000 minutes Actions par mois, et un dump nocturne d'une petite base en consomme une petite partie. Ce que la sauvegarde dépense vraiment, c'est votre quota d'egress chez Supabase, parce que chaque exécution télécharge toute la base.",{"q":779,"a":780},"À quelle fréquence lancer un cron de sauvegarde Supabase ?","Aussi souvent que votre quota d'egress peut le payer. Multipliez la taille de votre base par le nombre d'exécutions dans le mois : une base de 100 Mo exportée chaque jour déplace environ 3 Go, une de 500 Mo environ 15 Go. Le plan gratuit inclut 5 Go pour toute l'organisation, partagés avec le trafic de votre app. Placez la tâche sur une minute qui ne tombe pas pile sur l'heure, car GitHub indique que les exécutions planifiées en début d'heure peuvent être retardées, et certaines abandonnées.",{"q":206,"a":782},"Oui. Supabase compte comme egress les données que n'importe lequel de ses services envoie vers l'extérieur, et un dump passé par le connection pooler est classé en Shared Pooler Egress, dans le même quota que votre trafic d'API. Ce quota appartient à toute l'organisation, pas à un seul projet. Sur le plan gratuit, le dépasser à répétition aboutit à des restrictions sur chaque projet de l'organisation.",{"q":784,"a":785},"Pourquoi mon workflow de sauvegarde échoue-t-il à la première exécution ?","Deux échecs sont propres à ce montage. Le premier est la connection string : la connexion directe de Supabase utilise IPv6 sauf si vous payez l'option IPv4, et Supabase range GitHub Actions parmi les services qui ne joignent que l'IPv4, donc prenez la chaîne du Session pooler. Le second touche les workflows qui appellent pg_dump directement : le client PostgreSQL 16 du runner refuse d'exporter un projet en Postgres 17 et s'arrête sur aborting because of server version mismatch.",{"q":787,"a":788},"Puis-je commiter ma sauvegarde Supabase dans mon dépôt GitHub ?","Dans un dépôt privé, oui, c'est ce que fait le workflow de Supabase. Dans un dépôt public, jamais, et Supabase le dit deux fois sur la même page. Donnez-lui un dépôt à lui que personne d'autre ne peut lire, car le fichier de données contient les adresses e-mail de vos utilisateurs. Et attendez-vous à le déplacer quand la base grandira : GitHub avertit au-delà de 50 Mio et refuse les fichiers de plus de 100 Mio.",{"q":790,"a":791},"Comment savoir si le fichier de sauvegarde est bon ?","Restaurez-le. Une exécution verte veut dire que la tâche s'est terminée sans erreur, et un dump du mauvais projet ou un dump sans aucune ligne se terminent de la même façon. Rejouez les trois fichiers dans un projet Supabase jetable ou en local, comparez le nombre de lignes des tables qui comptent pour vous, et connectez-vous en tant que vrai utilisateur. C'est la vérification qui vous dit si le fichier s'ouvre.","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",[794,795,796,797,798,799,800,801],"supabase backup github action","automatiser sauvegarde supabase","sauvegarde supabase cron","sauvegarde supabase gratuite","supabase pg_dump github actions","sauvegarde planifiée supabase","workflow sauvegarde supabase","sauvegarde automatique supabase plan gratuit",{},true,"Sauvegarde Supabase gratuite avec une GitHub Action","\u002Fblog\u002Fsupabase-backup-github-action","2026-09-27",{"title":5,"description":771},"blog\u002Fsupabase-backup-github-action",[810,811,812],"Une GitHub Action de sauvegarde Supabase lance la CLI Supabase selon un horaire et commite le dump dans un dépôt privé. Elle ne coûte rien, et pour beaucoup d'apps c'est la bonne réponse.","Chaque exécution télécharge toute votre base de données, et Supabase compte cela comme de l'egress. Le plan gratuit inclut 5 Go par mois pour toute l'organisation, et un dump quotidien d'une base proche de la limite de 500 Mo en consomme environ trois fois plus.","L'exemple de Supabase lui-même se connecte avec une chaîne que les runners de GitHub ne peuvent pas joindre. Mettez la chaîne du Session pooler dans le secret, et restaurez une copie avant de vous fier aux autres.","2026-10-05","ITPjdfarMOCo-fR6NEjuQ_aTlS_3TnEiclg00wNCITY",[816,823,829,835,841,847,852,858,864,870,876,882,887,893,894,899,904,910,916,921,927,933,939,945,951,957,963,969,974,980,986,992,998,1004,1010,1016,1022,1028,1034,1040,1046,1051,1057,1063,1069,1075,1081,1087,1093,1098,1104,1110,1116,1122,1127,1133,1139,1145,1150,1156],{"path":817,"title":818,"description":819,"published":820,"category":821,"image":822,"draft":772},"\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","Bases de la sécurité","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":824,"title":825,"description":826,"published":827,"category":821,"image":828,"draft":772},"\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":830,"title":831,"description":832,"published":833,"category":821,"image":834,"draft":772},"\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":836,"title":837,"description":838,"published":839,"category":821,"image":840,"draft":772},"\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":842,"title":843,"description":844,"published":845,"category":821,"image":846,"draft":772},"\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":848,"title":849,"description":850,"published":813,"category":821,"image":851,"draft":772},"\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":853,"title":854,"description":855,"published":856,"category":821,"image":857,"draft":772},"\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":859,"title":860,"description":861,"published":862,"category":821,"image":863,"draft":772},"\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":865,"title":866,"description":867,"published":868,"category":821,"image":869,"draft":772},"\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":871,"title":872,"description":873,"published":874,"category":821,"image":875,"draft":772},"\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":877,"title":878,"description":879,"published":880,"category":821,"image":881,"draft":772},"\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":230,"title":883,"description":884,"published":885,"category":821,"image":886,"draft":772},"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":888,"title":889,"description":890,"published":891,"category":768,"image":892,"draft":772},"\u002Fblog\u002Ftest-your-supabase-backup","Testez votre sauvegarde Supabase avant d'en avoir besoin","Comment tester votre sauvegarde Supabase : la restaurer dans un projet d'exercice, compter les lignes, se connecter, chercher la ligne qui manque.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":805,"title":5,"description":771,"published":806,"category":768,"image":792,"draft":772},{"path":54,"title":895,"description":896,"published":897,"category":768,"image":898,"draft":772},"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":900,"title":901,"description":902,"published":897,"category":821,"image":903,"draft":772},"\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":905,"title":906,"description":907,"published":908,"category":821,"image":909,"draft":772},"\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":911,"title":912,"description":913,"published":914,"category":821,"image":915,"draft":772},"\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":491,"title":917,"description":918,"published":919,"category":768,"image":920,"draft":772},"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":922,"title":923,"description":924,"published":925,"category":821,"image":926,"draft":772},"\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":928,"title":929,"description":930,"published":931,"category":821,"image":932,"draft":772},"\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":934,"title":935,"description":936,"published":937,"category":821,"image":938,"draft":772},"\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":940,"title":941,"description":942,"published":943,"category":821,"image":944,"draft":772},"\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":946,"title":947,"description":948,"published":949,"category":821,"image":950,"draft":772},"\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":952,"title":953,"description":954,"published":955,"category":821,"image":956,"draft":772},"\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":958,"title":959,"description":960,"published":961,"category":821,"image":962,"draft":772},"\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":964,"title":965,"description":966,"published":967,"category":821,"image":968,"draft":772},"\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":527,"title":970,"description":971,"published":972,"category":768,"image":973,"draft":772},"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":975,"title":976,"description":977,"published":978,"category":768,"image":979,"draft":772},"\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":981,"title":982,"description":983,"published":984,"category":768,"image":985,"draft":772},"\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":987,"title":988,"description":989,"published":990,"category":821,"image":991,"draft":772},"\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":993,"title":994,"description":995,"published":996,"category":821,"image":997,"draft":772},"\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":999,"title":1000,"description":1001,"published":1002,"category":821,"image":1003,"draft":772},"\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":1005,"title":1006,"description":1007,"published":1008,"category":821,"image":1009,"draft":772},"\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":1011,"title":1012,"description":1013,"published":1014,"category":821,"image":1015,"draft":772},"\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":1017,"title":1018,"description":1019,"published":1020,"category":821,"image":1021,"draft":772},"\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":1023,"title":1024,"description":1025,"published":1026,"category":821,"image":1027,"draft":772},"\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":1029,"title":1030,"description":1031,"published":1032,"category":821,"image":1033,"draft":772},"\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":1035,"title":1036,"description":1037,"published":1038,"category":821,"image":1039,"draft":772},"\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":1041,"title":1042,"description":1043,"published":1044,"category":821,"image":1045,"draft":772},"\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":749,"title":1047,"description":1048,"published":1049,"category":768,"image":1050,"draft":772},"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":1052,"title":1053,"description":1054,"published":1055,"category":821,"image":1056,"draft":772},"\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":1058,"title":1059,"description":1060,"published":1061,"category":768,"image":1062,"draft":772},"\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":1064,"title":1065,"description":1066,"published":1067,"category":821,"image":1068,"draft":772},"\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":1070,"title":1071,"description":1072,"published":1073,"category":821,"image":1074,"draft":772},"\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":1076,"title":1077,"description":1078,"published":1079,"category":821,"image":1080,"draft":772},"\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":1082,"title":1083,"description":1084,"published":1085,"category":821,"image":1086,"draft":772},"\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":1088,"title":1089,"description":1090,"published":1091,"category":768,"image":1092,"draft":772},"\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":589,"title":1094,"description":1095,"published":1096,"category":768,"image":1097,"draft":772},"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":1099,"title":1100,"description":1101,"published":1102,"category":821,"image":1103,"draft":772},"\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":1105,"title":1106,"description":1107,"published":1108,"category":821,"image":1109,"draft":772},"\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":1111,"title":1112,"description":1113,"published":1114,"category":768,"image":1115,"draft":772},"\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":1117,"title":1118,"description":1119,"published":1120,"category":821,"image":1121,"draft":772},"\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":1123,"title":1124,"description":1125,"published":1120,"category":821,"image":1126,"draft":772},"\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":1128,"title":1129,"description":1130,"published":1131,"category":821,"image":1132,"draft":772},"\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":1134,"title":1135,"description":1136,"published":1137,"category":768,"image":1138,"draft":772},"\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":1140,"title":1141,"description":1142,"published":1143,"category":821,"image":1144,"draft":772},"\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":1146,"title":1147,"description":1148,"published":1143,"category":768,"image":1149,"draft":772},"\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":1151,"title":1152,"description":1153,"published":1154,"category":768,"image":1155,"draft":772},"\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":1157,"title":1158,"description":1159,"published":1154,"category":821,"image":1160,"draft":772},"\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",1791618969087]