[{"data":1,"prerenderedAt":1161},["ShallowReactive",2],{"blog-de-supabase-backup-github-action":3,"blog-index-de":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_de\u002Fblog\u002Fsupabase-backup-github-action.md","Kostenloses Supabase-Backup per GitHub Action, mit Haken",{"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",{},"Dein Supabase-Projekt ist auf dem Gratis-Tarif, also wird nirgendwohin etwas\nkopiert, oder es ist auf Pro, und jede Kopie liegt in dem Konto, um dessen\nVerlust du dir Sorgen machst. In einem Thread genau darüber hat jemand gesagt,\ndie Antwort sei eine Supabase-Backup-GitHub-Action: eine kleine Datei in einem\nRepository, die jede Nacht deine Datenbank dumpt und nichts kostet.",[10,14,15,16,20],{},"Der Rat war richtig. Supabase veröffentlicht den Workflow selbst, und für viele Apps\nist er das, was du diese Woche einrichten solltest. Hier ist der Teil, den diese\nThreads auslassen: ",[17,18,19],"strong",{},"Er kostet kein Geld und hat trotzdem einen Preis."," Jeder\nLauf lädt deine ganze Datenbank herunter, und Supabase misst diesen Download.",[10,22,23],{},"Stell es dir wie das Datenvolumen in deinem Handyvertrag vor. Dein Tarif bringt\nein monatliches Kontingent mit, alles, was deine App tut, zehrt davon, und ein\nBackup ist ein großer Download im selben Vertrag. Auf dem Gratis-Tarif braucht\neine nächtliche Kopie einer Datenbank nahe an ihrem Größenlimit das ganze\nMonatskontingent in etwa zehn Tagen auf. Das und ein Connection String, den\nGitHub nicht erreicht, sind die beiden Dinge zwischen dir und einem\nfunktionierenden Backup, und keines davon steht auf der Seite von Supabase.",[25,26,28],"h2",{"id":27},"kann-ich-supabase-kostenlos-mit-einer-github-action-sichern","Kann ich Supabase kostenlos mit einer GitHub Action sichern?",[10,30,31,32,39],{},"Ja, und Supabase dokumentiert, wie. Seine Seite zu\n",[33,34,38],"a",{"href":35,"rel":36},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fdeployment\u002Fci\u002Fbackups",[37],"nofollow","automatischen Backups mit GitHub Actions","\nzeigt einen Workflow, der die Supabase CLI installiert, deine Rollen, dein\nSchema und deine Daten in drei Dateien dumpt und sie nach Zeitplan zurück ins\nRepository committet.",[10,41,42,43,48],{},"GitHub verlangt dafür ebenfalls nichts, in Grenzen. Ein privates Repository auf\nGitHub Free bekommt\n",[33,44,47],{"href":45,"rel":46},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fbilling\u002Fconcepts\u002Fproduct-billing\u002Fgithub-actions",[37],"2.000 Actions-Minuten im Monat",",\nund ein nächtlicher Dump einer kleinen Datenbank verbraucht davon einen kleinen\nTeil.",[10,50,51,52,56],{},"Was du bekommst, ist eine Kopie, die Supabase jede Nacht verlässt und auf den\nServern einer anderen Firma landet. Genau das können dir die eigenen Backups von\nSupabase nicht geben, denn die Tageskopien auf einem bezahlten Tarif\n",[33,53,55],{"href":54},"\u002Fblog\u002Fdownload-your-supabase-backup","bleiben in dem Konto, das sie schützen",".",[10,58,59],{},"Die richtige Antwort ist es, wenn drei Dinge zutreffen. Deine App liegt schon in\neinem GitHub-Repository, was der Fall ist, wenn du in Lovable oder einem\nähnlichen Builder die GitHub-Synchronisierung eingeschaltet hast. Eine\nYAML-Datei zu bearbeiten macht dir keine Sorgen. Und deine Datenbank ist klein\nim Verhältnis zum Egress-Kontingent deines Tarifs. Die ersten beiden weißt du\nschon. Das dritte ist Rechnerei und hat weiter unten einen eigenen Abschnitt.",[25,61,63],{"id":62},"der-workflow-mit-zeitplan-und-secret","Der Workflow, mit Zeitplan und Secret",[10,65,66,67,71],{},"Speichere das als ",[68,69,70],"code",{},".github\u002Fworkflows\u002Fsupabase-backup.yml"," in einem privaten\nRepository, in dem sonst nichts liegt:",[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 * * *' # jeden Tag um 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],{},"Es ist der Workflow von Supabase mit drei Änderungen.",[86,87,88,99,123],"ul",{},[89,90,91,94,95,98],"li",{},[17,92,93],{},"Er läuft nach Zeitplan und wenn du den Knopf drückst, sonst nie."," Die\nVersion von Supabase läuft außerdem bei jedem Push und jedem Pull Request auf\n",[68,96,97],{},"main",". Jeder Lauf ist ein vollständiger Download deiner Datenbank, und in\neinem Repository, das auch deine App enthält, würde jede Änderung, die du\nauslieferst, ein Backup an Kontingent kosten.",[89,100,101,104,105,110,111,114,115,118,119,122],{},[17,102,103],{},"Er läuft um 03:17, nicht zur vollen Stunde."," GitHub schreibt, dass geplante\nLäufe\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],"zu Beginn jeder Stunde verzögert werden können","\nund dass bei genug Last manche Jobs in der Warteschlange verworfen werden. Das\nBeispiel von Supabase nutzt ",[68,112,113],{},"0 0 * * *",", also die volle Stunde. Die Zeiten\nsind UTC, solange du keine ",[68,116,117],{},"timezone"," angibst, und jede Minute außer ",[68,120,121],{},"0"," geht.",[89,124,125,134,135,138],{},[17,126,127,128,133],{},"Die Datenzeile entspricht der aktuellen\n",[33,129,132],{"href":130,"rel":131},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmigrating-within-supabase\u002Fbackup-restore",[37],"Anleitung zu Backup und Restore","\nvon Supabase",", die zwei ",[68,136,137],{},"-x","-Ausschlüsse enthält, die auf der Workflow-Seite\nfehlen. Die Dateien, die du aufbewahrst, sind dann die, für die die\nRestore-Anleitung von Supabase geschrieben ist.",[10,140,141,142,145],{},"Dann das Secret. Öffne im Repository Settings, dann Secrets and variables, dann\nActions, und leg ein Repository-Secret namens ",[68,143,144],{},"SUPABASE_DB_URL"," an. Was\nhineingehört, entscheidet darüber, ob das alles funktioniert, deshalb bekommt es\nden nächsten Abschnitt für sich.",[10,147,148,149,152],{},"Sobald es gespeichert ist, starte den Workflow einmal von Hand im Actions-Tab,\ndamit der erste Lauf passiert, während du zusiehst. ",[68,150,151],{},"workflow_dispatch"," ist die\nZeile, die dir den Button Run workflow gibt.",[25,154,156],{"id":155},"welcher-connection-string-gehört-ins-secret","Welcher Connection String gehört ins Secret?",[10,158,159],{},"Der Session-Pooler-String, über den Connect-Button oben in deinem\nSupabase-Projekt. Nimm ihn, auch wenn die Workflow-Seite von Supabase in ihrem\nBeispiel die direkte Verbindung zeigt.",[10,161,162,163,166,167,170,171,176],{},"Der Grund ist IPv6, die neuere Art von Internetadresse. Die direkte Verbindung\nvon Supabase, der Host, der mit ",[68,164,165],{},"db."," beginnt und auf ",[68,168,169],{},"supabase.co"," endet,\n",[33,172,175],{"href":173,"rel":174},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fipv4-address",[37],"nutzt standardmäßig IPv6",",\nund dieselbe Seite führt GitHub Actions unter den Diensten, die nur IPv4\nannehmen. Der Runner bekommt eine Adresse, zu der er keinen Weg hat, und der\nerste Dump scheitert, bevor ein Byte geschrieben ist. Der Fehler sagt, der\nHostname ließ sich nicht auflösen oder das Netzwerk sei nicht erreichbar, oft\nmit einer langen Adresse voller Doppelpunkte daneben. Diese Adresse ist die\nIPv6-Adresse. Es liest sich wie ein falsches Passwort oder eine Datenbank, die\nausgefallen ist, und die eigentliche Ursache ist ein Netz, in dem der Runner\nnicht ist.",[10,178,179,180,183,184,187,188,56],{},"Die Anleitung zu Backup und Restore von Supabase sagt, standardmäßig den\nSession-Pooler-String zu nehmen und den direkten nur, wenn dein Netz IPv6\nunterstützt oder du für das IPv4-Add-on bezahlst. Den Pooler-String erkennst du\nan drei Dingen: Sein Benutzername ist ",[68,181,182],{},"postgres."," gefolgt von der Referenz\ndeines Projekts, sein Host endet auf ",[68,185,186],{},"pooler.supabase.com",", und sein Port ist\n",[68,189,190],{},"5432",[192,193],"diagram",{"alt":194,"caption":195,"src":196},"Ein GitHub-Runner links mit zwei Wegen hinaus. Der obere trägt den direkten Host db.[ref].supabase.co, ist mit IPv6 markiert und endet mit einem Kreuz an einer Wand vor der Datenbank. Der untere trägt den Host pooler.supabase.com, ist mit IPv4 markiert und erreicht die Datenbank mit einem Haken.","Zur IPv6-Adresse der direkten Verbindung hat der Runner keinen Weg. Der Session Pooler antwortet über IPv4 und erreicht dieselbe Datenbank.","\u002Fblog\u002Fsupabase-backup-github-action\u002Fwhich-string-reaches-the-runner-1600x620.png",[10,198,199],{},"Das Passwort darin ist dein Datenbankpasswort, das beim Anlegen des Projekts\nfestgelegt wurde, kein API-Schlüssel. Wenn es niemand aufgeschrieben hat, kannst\ndu es bei Supabase unter Database Settings zurücksetzen; alles andere, was sich\nmit dem alten verbindet, funktioniert dann nicht mehr, bis es das neue bekommt.",[10,201,202],{},"Dieser String kann jede Zeile deiner Datenbank lesen und ändern. Er lebt im\nSecret und nirgends sonst: nie in der Workflow-Datei, nie in einer\nCommit-Nachricht und nie in einem KI-Assistenten, dem du ihn zusammen mit der\nFehlermeldung eingefügt hast, nach der du fragen wolltest.",[25,204,206],{"id":205},"zählt-ein-supabase-backup-gegen-mein-egress","Zählt ein Supabase-Backup gegen mein Egress?",[10,208,209,210,215],{},"Ja, vollständig. Supabase rechnet als\n",[33,211,214],{"href":212,"rel":213},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmanage-your-usage\u002Fegress",[37],"Egress","\nab, also als ausgehenden Datenverkehr, was irgendeiner seiner Dienste nach außen\nschickt, und ein Dump über den Pooler läuft als Shared Pooler Egress im selben\nKontingent wie dein API-Verkehr, deine Datei-Downloads und alles andere, was\ndeine App ausliefert.",[10,217,218,219,224],{},"Zurück zum Handyvertrag. Das Kontingent setzt sich jeden Abrechnungsmonat\nzurück, jeder Dienst, den deine App nutzt, zehrt davon, und ein Backup ist ein\nweiterer großer Download. Es ist außerdem ein Familientarif: Supabase wendet das\nKontingent auf\n",[33,220,223],{"href":221,"rel":222},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fbilling-on-supabase",[37],"deine ganze Organisation","\nan, also teilen sich alle Projekte darin das eine Kontingent.",[10,226,227,228,232],{},"Am 26. September 2026 nannte die Preisseite von Supabase für den Gratis-Tarif\n5 GB Egress im Monat und ein Limit von 500 MB für die Datenbank jedes Projekts,\nfür den Pro-Tarif 250 GB Egress. Auf dem Gratis-Tarif gibt es noch einmal 5 GB\nfür Cached Egress, das Dateien aus dem CDN von Supabase abdeckt, und ein Backup\nberührt es nie. Die übrigen Limits des Gratis-Tarifs und ",[33,229,231],{"href":230},"\u002Fblog\u002Fsupabase-free-plan-limits","was jedes davon tut, wenn du es überschreitest",", haben einen eigenen Artikel.",[10,234,235,236,241],{},"Überschreitest du das Kontingent auf dem Gratis-Tarif, kommt keine Rechnung.\nSupabase\n",[33,237,240],{"href":238,"rel":239},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fbilling-faq",[37],"benachrichtigt dich und gibt dir eine Schonfrist",",\nund wenn du weiter darüber liegst, schränkt es jedes Projekt der Organisation\nein. Laut Supabase kann das heißen: API-Anfragen, die mit einem 402-Fehler\nbeantwortet werden, eine Datenbank im Nur-Lese-Modus oder pausierte Projekte.\nFür eine App mit Kunden ist das ein Ausfall, den dein Backup ausgelöst hat.",[10,243,244],{},"Das gilt für jedes Backup, das Supabase verlässt, auch für das, das wir\nverkaufen. Eine Kopie außerhalb des Kontos muss heruntergeladen werden, um\ndorthin zu kommen.",[25,246,248],{"id":247},"wie-oft-sollte-das-backup-laufen","Wie oft sollte das Backup laufen?",[10,250,251],{},"So oft, wie dein Kontingent es bezahlt, und das läuft auf eine einzige\nMultiplikation hinaus: die Größe deiner Datenbank mal die Läufe im Monat.",[10,253,254],{},"Supabase zeigt die Größe deiner Datenbank im Database-Report unter Observability\nin deinem Projekt. Ein Dump ist nicht genau so groß. Er lässt Indizes weg, die\naus ihren Definitionen neu aufgebaut werden, und er schreibt jeden Wert als Text.\nZum Planen ist er nah genug dran, und es ist die Zahl, die du nachschlagen\nkannst.",[256,257,258,277],"table",{},[259,260,261],"thead",{},[262,263,264,268,271,274],"tr",{},[265,266,267],"th",{},"Datenbankgröße",[265,269,270],{},"Täglich (30 Läufe)",[265,272,273],{},"Zweimal pro Woche",[265,275,276],{},"Wöchentlich",[278,279,280,295,308,322],"tbody",{},[262,281,282,286,289,292],{},[283,284,285],"td",{},"50 MB",[283,287,288],{},"1,5 GB",[283,290,291],{},"0,4 GB",[283,293,294],{},"0,2 GB",[262,296,297,300,303,306],{},[283,298,299],{},"100 MB",[283,301,302],{},"3 GB",[283,304,305],{},"0,9 GB",[283,307,291],{},[262,309,310,313,316,319],{},[283,311,312],{},"250 MB",[283,314,315],{},"7,5 GB",[283,317,318],{},"2,2 GB",[283,320,321],{},"1,1 GB",[262,323,324,327,330,333],{},[283,325,326],{},"500 MB",[283,328,329],{},"15 GB",[283,331,332],{},"4,3 GB",[283,334,318],{},[10,336,337],{},"Ein Monat hat etwa 4,3 Wochen, daher kommen die letzten beiden Spalten.",[10,339,340],{},"Auf dem Gratis-Tarif verbrauchen die unteren beiden Tageswerte mehr als das\nganze Monatskontingent, bevor deine App eine einzige Anfrage beantwortet hat.\nEin täglicher Zeitplan braucht die vollen 5 GB bei etwa 160 MB auf, und der\nVerkehr deiner App kommt aus demselben Kontingent, also lies auf der Usage-Seite\ndeiner Organisation das Egress des letzten Monats nach, bevor du wählst.\nWöchentlich passt bei jeder Größe, die der Gratis-Tarif erlaubt.",[192,342],{"alt":343,"caption":344,"src":345},"Eine Datenbank mit einem Wiederholungszeichen neben zwei Säulen aus Blöcken: dreißig Kopien im Monat links, vier rechts. Eine gestrichelte Linie markiert das Monatskontingent. Die linke Säule überschreitet sie nach einem Drittel ihrer Höhe, und ihre Blöcke oberhalb der Linie sind gelb. Die rechte Säule bleibt weit darunter, in Türkis.","Eine Datenbank am 500-MB-Limit des Gratis-Tarifs, täglich und wöchentlich gesichert. Die gestrichelte Linie sind die 5 GB Egress des Gratis-Tarifs für den Monat.","\u002Fblog\u002Fsupabase-backup-github-action\u002Fthirty-copies-four-copies-1600x680.png",[10,347,348],{},"Die Cron-Zeile ist das Einzige, was du änderst:",[73,350,355],{"className":351,"code":353,"language":354},[352],"language-text","17 3 * * *      jeden Tag um 03:17 UTC\n17 3 * * 1,4    montags und donnerstags\n17 3 * * 0      sonntags\n","text",[68,356,353],{"__ignoreMap":79},[10,358,359],{},"Auf Pro spielt die Rechnung kaum noch eine Rolle. 250 GB im Monat bezahlen einen\ntäglichen Dump eines Projekts bis etwa 8 GB, und das ist der Speicherplatz, den\nder Pro-Tarif pro Projekt enthält.",[25,361,363],{"id":362},"warum-scheitert-mein-workflow-mit-einem-pg_dump-versionsfehler","Warum scheitert mein Workflow mit einem pg_dump-Versionsfehler?",[10,365,366,367,370,371,373,374,376],{},"Weil das ",[68,368,369],{},"pg_dump",", das er ausgeführt hat, älter ist als deine Datenbank. Das\npassiert nur einem Workflow, der ",[68,372,369],{}," direkt aufruft statt über die\nSupabase CLI. Die CLI bringt ihr eigenes ",[68,375,369],{}," mit, und das ist ein Grund,\nwarum der Workflow oben sie nutzt.",[10,378,379,380,383,384,389,390,392,397],{},"Der ",[68,381,382],{},"ubuntu-latest","-Runner von GitHub kommt mit\n",[33,385,388],{"href":386,"rel":387},"https:\u002F\u002Fgithub.com\u002Factions\u002Frunner-images\u002Fblob\u002Fmain\u002Fimages\u002Fubuntu\u002FUbuntu2404-Readme.md",[37],"installiertem PostgreSQL 16",".\nSupabase-Projekte können auf Postgres 17 laufen, und Postgres dokumentiert, dass\n",[68,391,369],{},[33,393,396],{"href":394,"rel":395},"https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fapp-pgdump.html",[37],"nicht von einem Server dumpt, der eine neuere Hauptversion hat als es selbst",",\nund sich lieber weigert, als eine fehlerhafte Datei zu riskieren. Der Lauf\nbricht ab mit:",[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],{},"Die Version deines Projekts steht unter Project Settings, dann General, falls du\nsie prüfen willst. An deinen Zugangsdaten ist nichts falsch.",[10,408,409],{},"Die Lösung hat zwei Schritte. Füge das eigene Paket-Repository von PostgreSQL\nhinzu, damit der Runner den Client in Version 17 installieren kann, und ruf\ndiesen Client dann über seinen vollen Pfad auf:",[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],{},"Behalte die Argumente, die du schon hattest, hinter dem Connection String. Der\nvolle Pfad ist wichtig: Auf Ubuntu ist das einfache ",[68,420,369],{}," ein Wrapper, der\neine Version für dich auswählt, und auf dem Runner liegt schon eine\nPostgreSQL-16-Installation, die er auswählen kann.",[10,423,424,425,427,428,431,432,440,441,444,445,448,449,451,452,455,456,458],{},"Auch das ",[68,426,369],{}," der CLI hat eine Version, und die kommt nicht aus deinem\nProjekt. Liegt keine ",[68,429,430],{},"supabase\u002Fconfig.toml"," neben dem Workflow, wie in einem\nRepository, das sonst nichts enthält,\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],"nimmt die CLI ",[68,438,369],{}," 17",".\nBei einem Projekt, das noch auf Postgres 15 läuft, enthält die ",[68,442,443],{},"data.sql"," dann\n",[68,446,447],{},"SET transaction_timeout = 0",", eine Einstellung, die Postgres 15 nicht kennt,\nund das Einspielen bricht in jeder Postgres-15-Datenbank an dieser Zeile ab,\nauch im Projekt, aus dem die Datei stammt. Wir haben das am 4. Oktober 2026 mit\n",[68,450,369],{}," 17.11 und Postgres 15.19 nachgestellt. Läuft dein Projekt auf 15,\nergänze im ",[68,453,454],{},"env","-Block des Jobs eine Zeile, damit die CLI das passende ",[68,457,369],{},"\nnimmt:",[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],{},"Das Backup selbst läuft so oder so ohne Fehler durch, ohne diese Zeile zeigt\nsich der Unterschied also erst an dem Tag, an dem du die Datei einspielst.",[25,469,471],{"id":470},"kann-ich-das-backup-in-mein-repository-committen","Kann ich das Backup in mein Repository committen?",[10,473,474],{},"In ein privates, ja. Genau das macht der Workflow von Supabase, und seine Seite\nsagt zweimal, dass du deine Daten nie in ein öffentliches Repository sichern\nsollst.",[10,476,477],{},"Drei Dinge über ein Repository als Zuhause für eine Datenbank, keines davon\nsteht auf dieser Seite:",[86,479,480,494,500],{},[89,481,482,485,486,488,489,493],{},[17,483,484],{},"Wer das Repository lesen kann, kann deine Nutzer lesen."," ",[68,487,443],{}," enthält\njede Zeile: E-Mail-Adressen, Namen, was auch immer deine Tabellen speichern,\nund ",[33,490,492],{"href":491},"\u002Fblog\u002Fsupabase-backup-auth-users","auch deine Konten",". Deshalb bekommt der\nWorkflow ein eigenes Repository, in dem sonst niemand ist, und nicht das, in\ndem der Code deiner App liegt, das dein Builder vielleicht synchronisiert und\nin das eines Tages ein Freelancer eingeladen wird.",[89,495,496,499],{},[17,497,498],{},"Die Kopie jeder Nacht bleibt in der Historie."," Git behält jede Version\njeder Datei. Bittet jemand aus deiner Kundschaft darum, das eigene Konto zu\nlöschen, steht die Zeile weiterhin in jedem früheren Commit dieses Repositorys, bis du dessen Historie\numschreibst.",[89,501,502,505,506,511,512,514],{},[17,503,504],{},"Bei 100 MiB ist Schluss."," GitHub warnt bei Dateien über 50 MiB und\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],"blockiert Dateien über 100 MiB",",\nund dieselbe Seite sagt, dass Git nicht für große SQL-Dateien gemacht ist. In\nder Nacht, in der ",[68,513,443],{}," diese Grenze überschreitet, scheitert der\nCommit-Schritt, und jeder Lauf danach scheitert genauso.",[10,516,517],{},"Wenn du in die Nähe kommst, kann derselbe Workflow die drei Dateien in einen\nStorage-Bucket hochladen, der dir gehört, statt sie zu committen. Oder es ist\nder Punkt, an dem es nicht mehr billig ist, das selbst zu machen, und dort\nbeginnt der letzte Abschnitt.",[25,519,521],{"id":520},"was-kopiert-der-workflow-nicht","Was kopiert der Workflow nicht?",[10,523,524,525,529],{},"Deine hochgeladenen Dateien. Supabase Storage bewahrt jede Datei außerhalb der\nDatenbank auf und eine Zeile, die sie beschreibt, darin, also enthält der Dump\ndie Zeile und nicht das Bild.\n",[33,526,528],{"href":527},"\u002Fblog\u002Fsupabase-storage-backup","Storage sichern"," ist eine eigene Aufgabe, auf\njedem Weg, den es gibt.",[10,531,532,533,536,537,539,540,543,544,547],{},"Deine Nutzer sind drin. Der Daten-Dump geht durch das ",[68,534,535],{},"auth","-Schema, in dem\ndeine Konten liegen, und eine Suche in ",[68,538,443],{}," nach ",[68,541,542],{},"auth.users"," zeigt sie.\nDas Projekt rund um die Datenbank ist es nicht: Edge Functions,\nAuth-Provider-Einstellungen, API-Schlüssel und Secrets sind Konfiguration, keine\nDaten, und\n",[33,545,546],{"href":54},"die Liste dessen, was in keiner der beiden Kopien ist",",\nliest du am besten, bevor du sie brauchst.",[25,549,551],{"id":550},"heißt-ein-grüner-lauf-dass-das-backup-funktioniert-hat","Heißt ein grüner Lauf, dass das Backup funktioniert hat?",[10,553,554],{},"Er heißt, dass der Job ohne Fehler zu Ende lief, und das ist eine kleinere\nAussage. Drei ganz verschiedene Ergebnisse enden mit demselben grünen Haken:",[556,557,558,561,564],"ol",{},[89,559,560],{},"Ein guter Dump des richtigen Projekts.",[89,562,563],{},"Ein Dump des falschen Projekts, weil im Secret der String einer\nStaging-Kopie steht.",[89,565,566,567,570],{},"Ein Dump ohne eine einzige Zeile, weil jemand die Datenzeile bearbeitet hat\nund ",[68,568,569],{},"--data-only"," verloren ging, womit sie wieder zum Schema-Dump wird.",[10,572,573,574,578],{},"Ein Ergebnis hinterlässt gar keine Spur. Ein geplanter Lauf, den GitHub unter\nLast verwirft, taucht nicht als Fehler auf, weil es keinen Lauf gibt, der\nscheitern könnte. Und wenn ein Lauf scheitert, schickt GitHub die Nachricht an\n",[33,575,577],{"href":107,"rel":576},[37],"die Person, die die Cron-Zeile zuletzt bearbeitet hat",".\nHat ein Freelancer das für dich eingerichtet, landet die E-Mail über dein\nBackup dort.",[192,580],{"alt":581,"caption":582,"src":583},"Ein abgeschlossener Job mit grünem Haken. Eine Linie verlässt ihn und teilt sich in zwei gleich aussehende Dateifelder. In der oberen Datei sind alle Zeilen gefüllt. In der unteren hören die Zeilen nach zweien auf, der Rest sind leere gestrichelte Umrisse.","Beide Dateien kamen aus einem Lauf, der ohne Fehler endete. Nichts im Lauf verrät dir, welche du hast.","\u002Fblog\u002Fsupabase-backup-github-action\u002Fgreen-run-short-file-1600x740.png",[10,585,586,587,591],{},"Nur eine Wiederherstellung unterscheidet sie. Spiel die drei Dateien in ein\nWegwerf-Projekt bei Supabase oder ein lokales ein, vergleich die Zeilenzahlen\nder Tabellen, die dir wichtig sind, mit den echten, und melde dich als echter\nNutzer an.\n",[33,588,590],{"href":589},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Wie du ein Supabase-Backup wiederherstellst","\nenthält die Befehle, in der Reihenfolge, die Supabase angibt. Mach es jetzt\neinmal und dann jedes Mal wieder, wenn du den Workflow änderst.",[10,593,594,595,600],{},"Du kannst die Wiederherstellung und das Zählen auch jedem Lauf überlassen. Wir\nhaben eine Version dieses Workflows als quelloffene GitHub Action veröffentlicht,\n",[33,596,599],{"href":597,"rel":598},"https:\u002F\u002Fgithub.com\u002FReeve-page\u002Fsupabase-backup-action",[37],"Reeve-page\u002Fsupabase-backup-action",".\nSie erstellt dieselben drei Dumps, bewahrt die Kopie als Artefakt des\nWorkflows oder in einem S3- oder R2-Bucket auf, spielt sie danach in eine\nWegwerf-Datenbank von Supabase auf dem Runner ein und vergleicht die Zeilenzahl\njeder Tabelle mit der Datei. Grün wird der Lauf nur, wenn jede Tabelle mit den\nZeilen zurückkam, die die Datei enthält:",[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],{},"Sie ist kostenlos und steht unter der MIT-Lizenz. Jeder Lauf lädt weiterhin die\nganze Datenbank herunter, die Egress-Rechnung oben gilt also unverändert, und die\nAnmeldung testest du weiterhin selbst.",[25,611,613],{"id":612},"wann-sollte-ich-aufhören-das-selbst-zu-machen","Wann sollte ich aufhören, das selbst zu machen?",[10,615,616],{},"Wenn die Rechnung nicht mehr aufgeht, wenn die Datei dem Repository\nentwächst oder wenn niemand die Kopien wiederherstellt. Eines davon reicht.",[86,618,619,625,633,639],{},[89,620,621,624],{},[17,622,623],{},"Deine Datenbank ist dem Gratis-Kontingent entwachsen."," Pro hebt das Egress\nauf 250 GB und bringt die eigenen täglichen Backups von Supabase mit, sieben\nTage aufbewahrt, die sich per Klick wiederherstellen lassen. Lass den Workflow\ndaneben weiterlaufen, denn diese Kopien liegen im Konto.",[89,626,627,632],{},[17,628,629,631],{},[68,630,443],{}," steuert auf 100 MiB zu."," Sie in einen Bucket umzuziehen heißt\nmehr YAML und mehr, das jemand am Laufen halten muss.",[89,634,635,638],{},[17,636,637],{},"Niemand hat je eine Kopie wiederhergestellt."," Der Workflow schreibt weiter\nDateien, ob sie sich öffnen lassen oder nicht.",[89,640,641,644],{},[17,642,643],{},"Deine Nutzer laden Dateien hoch."," Die erreicht der Workflow nicht, und der\nJob, der es tut, ist ein zweiter, den jemand am Leben halten muss.",[25,646,648],{"id":647},"wo-reeve-care-passt","Wo Reeve Care passt",[10,650,651],{},[17,652,653],{},"Care zieht die Kopie nach Zeitplan, bewahrt sie außerhalb deines\nSupabase-Kontos auf und prüft jede Kopie, bevor sie zählt.",[86,655,656,662,668,674,680],{},[89,657,658,661],{},[17,659,660],{},"Täglich bei Care und öfter bei den Tarifen darüber",", ohne etwas in deinem\nRepository und ohne Connection String in einer CI.",[89,663,664,667],{},[17,665,666],{},"Zurückgelesen und gezählt."," Jede Kopie wird geöffnet und mit dem\nverglichen, was hineinging, und das Datum in deinem Dashboard ist die letzte\nKopie, die diese Prüfung bestanden hat, nie der letzte Lauf.",[89,669,670,673],{},[17,671,672],{},"Deine Konten sind drin",", und deine hochgeladenen Dateien kommen mit,\nsobald du einen Storage-Zugang verbindest.",[89,675,676,679],{},[17,677,678],{},"Wiederherstellen ist ein Klick",", und bevor irgendetwas ersetzt wird, wird\neine Kopie des aktuellen Zustands gezogen.",[89,681,682,685,686,689,690,692,693,696],{},[17,683,684],{},"Jede Kopie lässt sich als Zip herunterladen",", mit ",[68,687,688],{},"schema.sql",", ",[68,691,443],{},"\nund ",[68,694,695],{},"roles.sql",", denselben drei Dateien, die dieser Workflow macht, dazu die\nZeilenzahl jeder Tabelle.",[10,698,699,700,704,705,709],{},"Care bewahrt eine Kopie deiner Supabase-Datenbank auf. Kopie, Prüfung und\nWiederherstellung sind Schritt für Schritt auf der\n",[33,701,703],{"href":702},"\u002Fsupabase-backups","Seite zu Supabase-Backups"," gezeichnet, und\n",[33,706,708],{"href":707},"\u002Fpricing","was jeder Tarif enthält",", steht auf der Preisseite.",[25,711,713],{"id":712},"was-du-diese-woche-tun-solltest","Was du diese Woche tun solltest",[715,716,717],"key-takeaways",{},[86,718,719,722,727,730,738,741],{},[89,720,721],{},"Schlag die Größe deiner Datenbank und das Egress des letzten Monats nach und wähl den Zeitplan aus der Tabelle, bevor du die Cron-Zeile schreibst.",[89,723,724,725,56],{},"Leg ein privates Repository an, das nichts als den Workflow enthält, und leg den Session-Pooler-String in sein Secret ",[68,726,144],{},[89,728,729],{},"Wenn du mit dem Beispiel von Supabase angefangen hast, lösch die Trigger für Push und Pull Request und leg den Cron weg von der vollen Stunde.",[89,731,732,733,539,735,737],{},"Starte ihn einmal von Hand im Actions-Tab und durchsuche dann ",[68,734,443],{},[68,736,542],{}," und nach einer Tabelle, von der du weißt, dass sie Zeilen hat.",[89,739,740],{},"Stell eine Kopie in einem Wegwerf-Projekt wieder her und melde dich als echter Nutzer an.",[89,742,743],{},"Sichere deine Storage-Dateien mit einem eigenen Job.",[10,745,746,747,751],{},"Bevor du diesen Tab schließt, öffne bei Supabase die Usage-Seite deiner\nOrganisation und lies das Egress des letzten Monats ab. Diese Zahl neben der\nGröße deiner Datenbank bestimmt deine Cron-Zeile. Und wenn du den kostenlosen\nWeg noch gegen die bezahlten abwägst,\n",[33,748,750],{"href":749},"\u002Fblog\u002Fsupabase-backup-tools-compared","die vier Arten von Supabase-Backup-Tools","\nstehen dort nebeneinander.",{"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","Eine Datenbank in einem Supabase-Gehäuse, ein Rohr durch einen Zähler mit der Nadel im gelben Bereich, dahinter nächtliche Dateien.","Eine Supabase-Backup-GitHub-Action kostet nichts und passt für viele Apps. Der Workflow, der richtige Connection String und das Egress pro Lauf.",false,"md",[775,778,781,783,786,789],{"q":776,"a":777},"Kann ich Supabase kostenlos sichern?","Ja. Supabase dokumentiert einen GitHub-Actions-Workflow, der seine CLI installiert, nach Zeitplan deine Rollen, dein Schema und deine Daten in drei Dateien dumpt und sie ins Repository committet. Ein privates Repository auf GitHub Free bekommt 2.000 Actions-Minuten im Monat, und ein nächtlicher Dump einer kleinen Datenbank verbraucht davon einen kleinen Teil. Was das Backup tatsächlich verbraucht, ist dein Egress-Kontingent bei Supabase, denn jeder Lauf lädt die ganze Datenbank herunter.",{"q":779,"a":780},"Wie oft sollte ein Supabase-Backup-Cron laufen?","So oft, wie dein Egress-Kontingent es bezahlen kann. Multipliziere die Größe deiner Datenbank mit den Läufen im Monat: Eine 100-MB-Datenbank bewegt bei täglichem Dump etwa 3 GB, eine mit 500 MB etwa 15 GB. Der Gratis-Tarif enthält 5 GB für die ganze Organisation, geteilt mit dem Verkehr deiner App. Leg den Job auf eine Minute, die nicht zur vollen Stunde liegt, denn GitHub schreibt, dass geplante Läufe zu Beginn einer Stunde verzögert und manche verworfen werden können.",{"q":206,"a":782},"Ja. Supabase rechnet als Egress die Daten ab, die irgendeiner seiner Dienste nach außen schickt, und ein Dump über den Connection Pooler läuft als Shared Pooler Egress im selben Kontingent wie dein API-Verkehr. Das Kontingent gehört der ganzen Organisation, nicht einem einzelnen Projekt. Auf dem Gratis-Tarif führt wiederholtes Überschreiten zu Einschränkungen für jedes Projekt der Organisation.",{"q":784,"a":785},"Warum schlägt mein Backup-Workflow beim ersten Lauf fehl?","Zwei Fehler gehören zu diesem Aufbau. Der erste ist der Connection String: Die direkte Verbindung von Supabase nutzt IPv6, solange du das IPv4-Add-on nicht bezahlst, und Supabase führt GitHub Actions unter den Diensten, die nur IPv4 erreichen. Nimm also den Session-Pooler-String. Der zweite trifft Workflows, die pg_dump direkt aufrufen: Der PostgreSQL-16-Client des Runners weigert sich, ein Projekt auf Postgres 17 zu dumpen, und bricht mit aborting because of server version mismatch ab.",{"q":787,"a":788},"Kann ich mein Supabase-Backup in mein GitHub-Repository committen?","In ein privates, ja, genau das macht der Workflow von Supabase. In ein öffentliches nie, und Supabase sagt das auf derselben Seite zweimal. Gib ihm ein eigenes Repository, das sonst niemand lesen kann, denn die Datendatei enthält die E-Mail-Adressen deiner Nutzer. Und rechne damit, umzuziehen, wenn die Datenbank wächst: GitHub warnt bei Dateien über 50 MiB und lehnt Dateien über 100 MiB ab.",{"q":790,"a":791},"Woher weiß ich, ob die Backup-Datei etwas taugt?","Stell sie wieder her. Ein grüner Lauf heißt, dass der Job ohne Fehler zu Ende lief, und ein Dump des falschen Projekts oder ein Dump ohne eine einzige Zeile laufen genauso zu Ende. Spiel die drei Dateien in ein Wegwerf-Projekt bei Supabase oder ein lokales ein, vergleich die Zeilenzahlen der Tabellen, die dir wichtig sind, und melde dich als echter Nutzer an. Das ist die Prüfung, die dir sagt, ob sich die Datei öffnen lässt.","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",[794,795,796,797,798,799,800,801],"supabase backup github action","supabase backup automatisieren","supabase backup cron","kostenloses supabase backup","supabase pg_dump github actions","geplantes supabase backup","supabase backup workflow","supabase gratis tarif backup automatisch",{},true,"Kostenloses Supabase-Backup per GitHub Action","\u002Fblog\u002Fsupabase-backup-github-action","2026-09-27",{"title":5,"description":771},"blog\u002Fsupabase-backup-github-action",[810,811,812],"Eine Supabase-Backup-GitHub-Action führt die Supabase CLI nach Zeitplan aus und committet den Dump in ein privates Repository. Sie kostet nichts, und für viele Apps ist sie die richtige Antwort.","Jeder Lauf lädt deine ganze Datenbank herunter, und Supabase rechnet das als Egress ab. Der Gratis-Tarif enthält 5 GB im Monat für die ganze Organisation, und ein täglicher Dump einer Datenbank nahe am 500-MB-Limit braucht etwa das Dreifache.","Das Beispiel von Supabase verbindet sich mit einem String, den die Runner von GitHub nicht erreichen. Leg den Session-Pooler-String ins Secret und stell eine Kopie wieder her, bevor du den anderen traust.","2026-10-05","7-0G8pr2z3aBwUChANLRo6nnno3WcW55bJOQwaVof_Q",[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","Base44 Security Scan: das, was nur er sehen kann","Der Base44 Security Scan prüft sieben Arten von Problemen von innen. Hier ist die Hälfte, die er liest und sonst niemand, und die Hälfte, die er nie ansieht.","2026-10-10","Sicherheitsgrundlagen","\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","Dein API-Key wurde geleakt. Die richtige Reihenfolge","Ein API-Key wurde geleakt und du weißt nicht, was zuerst zu tun ist. Nicht jeder Key im Frontend ist ein Leck, und die Reihenfolge zählt mehr als das Tempo.","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\" ohne RLS abzuschalten","\"Infinite recursion detected in policy for relation\" heißt: Deine Policy hat die Tabelle gefragt, die sie schützt. So brichst du den Kreis.","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\" in Supabase, und die falsche Lösung","\"No API key found in request\" heißt, deine Supabase-Anfrage kam ohne Schlüssel an. Die meisten Antworten zeigen stattdessen auf deine Datenbankregeln.","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","Ist Base44 sicher? Was 5.442 echte Base44-Apps zeigten","Ist Base44 sicher? Wir haben 5.442 laufende Base44-Apps mit neun Checks geprüft. Fast alle bekamen ein B, aus Gründen, die der Inhaber nie gewählt hat.","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","API-Schlüssel verstecken: ab in eine Supabase Edge Function","Einen API-Schlüssel verstecken heißt, ihn aus dem Browser zu nehmen. Eine Supabase Edge Function ist der kleinste Ort dafür, und zwei Schritte zählen mehr.","\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","Ist deine .env-Datei öffentlich? Zwölf Pfade zum Prüfen","Ist deine .env-Datei auf deinem eigenen Webserver öffentlich? Zwölf Adressen sagen es dir, und ein Treffer heißt: alles darin ist längst öffentlich.","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","v0-Sicherheit: alle 1.790 gescannten v0-Apps bekamen ein A","v0-Sicherheit, gemessen an 1.790 laufenden v0-Apps: Jede bekam ein A. Nur 17 nannten eine Datenbank, und genau das misst das A vor allem.","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","Ist Bolt sicher? Was 1.123 echte Bolt-Apps zeigten","Ist Bolt sicher? Wir haben 1.123 laufende Bolt-Apps mit neun Checks geprüft. Das Hosting war sauber. Die Funde waren Schlüssel und offene Tabellen in den Apps.","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","Ist Supabase down oder liegt es an deiner App? So erkennst du es","Ist Supabase down oder liegt es an deiner App? Ein pausiertes Projekt, eine volle Datenbank und ein eigener Fehler sehen gleich aus. Vier Prüfungen helfen.","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","Verschlüsselt Supabase meine Daten? Ja. Wovor das schützt","Verschlüsselt Supabase Daten? Ja: AES-256 im Ruhezustand, TLS bei der Übertragung, SOC 2 und ISO 27001. Was jedes abdeckt und welches Leck keines stoppt.","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},"Supabase Gratis-Tarif: die Limits und was an jedem passiert","Die Limits des Supabase-Gratis-Tarifs: 500 MB Datenbank, 5 GB Egress und keine Backups. Was an jeder Grenze passiert und was $25 für Pro ändern.","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","Teste dein Supabase-Backup, bevor du es brauchst","So testest du dein Supabase-Backup: in ein Übungsprojekt einspielen, Zeilen zählen, anmelden und die Zeile suchen, die einer abgeschnittenen Datei fehlt.","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},"Warum du dein Supabase-Backup nicht herunterladen kannst","Dein Supabase-Backup kannst du auf aktuellen Projekten nicht herunterladen, weil die Tageskopie physisch ist. Wie du es prüfst und selbst eine Kopie hältst.","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\": der fehlende Grant","Ab 30. Oktober antwortet eine neue Supabase-Tabelle mit \"permission denied for table\", bis du Zugriff erteilst. Der Grant aus der E-Mail ist die halbe Lösung.","\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","Ist ein offener API-Endpunkt ein Sicherheitsproblem? Sieh ins JSON","Dein Scan hat einen offenen API-Endpunkt gemeldet. Ob das zählt, hängt davon ab, was zurückkam, und die meisten hier gehörten der Plattform.","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","Lovable Security Scan: das Eine, was er nicht beweist","Lovable Security Scan: was Quick Scan und Deep Scan prüfen, wann welcher läuft, und das Eine, was kein Scan von innen beweisen kann.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":491,"title":917,"description":918,"published":919,"category":768,"image":920,"draft":772},"Warum in deinem Supabase-Dump keine Nutzer stehen","Führe supabase db dump allein aus und du bekommst die Form deiner Datenbank und keine einzige Zeile, und das auth-Schema mit deinen Nutzern fehlt ganz.","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","Domain abgelaufen, Website offline: was jetzt passiert","Deine Domain ist abgelaufen und deine Website ist offline. Welche Frist jetzt läuft, warum das Zertifikat das kleinere Problem ist, und wie du beides prüfst.","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","Ist Lovable sicher? Was 18.554 echte Lovable-Apps zeigten","Ist Lovable sicher? Wir haben 18.554 laufende Lovable-Apps mit neun Checks geprüft. Die Plattform war die sauberste von fünf. Die Funde saßen in den Apps.","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","Die Sicherheits-Checkliste für Vibe-Coding, in neun Prüfungen","Eine Sicherheits-Checkliste für Vibe-Coding mit neun Punkten, die jeder von außen an deiner Live-App nachprüfen kann, jeder mit einem Test in einer Zeile.","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","Ein geheimer Stripe-Schlüssel im Frontend kann Geld bewegen","Ein geheimer Stripe-Schlüssel im Frontend kann erstatten, abbuchen und jeden Kundendatensatz lesen, den du hast. Dein pk_live_-Schlüssel gehört dorthin.","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","Vite-Env-Variablen offengelegt: der Präfix heißt veröffentlichen","Vite-Env-Variablen offengelegt: Deine App hat getan, was der Präfix verlangt. VITE_ und NEXT_PUBLIC_ heißen veröffentlichen, und die KI kannte den Preis nie.","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","Base44-Sicherheit: was ein Scan meldet und was du ändern kannst","Base44-Sicherheit auf 5.438 gescannten Apps: Drei Befunde auf fast jeder gehören der Plattform, die Source Map ist das Base44-Badge, und deine Liste ist kurz.","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","Ist Cursor AI sicher? Editor, Code und die App, die du veröffentlichst","Ist Cursor AI sicher? Drei Fragen in einer Suche: was Cursor behält, was sein Code falsch macht und ob deine veröffentlichte App offen steht.","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","Ist Replit sicher? Was wir in 3.042 Replit-Apps gefunden haben","Ist Replit sicher? Wir haben 3.042 laufende Replit-Apps mit neun externen Checks geprüft. Die Funde saßen in der veröffentlichten App, nicht im Hosting.","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: deine Datenbankkopie hat keine Dateien","Ein Supabase Storage Backup ist eine eigene Aufgabe. Datenbank-Backups enthalten die Liste deiner Dateien und keine davon, also bleibt jeder Upload kaputt.","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","Supabase Point-in-Time Recovery: Kosten und Grenzen","Supabase Point-in-Time Recovery spult deine Datenbank auf jede Sekunde der letzten Woche zurück. $100 im Monat zusätzlich zu Pro, und nur die Datenbank.","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","Supabase-Projekt pausiert? Deine Daten sind noch da","Supabase hat dein Projekt nach einer Woche ohne Aktivität pausiert. Gelöscht ist nichts, Wiederherstellen steht neben dem Namen, und du hast ein Jahr.","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","Welcher KI-App-Builder ist am sichersten? 30.998 Apps im Test","Welcher KI-App-Builder ist am sichersten? Wir haben 30.998 aktive Apps von Lovable, Base44, Replit, v0 und Bolt gescannt. Der Builder entscheidet das nicht.","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","Row Level Security für jede Supabase-Tabelle aktivieren und prüfen","Row Level Security in Supabase ohne Policy sperrt eine Tabelle komplett. Eine Policy ohne den Schalter bringt gar nichts. Hier ist das SQL, und der 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\": was die Warnung übersieht","Supabase meldet \"RLS disabled in public\" als Fehler. Zur Lese-Policy, die deine Tabelle genauso offen lässt, sagt der Advisor gar nichts.","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","Geleakten Supabase-service_role-Schlüssel richtig tauschen","Supabase sagt: erst das Leck schließen. Andere Anleitungen: sofort tauschen. Was richtig ist, hängt davon ab, wohin dein service_role-Schlüssel gelangt ist.","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","Vibe-Coding-Security-Scanner im Vergleich, unserer eingeschlossen","Der beste Vibe-Coding-Security-Scanner hängt an drei Fragen, die keine Funktionsliste beantwortet. Zehn Tools im Vergleich, mit Preisen und unseren Lücken.","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: die fünf Prüfungen selbst machen","Ein Supabase Security Checker liest deine veröffentlichte App statt deiner Projekteinstellungen. Hier sind die fünf Prüfungen und wie du jede selbst ausführst.","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","Vibe-Coding-Security-Scanner: was ein URL-Scan übersieht","Ein Vibe-Coding-Security-Scanner liest deine laufende App von außen. Was das abdeckt, die vier Dinge, die er nicht sehen kann, und wie du das Ergebnis liest.","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","Fehlende Sicherheitsheader: wann sie wirklich zählen","Fehlende Sicherheitsheader ist unser häufigster Befund. Wogegen sie schützen, und wann sie die unwichtigste Zeile in deinem Bericht sind.","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","Dein OpenAI-API-Schlüssel liegt im Frontend. Tausch ihn aus.","Ein OpenAI-API-Schlüssel im Frontend lässt sich an keine Domain binden. Tausch ihn heute, leg den Aufruf hinter deinen Server und begrenze das Budget.","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","API-Schlüssel im Frontend: was 30.998 Apps wirklich ausliefern","Ein API-Schlüssel im Frontend ist meistens ein Google-Maps-Schlüssel. Wir haben 30.998 aktive Vibe-Coding-Apps gescannt und gezählt, was wirklich austritt.","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},"Supabase-Backup-Tools im Vergleich, unseres eingeschlossen","Vier Arten von Supabase-Backup-Tool, was jedes wirklich kopiert und wann eine kostenlose GitHub Action jeden Anbieter schlägt, uns eingeschlossen.","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","Secrets in Replit nutzen, und was trotzdem veröffentlicht wird","Secrets in Replit nutzen: anlegen, auslesen und die zwei Gründe beheben, warum undefined zurückkommt. Dazu die Schlüssel, die das Werkzeug nicht schützt.","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","Supabase Gratis-Tarif: Backup ohne Terminal selbst machen","Im Supabase Gratis-Tarif gibt es keine Backups, die Kopie musst du selbst machen. Wie das im Dashboard geht und was der CSV-Weg auslässt.","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","Ist Supabase sicher? Ja. Dein Projekt ist eine eigene Frage","Ist Supabase sicher? Die Plattform ist auditiert, verschlüsselt und pentestet. Supabase schreibt selbst auf, wo das aufhört und deine Einstellungen anfangen.","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","Wo du deine Supabase API-Keys findest: anon, service_role, URL","Projekt-URL, anon-Schlüssel und service_role-Schlüssel liegen auf einer Seite im Dashboard. Wo sie ist, und welcher der vier Werte in deine App gehört.","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 in Supabase: was jetzt?","\"New row violates row-level security policy\" heißt, Supabase hat einen Schreibvorgang abgelehnt. Die schnelle Lösung öffnet die Tabelle wieder für alle.","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","Ist eine CORS-Wildcard ein Sicherheitsrisiko? Meist nicht.","Ist eine CORS-Wildcard ein Sicherheitsrisiko? Meist ist sie die Voreinstellung deines Builders und gibt nichts preis, was dein Server nicht ohnehin herausgab.","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","Supabase Branching ist kein Backup. Es geht nur vorwärts.","Warum Supabase Branching kein Backup ist: Ein Branch startet ohne deine Daten, und ein Merge bringt nur das Schema. Wofür es gut ist und was stattdessen hilft.","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},"Supabase-Backup wiederherstellen, und was danach kaputt ist","Wie du ein Supabase-Backup aus dem Dashboard oder aus einer Dump-Datei wiederherstellst, was ersetzt wird und warum die App danach kaputt sein kann.","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","Dein Supabase-Storage-Bucket ist öffentlich. Ist das ein Problem?","Ein öffentlicher Supabase-Storage-Bucket heißt: Wer die URL einer Datei hat, kann sie öffnen. Er heißt nicht, dass jemand den Inhalt auflisten darf.","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","Ist ein Google-API-Schlüssel im Frontend ein Problem?","Ein Google-API-Schlüssel im Frontend ist der Fund unseres Scanners Nummer eins, und meistens unbedenklich. Eine kostenlose Einstellung entscheidet darüber.","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","Ein KI-Agent hat meine Supabase-Daten gelöscht. Was hole ich zurück?","Ein KI-Agent hat Daten aus deiner Datenbank gelöscht. Was du zurückholst, stand schon vorher fest, und die nächsten Minuten entscheiden über den Rest.","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","Kann jeder deine Supabase-Datenbank lesen? 3.680 Apps im Test","Kann jeder deine Supabase-Datenbank ohne Login lesen? Wir haben 30.998 aktive Apps aus KI-Buildern gescannt und gemessen, wie oft die Antwort ja lautet.","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 öffentlich: deine App veröffentlicht ihren Quellcode","Eine öffentliche Source-Map lässt jeden den Originalcode deiner App lesen, Kommentare inklusive. Der 30-Sekunden-Check, und was wirklich zählt.","\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","Supabases neue API-Schlüssel: welcher gehört in deine App?","Supabase hat anon und service_role durch öffentliche und geheime Schlüssel ersetzt. Welcher gehört in deine App, und welcher nie?","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","Sichert Supabase meine Datenbank? Das hängt von deinem Tarif ab.","Sichert Supabase deine Datenbank? Auf bezahlten Tarifen täglich, im Gratis-Tarif gar nicht. So findest du heraus, was du hast und was es nicht abdeckt.","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 ist an. Die Tabelle ist trotzdem offen.","Supabase Row Level Security anzuschalten schützt keine Tabelle. Erst deine Policies tun das, und die, die deine App repariert hat, lässt oft alle herein.","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","Der Versionsverlauf ist kein Backup. Er holt keine Tabelle zurück.","Lovable und Bolt führen einen Versionsverlauf für deinen Code. Deine Datenbank ist ein eigener Dienst, und ein Rücksprung holt deine Daten nicht zurück.","\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","Drei Wege, eine Supabase-Datenbank zu sichern, und was fehlt","Das Dashboard, pg_dump und ein verwalteter Dienst. Was jeder Weg wirklich sichert, was er stillschweigend auslässt und welcher den Kontoverlust übersteht.","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","Welche API-Schlüssel im Frontend sicher sind, und welche nicht","Dein Supabase-anon-Schlüssel darf öffentlich sein. Der service_role-Schlüssel nicht. Er ignoriert jede Regel, die du setzt. So erkennst du den Unterschied.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1791618966337]