Αρχική
» ΒΑΣΙΚΕΣ ΓΝΩΣΕΙΣ
»
Πώς να διορθώσετε το σφάλμα «Supabase API Key Not Found» στις μεταβλητές περιβάλλοντος
Πώς να διορθώσετε το σφάλμα «Supabase API Key Not Found» στις μεταβλητές περιβάλλοντος
Τελευταία επαλήθευση: 11 Σεπτεμβρίου 2026. Προσθέτετε το URL και το κλειδί API του Supabase σε ένα αρχείο .env, κάνετε επανεκκίνηση της εφαρμογής και εξακολουθείτε να λαμβάνετε ένα σφάλμα όπως “Supabase API key not found” ή το δικό του Supabase supabaseKey is required. Στις περισσότερες περιπτώσεις, το κλειδί υπάρχει κάπου, αλλά ο κώδικας που καλεί τη συνάρτηση createClient() λαμβάνει undefined ή ένα κενό string.
Υπάρχει επίσης μια σημαντική αλλαγή ονοματολογίας του 2026 πίσω από πολλά συγχυτικά tutorials. Το Supabase καταργεί σταδιακά τα παλιά κλειδιά API anon και service_role έως το τέλος του 2026 και τώρα συνιστά κλειδιά publishable για δημόσιο/πελατειακό κώδικα και κλειδιά secret για έμπιστο κώδικα διακομιστή. Τα υπάρχοντα παλιά κλειδιά μπορούν να συνεχίσουν να λειτουργούν κατά τη διάρκεια της μετανάστευσης μέχρι να τα απενεργοποιήσετε, αλλά το όνομα της μεταβλητής περιβάλλοντός σας και ο κώδικάς σας πρέπει ακόμα να ταιριάζουν ακριβώς.
Ποτέ μην τοποθετείτε sb_secret_... σε μια μεταβλητή που εκτίθεται σκόπιμα σε κώδικα browser, όπως μια μεταβλητή Vite VITE_* ή μια μεταβλητή Next.js NEXT_PUBLIC_*. Το Supabase αναφέρει ότι τα κλειδιά secret παρακάμπτουν το Row Level Security και πρέπει να παραμένουν σε πίσω μέρη (backend) ελεγχόμενα από τον προγραμματιστή.
Βήμα 1: επιβεβαιώστε ότι η τιμή λείπει πραγματικά κατά την εκτέλεση
Μην ξεκινήσετε αναγεννώντας κλειδιά ή επανεγκαθιστώντας πακέτα. Πρώτα αποδείξτε τι λαμβάνει η εφαρμογή σας.
Ο τρέχων πελάτης @supabase/supabase-js ελέγχει το δεύτερο όρισμα που περνά στον κατασκευαστή του πελάτη και ρίχνει supabaseKey is required. όταν αυτή η τιμή είναι ψευδής (falsy). Μπορείτε να δείτε αυτή τη συμπεριφορά στον επίσημο πηγαίο κώδικα supabase-js.
Εικονογράφηση παραγόμενη από AI ενός σφάλματος έλλειψης κλειδιού API Supabase. Δεν είναι στιγμιότυπο οθόνης από πραγματικό έργο και το stack trace είναι ενδεικτικό.
Προσθέστε μια προσωρινή προστασία πριν από το createClient():
Για το Vite, χρησιμοποιήστε την ίδια ιδέα με το import.meta.env.
Μην εκτυπώνετε ολόκληρο το κλειδί secret. Για αποσφαλμάτωση, μια τιμή boolean ή ένα αναμενόμενο πρόθεμα είναι αρκετό. Ένα κλειδί publishable προορίζεται για δημόσια συστατικά, αλλά η καταγραφή πλήρων διαπιστευτηρίων είναι ακόμα περιττή. Ένα κλειδί secret δεν πρέπει ποτέ να εκτίθεται σε logs πελατών.
Σημειώστε επίσης ότι η σύνταξη TypeScript όπως process.env.MY_KEY! ή process.env.MY_KEY as string δεν δημιουργεί μια τιμή που λείπει κατά την εκτέλεση. Αλλάζει μόνο αυτό που πιστεύει η TypeScript για τον τύπο. Εάν η μεταβλητή περιβάλλοντος απουσιάζει, το Supabase λαμβάνει ακόμα undefined.
Έλεγχος αυτοελέγχου: εάν η τιμή boolean για το κλειδί είναι false, σταματήστε να αποσφαλματώνετε δικαιώματα Supabase, έλεγχο ταυτότητας ή Row Level Security. Η εφαρμογή δεν έχει φορτώσει ακόμα τη διαμόρφωση.
Βήμα 2: χρησιμοποιήστε τον τρέχοντα τύπο κλειδιού—και κάντε τα παλιά και νέα ονόματα συνεπή
Ανοίξτε το παράθυρο διαλόγου Connect του έργου σας στο Supabase, ή μεταβείτε στις Ρυθμίσεις → Κλειδιά API. Η τρέχουσα τεκμηρίωση του Supabase προσδιορίζει ρητά τις Ρυθμίσεις → Κλειδιά API ως το μέρος για την προβολή όλων των κλειδιών API του έργου.
Για κώδικα που αποστέλλεται σε browser χρήστη, εφαρμογή κινητής τηλεφωνίας, εφαρμογή επιτραπέζιου υπολογιστή ή άλλο δημόσιο συστατικό, χρησιμοποιήστε ένα κλειδί publishable. Το Supabase αναφέρει ότι το κλειδί publishable είναι ασφαλές να εκτεθεί επειδή η πρόσβαση στη βάση δεδομένων ελέγχεται ακόμα από δικαιώματα (grants) και Row Level Security. Για συστατικά πίσω μέρους που ελέγχετε πλήρως, ένα κλειδί secret παρέχει αυξημένη πρόσβαση και παρακάμπτει το Row Level Security.
Η μετανάστευση από παλιά κλειδιά είναι μια κοινή πηγή σφάλματος “not found” επειδή οι ακόλουθοι συνδυασμοί δεν είναι ισοδύναμοι ως ονόματα μεταβλητών περιβάλλοντος:
Ο κώδικας διαβάζει
Το περιβάλλον ορίζει
Αποτέλεσμα
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
Ταιριάζει
NEXT_PUBLIC_SUPABASE_ANON_KEY
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
Ο παλιός κώδικας διαβάζει undefined
VITE_SUPABASE_PUBLISHABLE_KEY
SUPABASE_PUBLISHABLE_KEY
Ο πελάτης Vite δεν εκθέτει τη μεταβλητή χωρίς πρόθεμα από προεπιλογή
Μια παλαιότερη μεταβλητή όπως NEXT_PUBLIC_SUPABASE_ANON_KEY δεν είναι αυτόματα άκυρη. Εάν το έργο σας έχει ακόμα ένα ενεργό παλιό κλειδί anon και ο κώδικάς σας διαβάζει αυτήν την ακριβή μεταβλητή, μπορεί να συνεχίσει να λειτουργεί κατά τη διάρκεια της περιόδου μετανάστευσης του Supabase. Το πρόβλημα είναι η αντιγραφή ενός νέου κλειδιού publishable σε ένα όνομα μεταβλητής ενώ ο κώδικας διαβάζει ακόμα ένα άλλο.
Έλεγχος αυτοελέγχου: αναζητήστε στο έργο σας για SUPABASE_. Συγκρίνετε κάθε όνομα μεταβλητής στον κώδικα με τα ακριβή ονόματα στα αρχεία περιβάλλοντος και τις ρυθμίσεις ανάπτυξης. Μην βασίζεστε στη μνήμη.
Βήμα 3: τοποθετήστε το αρχείο .env όπου το framework σας το φορτώνει πραγματικά
Ένα σωστό κλειδί στη λάθος τοποθεσία αρχείου είναι ουσιαστικά ένα κλειδί που λείπει.
Εικονογράφηση δέντρου έργου παραγόμενη από AI που δείχνει το αρχείο περιβάλλοντος στη ρίζα της εφαρμογής. Δεν είναι στιγμιότυπο οθόνης ενός συγκεκριμένου IDE ή έργου framework.
Next.js: κρατήστε τα αρχεία .env στη ρίζα του έργου
Το Next.js έχει ενσωματωμένη υποστήριξη για αρχεία .env*. Ο τρέχων οδηγός μεταβλητών περιβάλλοντος αναφέρει ότι εάν χρησιμοποιείτε έναν κατάλογο /src, τα αρχεία περιβάλλοντος ανήκουν ακόμα στη ρίζα του έργου, όχι μέσα στο /src. Δείτε τον επίσημο οδηγό μεταβλητών περιβάλλοντος του Next.js.
Μια τυπική διάταξη είναι:
my-app/
.env.local
package.json
next.config.js
app/
src/ # if used
Για κώδικα πλευράς browser, το Next.js εκθέτει μόνο μεταβλητές που χρησιμοποιούν το πρόθεμα NEXT_PUBLIC_. Αυτές οι τιμές ενσωματώνονται (inlined) στο bundle του browser κατά τον χρόνο δόμησης (build time).
Vite: χρησιμοποιήστε VITE_ και import.meta.env
Το Vite εκθέτει μεταβλητές περιβάλλοντος πελατών μέσω του import.meta.env. Από προεπιλογή, μόνο ονόματα με πρόθεμα VITE_ εκτίθενται σε κώδικα πελατών. Η επίσημη οδηγός Vite για μεταβλητές περιβάλλοντος και λειτουργίες τεκμηριώνει αυτό άμεσα.
επειδή του λείπει το προεπιλεγμένο πρόθεμα έκθεσης VITE_.
Κώδικας Node/διακομιστή: μην αντιγράφετε τυφλά προθέματα browser
Ο κώδικας διακομιστή διαβάζει κανονικά από το process.env. Εάν ένα κλειδί δεν χρειάζεται να είναι διαθέσιμο στο browser, μην προσθέτετε ένα δημόσιο πρόθεμα απλώς για να το κάνετε ορατό. Το Supabase προειδοποιεί συγκεκριμένα ότι τα κλειδιά secret είναι μόνο για πίσω μέρος (backend).
Έλεγχος αυτοελέγχου: επαληθεύστε τρία πράγματα μαζί: το αρχείο env βρίσκεται στη ρίζα της εφαρμογής, το όνομα της μεταβλητής χρησιμοποιεί το σωστό πρόθεμα framework και ο κώδικας χρησιμοποιεί τον σωστό accessor του framework—process.env για Next.js/Node ή import.meta.env για κώδικα πελάτη Vite.
Βήμα 4: κάντε επανεκκίνηση του διακομιστή ανάπτυξης μετά την αλλαγή αρχείων περιβάλλοντος
Οι μεταβλητές περιβάλλοντος φορτώνονται συνήθως όταν ξεκινά η διαδικασία ανάπτυξης. Το Vite τεκμηριώνει ρητά ότι τα αρχεία .env φορτώνονται κατά την εκκίνηση και ότι πρέπει να κάνετε επανεκκίνηση του διακομιστή μετά από αλλαγές.
Σταματήστε την τρέχουσα διαδικασία και ξεκινήστε την ξανά:
# Next.js
npm run dev
# Vite
npm run dev
Εικονογράφηση τερματικού παραγόμενη από AI της επανεκκίνησης ενός διακομιστή ανάπτυξης και της επίτευξης καθαρής εκκίνησης. Δεν είναι έξοδος από μια πραγματική ανάπτυξη Supabase.
Εάν το σφάλμα εμφανίστηκε μόνο αφού δημιουργήσατε το αρχείο περιβάλλοντος ενώ ο διακομιστής λειτουργούσε ήδη, μια επανεκκίνηση μπορεί να είναι ολόκληρη η διόρθωση.
Έλεγχος αυτοελέγχου: εκτελέστε ξανά τους προσωρινούς ελέγχους boolean. Εάν οι τιμές φορτώνονται τώρα, αφαιρέστε την περιττή έξοδο αποσφαλμάτωσης και συνεχίστε σε μια κανονική λειτουργία Supabase.
Χρησιμοποιήστε μια προστασία χρόνου εκτέλεσης αντί να κρύβετε το πρόβλημα με TypeScript
Ένα χρήσιμο μοτίβο παραγωγής είναι να αποτυγχάνετε με ένα σαφές μήνυμα διαμόρφωσης πριν καλέσετε το Supabase:
import { createClient } from '@supabase/supabase-js'
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL
const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
if (!supabaseUrl) {
throw new Error('NEXT_PUBLIC_SUPABASE_URL is missing')
}
if (!supabaseKey) {
throw new Error('NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY is missing')
}
export const supabase = createClient(supabaseUrl, supabaseKey)
Εικονογράφηση κώδικα παραγόμενη από AI του ελέγχου της διαμόρφωσης πριν από την κλήση createClient(). Είναι ένα εννοιολογικό παράδειγμα, όχι στιγμιότυπο οθόνης από την τεκμηρίωση του SDK Supabase.
όταν κάνετε αποσφαλμάτωση, επειδή η μη-μηδενική δήλωση (non-null assertion) μπορεί να κρύψει την προειδοποίηση TypeScript χωρίς να αλλάξει την τιμή χρόνου εκτέλεσης.
Εάν λειτουργεί τοπικά αλλά αποτυγχάνει μετά την ανάπτυξη
Αυτό είναι συνήθως ένα πρόβλημα περιβάλλοντος ανάπτυξης, όχι ένα πρόβλημα έργου Supabase.
Τα τοπικά αρχεία .env.local κανονικά δεν δεσμεύονται στο Git—και δεν πρέπει να θεωρούνται ως μηχανισμός παράδοσης μυστικών παραγωγής. Ρυθμίστε τα ίδια ονόματα μεταβλητών στις ρυθμίσεις έργου του παρόχου φιλοξενίας σας.
Για παράδειγμα, το Vercel τεκμηριώνει ξεχωριστά περιβάλλοντα Production, Preview και Development. Αναφέρει επίσης ότι οι αλλαγές στις μεταβλητές περιβάλλοντος ισχύουν μόνο για νέες αναπτύξεις, οπότε πρέπει να κάνετε νέα ανάπτυξη μετά την προσθήκη ή την αλλαγή τους. Δείτε τον επίσημο οδηγό διαχείρισης μεταβλητών περιβάλλοντος του Vercel.
Ελέγξτε:
Είναι η μεταβλητή ορισμένη για το Production, όχι μόνο για το Preview;
Ταιριάζει το όνομα ακριβώς με τον κώδικα;
Δημιουργήθηκε νέα ανάπτυξη μετά την προσθήκη της μεταβλητής;
Ήταν η δημόσια μεταβλητή παρούσα όταν χτίστηκε το bundle του πελάτη;
Οι δημόσιες μεταβλητές Next.js είναι τιμές χρόνου δόμησης
Το Next.js τεκμηριώνει ότι οι μεταβλητές NEXT_PUBLIC_* ενσωματώνονται (inlined) σε JavaScript browser κατά τον χρόνο δόμησης. Αφού χτιστεί η εφαρμογή, η αλλαγή του περιβάλλοντος εκτέλεσης δεν ξαναγράφει αυτές τις τιμές στο υπάρχον bundle του πελάτη. Εάν χτίσετε μια εικόνα Docker χωρίς NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY και αργότερα την εισάγετε μόνο όταν ξεκινά το container, ο κώδικας browser μπορεί ακόμα να περιέχει την τιμή που λείπει από τον χρόνο δόμησης.
Διόρθωση: παρέχετε δημόσιες τιμές Supabase κατά τη διάρκεια της δόμησης που παράγει το bundle του πελάτη, ή ανασχεδιάστε την εφαρμογή για να παρέχει διαμόρφωση χρόνου εκτέλεσης μέσω ενός μηχανισμού ελεγχόμενου από διακομιστή.
Το Vite επίσης αντικαθιστά τιμές περιβάλλοντος πελατών κατά τη δόμηση
Η τεκμηρίωση του Vite αναφέρει ότι οι σταθερές import.meta.env αντικαθίστανται στατικά κατά τη δέσμευση (bundling). Επομένως, εάν η τοπική ανάπτυξη λειτουργεί αλλά το bundle παραγωγής δεν λειτουργεί, επαληθεύστε ότι οι VITE_SUPABASE_URL και VITE_SUPABASE_PUBLISHABLE_KEY υπήρχαν στο περιβάλλον δόμησης—όχι μόνο στη μηχανή που εξυπηρετεί αργότερα τα στατικά αρχεία.
Monorepos: ελέγξτε ποιος κατάλογος είναι πραγματικά η ρίζα της εφαρμογής
Εάν η εντολή Next.js ή Vite εκτελείται με το apps/web ως ρίζα της εφαρμογής, ένα αρχείο περιβάλλοντος τοποθετημένο μόνο στο repo/.env.local μπορεί να μην είναι το αρχείο που φορτώνει το framework. Το envDir του Vite έχει ως προεπιλογή τη ρίζα του έργου, και το Next.js αναμένει τα αρχεία .env* του στη ρίζα του έργου Next.js.
Διόρθωση: εντοπίστε τον κατάλογο που περιέχει το package.json και τη διαμόρφωση framework της εφαρμογής, στη συνέχεια τοποθετήστε το αρχείο env όπου το περιμένει αυτή η εφαρμογή ή ρυθμίστε ρητά τον κατάλογο περιβάλλοντος όταν το framework το υποστηρίζει.
Οι Edge Functions του Supabase χρησιμοποιούν διαφορετικά τρέχοντα προεπιλεγμένα ονόματα μεταβλητών
Εάν το σφάλμα βρίσκεται μέσα σε μια Edge Function του Supabase, μην αντιγράφετε τυφλά ένα παράδειγμα Next.js ή Vite.
Παρατηρήστε ότι τα SUPABASE_PUBLISHABLE_KEYS και SUPABASE_SECRET_KEYS είναι πληθυντικός. Ο οδηγός μετανάστευσης του Supabase εξηγεί ότι αυτές οι νέες μεταβλητές περιέχουν αντικείμενα JSON με κλειδιά το όνομα του κλειδιού API. Για ένα προεπιλεγμένο κλειδί secret:
const secretKeys = JSON.parse(
Deno.env.get('SUPABASE_SECRET_KEYS') ?? '{}'
)
const secretKey = secretKeys['default']
if (!secretKey) {
throw new Error('Default Supabase secret key is missing')
}
Κατά τη διάρκεια της μετανάστευσης, παλιές μεταβλητές Edge Function όπως SUPABASE_ANON_KEY και SUPABASE_SERVICE_ROLE_KEY μπορούν να υπάρχουν παράλληλα με τα νέα λεξικά κλειδιών. Μην υποθέτετε ότι το όνομα της μεταβλητής από ένα παλιό tutorial συνάρτησης ταιριάζει με τον νέο τύπο κλειδιού που μόλις δημιουργήσατε.
Μην επιλύετε το σφάλμα εκθέτοντας ένα κλειδί secret
Ένας δελεαστικός “διόρθωση” είναι να προσθέσετε NEXT_PUBLIC_ ή VITE_ σε ένα μυστικό διακομιστή ώστε το browser να μπορεί επιτέλους να το διαβάσει. Αυτό μπορεί να εξαλείψει το σφάλμα έλλειψης μεταβλητής ενώ δημιουργεί ένα πρόβλημα ασφαλείας.
Ο τρέχων οδηγός κλειδιών API του Supabase είναι ρητός:
Κλειδί publishable: προορίζεται για δημόσια συστατικά όπως εφαρμογές browser και κινητής τηλεφωνίας.
Κλειδί secret: προορίζεται μόνο για συστατικά πίσω μέρους που ελέγχετε. Παρακάμπτει το Row Level Security.
Εάν ένα κλειδί secret έχει εκτεθεί σε πηγαίο κώδικα, δημόσιο bundle, στιγμιότυπο οθόνης ή αποθετήριο, αφαιρέστε το ή περιστρέψτε το μέσω των ρυθμίσεων Κλειδιών API του Supabase αντί απλώς να μετονομάσετε τη μεταβλητή περιβάλλοντος.
Συχνά συμπτώματα και ο γρηγορότερος έλεγχος
Σύμπτωμα
Πιο πιθανό μέρος για έλεγχο
supabaseKey is required. αμέσως κατά την εκκίνηση
Το δεύτερο όρισμα στο createClient() είναι κενό ή undefined
Το Next.js λειτουργεί στον διακομιστή αλλά το κλειδί είναι undefined σε ένα Client Component
Λείπει το πρόθεμα NEXT_PUBLIC_, λάθος όνομα ή λείπει η τιμή χρόνου δόμησης
Το Vite δείχνει undefined
Λείπει το πρόθεμα VITE_ ή χρήση process.env αντί για import.meta.env
Λειτουργεί τοπικά, αποτυγχάνει στην παραγωγή
Μεταβλητές περιβάλλοντος φιλοξενίας, εμβέλεια Production/Preview ή έλλειψη επαναδόμησης/επανανάπτυξης
Λειτουργούσε με ANON_KEY, χάλασε μετά τη μετανάστευση
Ο κώδικας και το αρχείο env χρησιμοποιούν διαφορετικά ονόματα μεταβλητών παλιά/νέα
Η Edge Function δεν μπορεί να βρει το SUPABASE_SECRET_KEY
Οι τρέχουσες προεπιλογές Edge Function χρησιμοποιούν SUPABASE_SECRET_KEYS ως λεξικό JSON
Η TypeScript μεταγλωττίζεται μετά την προσθήκη ! αλλά η εκτέλεση αποτυγχάνει ακόμα
Η δήλωση άλλαξε μόνο τον τύπο. Η τιμή περιβάλλοντος λείπει ακόμα
Τελικός αυτοέλεγχος: επαληθεύστε τη διαμόρφωση στη σωστή σειρά
Πριν δηλώσετε ότι το θέμα έχει διορθωθεί, εκτελέστε αυτήν την λίστα ελέγχου:
Επιβεβαιώστε ότι το Project URL του Supabase προέρχεται από το έργο που πραγματικά σκοπεύετε να χρησιμοποιήσετε.
Για κώδικα browser/πελάτη, επιβεβαιώστε ότι χρησιμοποιείτε ένα τρέχον κλειδί publishable ή ένα ακόμα ενεργό παλιό κλειδί anon—όχι ένα κλειδί secret.
Επιβεβαιώστε ότι ο κώδικας και το αρχείο περιβάλλοντος χρησιμοποιούν τα ίδια ονόματα μεταβλητών.
Για κώδικα πελάτη Next.js, χρησιμοποιήστε NEXT_PUBLIC_* και άμεσες αναφορές process.env.VARIABLE_NAME.
Για κώδικα πελάτη Vite, χρησιμοποιήστε VITE_* και import.meta.env.VARIABLE_NAME.
Κρατήστε το .env.local στη ρίζα της εφαρμογής αντί μέσα στο /src.
Κάντε επανεκκίνηση του διακομιστή ανάπτυξης μετά την επεξεργασία αρχείων περιβάλλοντος.
Για παραγωγή, ορίστε τις τιμές στο σωστό περιβάλλον ανάπτυξης και κάντε επαναδόμηση/επανανάπτυξη.
Μην καταγράφετε ή εκθέτετε κλειδιά sb_secret_....
Αφαιρέστε προσωρινά logs αποσφαλμάτωσης μόλις επιβεβαιωθεί η διαμόρφωση.
Όταν το createClient() αρχικοποιείται χωρίς το σφάλμα έλλειψης κλειδιού, το πρόβλημα μεταβλητής περιβάλλοντος έχει επιλυθεί. Εάν το επόμενο αίτημα Supabase επιστρέψει ένα σφάλμα εξουσιοδότησης, Row Level Security ή δικαιώματος πίνακα, αντιμετωπίστε το ως ξεχωριστό θέμα. Ένα έγκυρο κλειδί API δεν εγγυάται ότι ο καλών επιτρέπεται να διαβάσει ή να τροποποιήσει κάθε γραμμή. Το Supabase διαχωρίζει σκόπιμα την αναγνώριση κλειδιού API από τον έλεγχο ταυτότητας χρήστη και την εξουσιοδότηση βάσης δεδομένων.
Η διαρκής διόρθωση δεν είναι “μετονομάστε το κλειδί μέχρι να λειτουργήσει”. Είναι να ευθυγραμμίσετε τέσσερα πράγματα: τον τρέχοντα τύπο κλειδιού Supabase, το όνομα της μεταβλητής περιβάλλοντος, τους κανόνες έκθεσης του framework και το περιβάλλον στο οποίο η εφαρμογή χτίζεται ή εκτελείται πραγματικά. Μόλις αυτά συμφωνήσουν, ο πελάτης Supabase λαμβάνει ένα πραγματικό κλειδί αντί για undefined, και ο παραπλανητικός βρόχος διαμόρφωσης τελειώνει.