[{"data":1,"prerenderedAt":1053},["ShallowReactive",2],{"blog-uk-certificate-not-trusted":3,"blog-index-uk":522},{"id":4,"title":5,"body":6,"category":480,"cover":481,"coverAlt":482,"description":483,"draft":484,"extension":485,"faq":486,"image":502,"keywords":503,"meta":511,"navigation":512,"ogTitle":5,"path":513,"published":514,"seo":515,"stem":516,"tldr":517,"updated":514,"__hash__":521},"blog_uk\u002Fblog\u002Fcertificate-not-trusted.md","Сертифікат не довірений: три причини, крім закінчення строку",{"type":7,"value":8,"toc":466},"minimark",[9,13,16,25,30,33,36,39,131,134,137,141,144,156,186,189,200,204,207,210,237,243,246,250,253,256,259,262,266,269,272,275,280,298,302,305,308,332,337,340,358,362,365,368,375,383,387,390,398,409,418,429,433,458],[10,11,12],"p",{},"Учора ваш застосунок завантажувався без проблем. Сьогодні хтось надсилає вам\nзнімок повноекранного попередження браузера, що підключення не приватне, і\nпитає, чи сайт не зламали. Ви відкриваєте сертифікат, і він чинний до наступної\nвесни. Він не прострочений, а браузер однаково каже, що сертифікат не\nдовірений.",[10,14,15],{},"Очевидний крок полягає в тому, щоб його поновити, і для цього екрана він\nхибний. Кожна з трьох причин нижче стосується сертифіката, який уже чинний за\nдатою, тож поновлення дасть вам пізнішу дату закінчення на сертифікаті, який і\nдалі відхиляють з іншої причини.",[10,17,18,19,24],{},"У ",[20,21,23],"a",{"href":22},"\u002Fblog\u002Fdomain-and-certificate-expiry","нашій статті про закінчення строку","\nсертифікат є ліцензією у вітрині, яка каже, що ця крамниця справді та сама, що\nна вивісці. Браузер відвідувача читає на цій ліцензії три речі, перш ніж\nкогось впустити: дату, назву крамниці, для якої її видали, і підпис того, хто її\nвидав. Закінчення строку стосується дати. Ця стаття про дві інші.",[26,27,29],"h2",{"id":28},"чому-сертифікат-не-довірений-якщо-його-строк-не-минув","Чому сертифікат не довірений, якщо його строк не минув?",[10,31,32],{},"Бо не пройшли ім’я або підпис, а браузер ставить ту саму стіну для кожної зі\nсвоїх перевірок.",[10,34,35],{},"Сертифікату довіряють лише тоді, коли він називає саме ту адресу, що в\nадресному рядку відвідувача, і його підписав центр, якому браузер уже довіряє,\nразом з кожним проміжним сертифікатом. Якщо щось одне не проходить, Chrome\nпоказує попередження, що підключення не приватне, а Firefox попередження про\nможливий ризик для безпеки, так само як для простроченого.",[10,37,38],{},"Різниця в дрібному тексті під попередженням. Прочитайте його, перш ніж щось\nзмінювати:",[40,41,42,61],"table",{},[43,44,45],"thead",{},[46,47,48,52,55,58],"tr",{},[49,50,51],"th",{},"Що показує Chrome",[49,53,54],{},"Що каже пояснення у Firefox",[49,56,57],{},"Що це означає",[49,59,60],{},"Що це виправляє",[62,63,64,82,98,113],"tbody",{},[46,65,66,73,76,79],{},[67,68,69],"td",{},[70,71,72],"code",{},"NET::ERR_CERT_COMMON_NAME_INVALID",[67,74,75],{},"Сертифікат недійсний для вашої адреси",[67,77,78],{},"Його видали для іншого імені",[67,80,81],{},"Сертифікат, у якому є саме ваша адреса",[46,83,84,89,92,95],{},[67,85,86],{},[70,87,88],{},"NET::ERR_CERT_AUTHORITY_INVALID",[67,90,91],{},"Сертифікату не довіряють, бо він самопідписаний",[67,93,94],{},"За нього ніхто не ручається, крім самого сервера",[67,96,97],{},"Сертифікат від справжнього центру сертифікації",[46,99,100,104,107,110],{},[67,101,102],{},[70,103,88],{},[67,105,106],{},"Видавець сертифіката невідомий",[67,108,109],{},"Браузер не може пов’язати його з жодним центром, якому довіряє",[67,111,112],{},"Повний ланцюжок від визнаного центру",[46,114,115,120,123,126],{},[67,116,117],{},[70,118,119],{},"NET::ERR_CERT_DATE_INVALID",[67,121,122],{},"Строк дії сертифіката минув",[67,124,125],{},"Дата",[67,127,128],{},[20,129,130],{"href":22},"Новий сертифікат",[10,132,133],{},"Chrome показує той самий код для другого і третього рядка, тому варто відкрити\nсам сертифікат.",[10,135,136],{},"Якщо про попередження повідомила одна людина, а більше ніхто його не бачить,\nспитайте, в якій мережі вона була. Вихідний код Chrome називає однією з причин\nпомилки імені мережу wifi, яка перенаправляє користувачів на сторінку входу.\nТака помилка зникає, щойно людина увійде в мережу.",[26,138,140],{"id":139},"як-побачити-що-написано-в-сертифікаті","Як побачити, що написано в сертифікаті?",[10,142,143],{},"Відкрийте його з попередження і прочитайте два поля: кому його видано і хто його\nвидав.",[10,145,146,147,151,152,155],{},"У Chrome натисніть на позначку тривоги ліворуч в адресному рядку (",[148,149,150],"strong",{},"Not secure","\nв англомовному Chrome) і відкрийте сертифікат з панелі, що з’явиться. У Firefox\nнатисніть ",[148,153,154],{},"Advanced"," у попередженні, а потім посилання на сертифікат сайту (так\nвони називаються в англомовному Firefox). Два браузери називають ті самі поля\nпо-різному:",[157,158,159,175],"ul",{},[160,161,162,163,166,167,170,171,174],"li",{},"Поле про те, кому видано сертифікат (",[148,164,165],{},"Issued To"," в англомовному Chrome,\n",[148,168,169],{},"Subject Name"," у Firefox), містить ім’я, для якого його створили. Повний\nсписок імен, які він покриває, розташований у ",[148,172,173],{},"Subject Alternative Name",", і\nсаме цей список браузер порівнює з адресою.",[160,176,177,178,181,182,185],{},"Поле про те, хто його видав (",[148,179,180],{},"Issued By"," у Chrome, ",[148,183,184],{},"Issuer Name"," у\nFirefox), містить центр, який його підписав.",[10,187,188],{},"Кожна з трьох причин читається там по-своєму:",[157,190,191,194,197],{},[160,192,193],{},"Сертифікат називає іншу адресу. Це причина 1.",[160,195,196],{},"Власник і видавець мають однакову назву. Він підписав сам себе, і це\nпричина 2.",[160,198,199],{},"Він називає вашу адресу, видавець є центром, про який ви чули, а браузер усе\nодно його відхиляє. Це причина 3, ланцюжок.",[26,201,203],{"id":202},"причина-1-сертифікат-виданий-для-іншої-адреси","Причина 1: сертифікат виданий для іншої адреси",[10,205,206],{},"Сертифікат справжній і чинний за датою, але його видали для іншого імені. Це\nліцензія іншої крамниці, яка висить у вашій вітрині.",[10,208,209],{},"Буває в трьох формах:",[157,211,212,218,231],{},[160,213,214,217],{},[148,215,216],{},"Ваш домен вказує на хостинг, у якого ще немає для нього сертифіката.","\nХостинг відповідає тим сертифікатом, що має, виданим на власне ім’я.\nДокументація Lovable каже про це прямо: доки сертифікат не готовий, браузер\nпоказує попередження безпеки замість вашого сайту.",[160,219,220,223,226,227,230],{},[148,221,222],{},"Сертифікат покриває одне написання вашої адреси, а відвідувач ввів інше.",[70,224,225],{},"www.yourapp.com"," і ",[70,228,229],{},"yourapp.com"," для сертифіката є двома іменами, і кожне має\nбути в його списку.",[160,232,233,236],{},[148,234,235],{},"Частина вашого DNS досі вказує туди, звідки ви пішли."," Старий хостинг або\nсторінка-заглушка, яку показував ваш реєстратор, доки ви нічого не підключили,\nвідповідає на цьому імені власним сертифікатом.",[238,239],"diagram",{"alt":240,"caption":241,"src":242},"Два рядки. У кожному адресний рядок з yourapp.com стоїть поруч із карткою сертифіката, де перелічені імена, які він покриває. Угорі картка містить лише www.yourapp.com, і рядок закінчується хрестиком. Унизу в ній обидва імені, і рядок закінчується галочкою.","Для сертифіката адреса з www і адреса без www є двома іменами. Адреса з рядка має бути в списку.","\u002Fblog\u002Fcertificate-not-trusted\u002Fone-name-missing-1600x660.png",[10,244,245],{},"У Lovable і Vercel ви не купуєте і не встановлюєте цей сертифікат самі. Хостинг\nвидає його для кожного імені, яке ви додаєте в його налаштуваннях домену, щойно\nваш DNS спрямує це ім’я на хостинг. Документація Lovable додає, що сертифікат,\nкуплений у вашого реєстратора, її хостинг узагалі не використовує. Додайте\nобидва написання, спрямуйте обидва на хостинг і дочекайтеся, поки кожне матиме\nстатус активного.",[26,247,249],{"id":248},"причина-2-сертифікат-підписав-сам-себе","Причина 2: сертифікат підписав сам себе",[10,251,252],{},"За цей сертифікат не ручається ніхто, крім сервера, який його показує. Це\nліцензія, яку власник крамниці надрукував удома.",[10,254,255],{},"Кожен браузер відхиляє такий сертифікат на публічному сайті, і так має бути.\nКоментар у вихідному коді Chrome пояснює причину одним рядком: самопідписаний\nсертифікат не дає жодного захисту від зловмисника, який стоїть між вашим\nвідвідувачем і вашим застосунком.",[10,257,258],{},"Він трапляється на серверах, які хтось налаштовував вручну: орендований сервер,\nінструмент на власному хостингу, тестове налаштування, що потрапило в продакшн\nразом із застосунком. Білдер видає справжні сертифікати для доменів, які ви в\nньому додаєте. Отже, самопідписаний сертифікат на застосунку, який хостить\nбілдер, означає, що на вашій адресі відповідає щось інше, ніж білдер.\nПеревірте, куди вказує ваш DNS, перш ніж змінювати щось іще.",[10,260,261],{},"Виправлення полягає в сертифікаті від справжнього центру сертифікації. Let's\nEncrypt видає їх безкоштовно, і саме цей центр використовує Vercel, коли видає\nваш.",[26,263,265],{"id":264},"причина-3-ланку-ланцюжка-так-і-не-надіслали","Причина 3: ланку ланцюжка так і не надіслали",[10,267,268],{},"Сертифікат виданий для вашої адреси і підписаний справжнім центром, але сервер\nнадіслав його без проміжного сертифіката, тож браузер не може пов’язати його ні\nз ким, кому довіряє. Ліцензію підписала філія, а листа від головного офісу, який\nручається за цю філію, у вітрині немає.",[10,270,271],{},"Mozilla називає відсутній проміжний сертифікат однією з найпоширеніших проблем\nналаштування серверів. Firefox тепер заздалегідь завантажує копію кожного\nдовіреного проміжного сертифіката, щоб його користувачі більше не стикалися з\nцією помилкою.",[10,273,274],{},"Саме через це причину важко помітити: на вашому ноутбуці все може виглядати\nнормально, а в когось іншого не працювати. Браузер, який має власну копію\nвідсутньої ланки, заповнює прогалину. Програма, що використовує лише те, що\nнадсилає ваш сервер, не має чим її заповнити. Наш сканер саме така програма,\nтому він може позначити сертифікат як недовірений, поки ваш власний браузер\nпоказує замок.",[238,276],{"alt":277,"caption":278,"src":279},"Сервер надсилає сертифікат двом відвідувачам. Між сертифікатом і довіреним центром мав би бути другий сертифікат, але сервер його не надіслав. Перший відвідувач має копію відсутнього сертифіката й отримує галочку. Другий не має нічого й отримує хрестик.","Той самий неповний ланцюжок, надісланий двом відвідувачам. Завершити його може лише той, у кого відсутня ланка вже була.","\u002Fblog\u002Fcertificate-not-trusted\u002Fthe-missing-link-1600x700.png",[10,281,282,283,286,287,290,291,297],{},"У білдері ланцюжком займаються за вас. Він губиться на серверах, налаштованих\nвручну, і там виправлення полягає в тому, щоб віддавати сертифікат разом із\nпроміжним сертифікатом в одному файлі. Якщо ви користуєтеся certbot від Let's\nEncrypt, цей файл називається ",[70,284,285],{},"fullchain.pem",", а помилка полягає в тому, що\nсервер дивиться на ",[70,288,289],{},"cert.pem"," замість нього. Щоб перевірити ззовні,\n",[20,292,296],{"href":293,"rel":294},"https:\u002F\u002Fwww.ssllabs.com\u002Fssltest\u002F",[295],"nofollow","безкоштовний тест сервера від SSL Labs","\nпозначає відсутній проміжний сертифікат як проблему ланцюжка.",[26,299,301],{"id":300},"випадок-власного-домену-по-порядку","Випадок власного домену, по порядку",[10,303,304],{},"Коли ви підключаєте власний домен до білдера, відвідувачі бачать це\nпопередження, доки хостинг не матиме сертифіката для вашого імені, і\nпопередження каже правду. Воно зникає саме, щойно сертифікат видано.",[10,306,307],{},"Порядок у Lovable:",[309,310,311,319,322,325],"ol",{},[160,312,313,314,226,316,318],{},"Додайте домен у Lovable. Він налаштовує ",[70,315,229],{},[70,317,225],{}," та\nпоказує їх окремо.",[160,320,321],{},"Змініть DNS-записи у вашого реєстратора на значення, які дає Lovable. За\nсловами Lovable, більшість змін набуває чинності за кілька годин, а\nпоширення може тривати до 72 годин.",[160,323,324],{},"Lovable перевіряє домен і видає сертифікат. Vercel працює так само: він\nавтоматично доводить Let's Encrypt, що ім’я ваше, якщо домен вказує на\nVercel.",[160,326,327,328,331],{},"Відкривайте сайт, коли домен матиме статус ",[148,329,330],{},"Live",". Так радить сама\nLovable.",[238,333],{"alt":334,"caption":335,"src":336},"Часова шкала. Фігура спрямовує ім’я на хостинг, і звідти бурштиновий відрізок зі знаком попередження тягнеться до печатки, що позначає видачу сертифіката. Далі лінія стає акцентного кольору із замком. Позначка трохи далі має число 72.","Між моментом, коли ваш домен спрямовано на хостинг, і появою сертифіката попередження правильне. Lovable просить звернутися до підтримки, якщо воно не зникло через 72 години.","\u002Fblog\u002Fcertificate-not-trusted\u002Fthe-wait-is-the-warning-1600x560.png",[10,338,339],{},"Якщо попередження не зникло через 72 години, Lovable просить звернутися до її\nпідтримки. Перш ніж писати, варто перевірити два налаштування:",[157,341,342,352],{},[160,343,344,347,348,351],{},[148,345,346],{},"Пошукайте запис CAA."," Це запис DNS, який визначає, які центри можуть\nвидавати сертифікати для вашого домену. Запис, що не включає центр вашого\nхостингу, блокує сертифікат, а піддомен успадковує записи CAA батьківського\nдомену, якщо не має власних.\n",[20,349,350],{"href":22},"Стаття про закінчення строку"," згадує\nтой самий запис як причину невдалого поновлення. Тут він не дає видати навіть\nперший сертифікат.",[160,353,354,357],{},[148,355,356],{},"Пошукайте проксі перед хостингом."," Якщо ваш DNS у Cloudflare і для записів,\nякі дав хостинг, увімкнено помаранчеву хмарку, відповідає Cloudflare замість\nвашого хостингу. Lovable каже, що тоді не може перевірити домен чи видати для\nнього сертифікати, і Lovable, і Vercel радять перевести ці записи в DNS only.",[26,359,361],{"id":360},"що-ми-знайшли-на-30-879-застосунках","Що ми знайшли на 30 879 застосунках",[10,363,364],{},"Вісім мали сертифікат, якому не довіряв би жоден браузер, і кожен із них працював\nна домені, який підключив власник.",[10,366,367],{},"У серпні 2026 року наш скан прочитав сертифікат 30 879 живих застосунків:\n29 927 на власному піддомені білдера і 952 на власному домені. Усі вісім\nнедовірених сертифікатів були серед цих 952, трохи менше одного на сотню. Жоден\nзастосунок на піддомені білдера такого не мав, що збігається з усім, що вище.\nНа власній адресі білдера і ім’я, і сертифікат належать білдеру.",[10,369,370,371,374],{},"Наша знахідка фіксує, що сертифікат не пройшов перевірку, але не фіксує, яка з\nтрьох причин це була, тож ми не можемо сказати, як розподіляються ці вісім.\nПрострочені сертифікати і ті, чий строк скоро мине, з того самого скану\nпораховані у ",[20,372,373],{"href":22},"статті про закінчення строку",".",[10,376,377,378,382],{},"Щоб перевірити власний застосунок, ",[20,379,381],{"href":380},"\u002Fsecurity-scanner","наш безкоштовний скан","\nчитає ззовні сертифікат, який надсилає ваш сервер, і називає цю знахідку, коли\nїї бачить. Це займає близько 20 секунд і не потребує облікового запису.",[26,384,386],{"id":385},"помітити-це-наступного-разу-коли-щось-зміниться","Помітити це наступного разу, коли щось зміниться",[10,388,389],{},"Сертифікат перетворюється з довіреного на відхилений, коли щось довкола нього\nзмінюється: новий домен, переїзд DNS, увімкнений проксі. Важить перевірка, яка\nспрацьовує після зміни.",[10,391,392,397],{},[148,393,394],{},[20,395,396],{"href":380},"Проскануйте свій застосунок безкоштовно",", щоб побачити,\nщо сьогодні отримує браузер відвідувача.",[157,399,400,403,406],{},[160,401,402],{},"Читає ззовні сертифікат, який надсилає ваш сервер, разом із вісьмома іншими\nперевірками.",[160,404,405],{},"Називає знахідку, коли сертифікату не довіряють, а також коли його строк\nминув або скоро мине.",[160,407,408],{},"Близько 20 секунд і без облікового запису.",[10,410,411,417],{},[148,412,413],{},[20,414,416],{"href":415},"\u002Fwebsite-monitoring","Reeve Monitor",", щоб дізнатися невдовзі після зміни.",[157,419,420,423,426],{},[160,421,422],{},"Перевіряє ваш застосунок кожні 60 секунд, і сертифікат, якому він не може\nдовіряти, рахується як збій вашого застосунку. Тож ви дізнаєтеся про це так\nсамо, як про будь-який інший збій.",[160,424,425],{},"Щогодини повторює всі дев’ять перевірок і надсилає вам лист, коли ваша оцінка\nпадає.",[160,427,428],{},"Покриває до трьох застосунків.",[26,430,432],{"id":431},"що-робити-зараз","Що робити зараз",[434,435,436],"key-takeaways",{},[157,437,438,441,444,452,455],{},[160,439,440],{},"Прочитайте код під попередженням, перш ніж щось поновлювати. Помилка дати потребує нового сертифіката. Помилка імені чи центру потребує іншого.",[160,442,443],{},"Відкрийте сертифікат і порівняйте ім’я, для якого його видано, з адресою в рядку та з назвою того, хто його видав.",[160,445,446,447,226,449,451],{},"У білдері додайте ",[70,448,229],{},[70,450,225],{}," у налаштуваннях домену і спрямуйте обидва на нього.",[160,453,454],{},"Якщо новий домен і через 72 години показує попередження, пошукайте запис CAA або проксі перед хостингом, перш ніж писати в підтримку.",[160,456,457],{},"На сервері, яким ви керуєте самі, віддавайте повний ланцюжок і перевіряйте його ззовні через SSL Labs.",[10,459,460,461,465],{},"Коли попередження зникло, а застосунок однаково не завантажується, наступне\nпитання в тому, чи справа у вашому застосунку, чи в платформі під ним, і\n",[20,462,464],{"href":463},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase впав чи ваш застосунок?"," показує,\nяк це розрізнити.",{"title":467,"searchDepth":468,"depth":468,"links":469},"",3,[470,472,473,474,475,476,477,478,479],{"id":28,"depth":471,"text":29},2,{"id":139,"depth":471,"text":140},{"id":202,"depth":471,"text":203},{"id":248,"depth":471,"text":249},{"id":264,"depth":471,"text":265},{"id":300,"depth":471,"text":301},{"id":360,"depth":471,"text":361},{"id":385,"depth":471,"text":386},{"id":431,"depth":471,"text":432},"Основи безпеки","\u002Fblog\u002Fcertificate-not-trusted\u002Fcover-1200x630.png","Картка сертифіката з печаткою і датою в акцентному кольорі під адресним рядком, де назва довша за бурштинову назву на картці.","Сертифікат не довірений, хоча дата в порядку? Він називає іншу адресу, підписав сам себе або в його ланцюжку бракує ланки. Як зрозуміти, що саме.",false,"md",[487,490,493,496,499],{"q":488,"a":489},"Чому мій сайт пише, що підключення не приватне, якщо сертифікат не прострочений?","Бо дата лише одна з трьох речей, які перевіряє браузер, а дві інші не проходять самі по собі. Сертифікат також має називати саме ту адресу, яку ввів відвідувач, і бути підписаним центром, якому браузер довіряє, разом з кожним проміжним сертифікатом. Сертифікат, що не проходить будь-яку з цих двох перевірок, отримує те саме повноекранне попередження, що й прострочений, і поновлення нічого не змінює.",{"q":491,"a":492},"Що таке невідповідність імені в сертифікаті?","Сертифікат, виданий для однієї адреси, а показаний на іншій. Chrome повідомляє про це як NET::ERR_CERT_COMMON_NAME_INVALID, а Firefox пише, що сертифікат недійсний для вашої адреси. Сам сертифікат зазвичай справжній і чинний за датою. Він просто належить іншому імені, часто імені вашого хостингу, і саме таким хостинг відповідає на вашому домені, доки не видав сертифікат для вас.",{"q":494,"a":495},"Чому з www працює, а домен без www ні?","Бо для сертифіката це два різні імені. Або сертифікат містить лише одне з них, або DNS іншого досі вказує деінде, наприклад на сторінку-заглушку вашого реєстратора чи старий хостинг, який відповідає власним сертифікатом. Lovable підключає обидва й показує їх окремо, тож перевірте, що кожен має статус активного.",{"q":497,"a":498},"Скільки часу займає сертифікат для власного домену?","За словами Lovable, налаштування домену зазвичай завершується за кілька хвилин, але може тривати до кількох годин, зміни DNS можуть поширюватися до 72 годин, а якщо сертифікат не видано після 72 годин, варто звернутися до їхньої підтримки. Доки його не видано, відвідувачі бачать попередження безпеки замість вашого сайту.",{"q":500,"a":501},"Чи буває самопідписаний сертифікат прийнятним?","На вашому власному комп’ютері, для розробки, так. На сайті, який відвідує публіка, ні. Браузер кожного відвідувача його відхиляє, а коментар у вихідному коді Chrome зазначає, що самопідписаний сертифікат не дає жодного захисту від зловмисника, який стоїть між відвідувачем і сайтом.","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",[504,505,506,507,508,509,510],"сертифікат не довірений","ssl сертифікат не довірений браузер","ваше підключення не приватне власний домен","ім’я в сертифікаті не збігається","самопідписаний сертифікат попередження сайт","net::err_cert_common_name_invalid","net::err_cert_authority_invalid",{},true,"\u002Fblog\u002Fcertificate-not-trusted","2026-10-26",{"title":5,"description":483},"blog\u002Fcertificate-not-trusted",[518,519,520],"Сертифікат, якому не довіряють браузери, може бути цілком чинним за датою. Його відхиляють, бо він називає іншу адресу, бо підписав сам себе або бо прийшов без сертифіката, який за нього ручається.","Екран попередження той самий, що й для простроченого сертифіката, і поновлення не виправляє жодної з трьох причин. Код під попередженням підкаже, яка саме у вас.","У Lovable і Vercel власний домен показує це попередження, доки для нього не видано сертифікат. Таке очікування нормальне. Попередження, яке тримається довше, означає, що щось заважає сертифікату.","qGqlU_FF9qDzXqNAKhZ0rVj5a9tEX9w89MDw_h0mqMg",[523,529,535,541,547,553,559,565,571,577,583,590,596,602,608,609,615,621,627,633,639,645,651,657,663,669,675,681,687,693,699,705,711,717,723,729,735,741,747,753,758,764,770,776,782,788,793,799,805,811,816,822,828,834,840,846,852,858,864,870,876,882,888,894,900,906,912,918,924,930,936,942,948,954,960,966,972,978,984,990,996,1002,1008,1014,1019,1025,1031,1037,1042,1048],{"path":524,"title":525,"description":526,"published":527,"category":480,"image":528,"draft":484},"\u002Fblog\u002Fmax-client-connections-reached","Supabase \"max client connections reached\": пояснення","Supabase \"max client connections reached\": у пулера немає місця ще для одного клієнта. Ліміт визначає порт у вашому рядку підключення.","2026-11-09","\u002Fblog\u002Fmax-client-connections-reached\u002Fcard-800x500.png",{"path":530,"title":531,"description":532,"published":533,"category":480,"image":534,"draft":484},"\u002Fblog\u002Funsupported-provider-provider-is-not-enabled","Помилка Supabase: \"Unsupported provider: provider is not enabled\"","\"Unsupported provider: provider is not enabled\": вхід через Google вимкнено у вашому проєкті Supabase. Як увімкнути та виправити redirect_uri_mismatch.","2026-11-08","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcard-800x500.png",{"path":536,"title":537,"description":538,"published":539,"category":480,"image":540,"draft":484},"\u002Fblog\u002Fviolates-foreign-key-constraint","Помилка Supabase \"violates foreign key constraint\" під час вставки","Supabase \"insert or update on table violates foreign key constraint\": ваш рядок посилається на рядок, якого немає. Який, чому і як це виправити.","2026-11-07","\u002Fblog\u002Fviolates-foreign-key-constraint\u002Fcard-800x500.png",{"path":542,"title":543,"description":544,"published":545,"category":480,"image":546,"draft":484},"\u002Fblog\u002Fnull-value-violates-not-null-constraint","Помилка Supabase \"null value in column violates not-null constraint\"","Supabase \"null value in column violates not-null constraint\": обовʼязковий стовпець прийшов порожнім. Звідки взявся null і як це виправити.","2026-11-06","\u002Fblog\u002Fnull-value-violates-not-null-constraint\u002Fcard-800x500.png",{"path":548,"title":549,"description":550,"published":551,"category":480,"image":552,"draft":484},"\u002Fblog\u002Fauth-session-missing","Supabase \"Auth session missing!\": куди поділася сесія","\"Auth session missing!\" означає, що supabase-js не знайшла жодної сесії й навіть не спитала Supabase. Куди поділася сесія і як це виправити.","2026-11-05","\u002Fblog\u002Fauth-session-missing\u002Fcard-800x500.png",{"path":554,"title":555,"description":556,"published":557,"category":480,"image":558,"draft":484},"\u002Fblog\u002Finvalid-claim-missing-sub-claim","Supabase \"invalid claim: missing sub claim\": ніхто не ввійшов","\"invalid claim: missing sub claim\": Supabase Auth отримав справжній токен без жодного користувача, ключ проєкту замість сесії.","2026-11-04","\u002Fblog\u002Finvalid-claim-missing-sub-claim\u002Fcard-800x500.png",{"path":560,"title":561,"description":562,"published":563,"category":480,"image":564,"draft":484},"\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function","\"Failed to send a request to the Edge Function\": справжня причина","\"Failed to send a request to the Edge Function\": браузер не отримав відповіді, яку можна прочитати. Його консоль каже, чому, і чи ваша функція запускалася.","2026-11-03","\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function\u002Fcard-800x500.png",{"path":566,"title":567,"description":568,"published":569,"category":480,"image":570,"draft":484},"\u002Fblog\u002Fsupabase-auth-redirects-to-localhost","Чому Supabase перенаправляє посилання з листів на localhost:3000","Якщо Supabase перенаправляє на localhost:3000, Site URL так і не змінили або вашої адреси немає в Redirect URLs. Як виправити і якої маски уникати.","2026-11-02","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcard-800x500.png",{"path":572,"title":573,"description":574,"published":575,"category":480,"image":576,"draft":484},"\u002Fblog\u002Femail-link-is-invalid-or-has-expired","Supabase \"Email link is invalid or has expired\" на новому посиланні","На посиланні, надісланому хвилину тому, \"Email link is invalid or has expired\" у Supabase зазвичай означає, що поштовий фільтр використав його першим.","2026-11-01","\u002Fblog\u002Femail-link-is-invalid-or-has-expired\u002Fcard-800x500.png",{"path":578,"title":579,"description":580,"published":581,"category":480,"image":582,"draft":484},"\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout","Supabase \"canceling statement due to statement timeout\": пояснення","Supabase \"canceling statement due to statement timeout\": запит перевищив ліміт своєї ролі, 3 секунди для відвідувача. Спершу перевірте політику RLS.","2026-10-31","\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout\u002Fcard-800x500.png",{"path":584,"title":585,"description":586,"published":587,"category":588,"image":589,"draft":484},"\u002Fblog\u002Fdatabase-error-deleting-user","\"Database error deleting user\" у Supabase і що зникає разом","\"Database error deleting user\" у Supabase: ваша база відмовилася видаляти. Причина в логах, а виправлення вирішує, що ще буде видалено.","2026-10-30","Backups","\u002Fblog\u002Fdatabase-error-deleting-user\u002Fcard-800x500.png",{"path":591,"title":592,"description":593,"published":594,"category":480,"image":595,"draft":484},"\u002Fblog\u002Fstripe-webhook-no-signatures-found","\"No signatures found matching the expected signature\" у Supabase","Вебхук Stripe в Edge Function Supabase пише \"No signatures found matching the expected signature\"? Причин дві. Не вимикайте перевірку.","2026-10-29","\u002Fblog\u002Fstripe-webhook-no-signatures-found\u002Fcard-800x500.png",{"path":597,"title":598,"description":599,"published":600,"category":480,"image":601,"draft":484},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" у Supabase: три причини","Supabase відповідає \"Invalid login credentials\" на неправильний пароль, невідому пошту й акаунт Google. Як зрозуміти, що саме.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":603,"title":604,"description":605,"published":606,"category":480,"image":607,"draft":484},"\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code","\"Edge Function returned a non-2xx status code\": справжня помилка","\"Edge Function returned a non-2xx status code\" означає, що ваша функція Supabase відповіла помилкою. Ось де прочитати справжню.","2026-10-27","\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code\u002Fcard-800x500.png",{"path":513,"title":5,"description":483,"published":514,"category":480,"image":502,"draft":484},{"path":610,"title":611,"description":612,"published":613,"category":480,"image":614,"draft":484},"\u002Fblog\u002Finvalid-input-syntax-for-type-uuid","Supabase \"invalid input syntax for type uuid\": що в лапках","Supabase \"invalid input syntax for type uuid\" означає, що застосунок надіслав щось, що не є id. Прочитайте лапки, притримайте запит, залиште колонку.","2026-10-25","\u002Fblog\u002Finvalid-input-syntax-for-type-uuid\u002Fcard-800x500.png",{"path":616,"title":617,"description":618,"published":619,"category":480,"image":620,"draft":484},"\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint","Supabase \"duplicate key value violates unique constraint\": пояснення","Supabase \"duplicate key value violates unique constraint\": значення вже зайняте. Знайдіть стовпець, оберіть виправлення й сховайте значення від очей.","2026-10-24","\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint\u002Fcard-800x500.png",{"path":622,"title":623,"description":624,"published":625,"category":480,"image":626,"draft":484},"\u002Fblog\u002Fsupabase-relation-does-not-exist","Supabase \"relation does not exist\", хоча таблиця на місці","Supabase \"relation does not exist\" або PGRST205: жодна таблиця не має такої назви в цій схемі. Чотири перевірки, і на що зважити, відкриваючи схему.","2026-10-23","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcard-800x500.png",{"path":628,"title":629,"description":630,"published":631,"category":480,"image":632,"draft":484},"\u002Fblog\u002Fsupabase-function-not-found","Supabase PGRST202: \"Could not find the function in the schema cache\"","Supabase \"Could not find the function in the schema cache\" показує назви аргументів, які надіслав ваш застосунок. Порівняйте їх із функцією.","2026-10-22","\u002Fblog\u002Fsupabase-function-not-found\u002Fcard-800x500.png",{"path":634,"title":635,"description":636,"published":637,"category":480,"image":638,"draft":484},"\u002Fblog\u002Fsupabase-schema-cache-column-error","Supabase PGRST204: \"Could not find the column in the schema cache\"","Supabase \"Could not find the column in the schema cache\" зазвичай означає, що назва не збігається. Чотири перевірки і рядок для перезавантаження.","2026-10-21","\u002Fblog\u002Fsupabase-schema-cache-column-error\u002Fcard-800x500.png",{"path":640,"title":641,"description":642,"published":643,"category":480,"image":644,"draft":484},"\u002Fblog\u002Fsupabase-email-rate-limit-exceeded","Supabase \"Email Rate Limit Exceeded\": два ліміти, один код помилки","Supabase \"Email Rate Limit Exceeded\" обмежує кожен лист вашого проєкту: 2 на годину з вбудованим відправником. Що враховується і як підняти ліміт.","2026-10-20","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcard-800x500.png",{"path":646,"title":647,"description":648,"published":649,"category":480,"image":650,"draft":484},"\u002Fblog\u002Fsupabase-users-logged-out","Supabase \"Invalid Refresh Token: Refresh Token Not Found\": 3 причини","Supabase \"Invalid Refresh Token: Refresh Token Not Found\" виводить ваших користувачів із системи. Три причини і як лог Auth їх розрізняє.","2026-10-19","\u002Fblog\u002Fsupabase-users-logged-out\u002Fcard-800x500.png",{"path":652,"title":653,"description":654,"published":655,"category":480,"image":656,"draft":484},"\u002Fblog\u002Fpermission-denied-for-schema-public","Supabase \"permission denied for schema public\": три причини","Supabase \"permission denied for schema public\" означає, що бракує GRANT на схему. Що його прибрало і який рядок його повертає.","2026-10-18","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcard-800x500.png",{"path":658,"title":659,"description":660,"published":661,"category":480,"image":662,"draft":484},"\u002Fblog\u002Fsupabase-bucket-not-found","Supabase \"Bucket not found\": три речі, які це може означати","Supabase \"Bucket not found\" означає одне з трьох: публічне посилання на приватний бакет, неточну назву або не той проєкт.","2026-10-17","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",{"path":664,"title":665,"description":666,"published":667,"category":480,"image":668,"draft":484},"\u002Fblog\u002Fsupabase-invalid-jwt","Supabase invalid JWT: який ключ перестав працювати?","Помилка Supabase invalid JWT — це PGRST301: підписаний токен не пройшов перевірку. У новому проєкті йдеться про сесію, а не про ключ API.","2026-10-16","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",{"path":670,"title":671,"description":672,"published":673,"category":480,"image":674,"draft":484},"\u002Fblog\u002Fsupabase-single-row-error","Supabase \"multiple (or no) rows returned\" майже завжди означає нуль","Supabase повертає PGRST116, \"JSON object requested, multiple (or no) rows returned\", коли запит нічого не знайшов. Прихований рядок має вигляд відсутнього.","2026-10-15","\u002Fblog\u002Fsupabase-single-row-error\u002Fcard-800x500.png",{"path":676,"title":677,"description":678,"published":679,"category":480,"image":680,"draft":484},"\u002Fblog\u002Fdatabase-error-saving-new-user","\"Database error saving new user\" у Supabase: де шукати","\"Database error saving new user\" означає, що щось причеплене до вашої реєстрації в Supabase впало. Справжня помилка лежить у ваших логах.","2026-10-14","\u002Fblog\u002Fdatabase-error-saving-new-user\u002Fcard-800x500.png",{"path":682,"title":683,"description":684,"published":685,"category":480,"image":686,"draft":484},"\u002Fblog\u002Fwhat-is-supabase","Що таке Supabase? База даних, яку обрав ваш білдер","Що таке Supabase: база даних, вхід і сховище файлів за вашим застосунком. Supabase тримає сервери, а правила про те, хто читає ваші рядки, ваші.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":688,"title":689,"description":690,"published":691,"category":480,"image":692,"draft":484},"\u002Fblog\u002Faws-access-key-exposed-in-frontend","Відкритий у фронтенді ключ AWS це не те саме, що ключ OpenAI","Ключ доступу AWS, відкритий у вашому фронтенді, читає і пише ваше сховище. Рішення зазвичай presigned URL, а не новий ключ.","2026-10-12","\u002Fblog\u002Faws-access-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":694,"title":695,"description":696,"published":697,"category":480,"image":698,"draft":484},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" при вивантаженні","\"New row violates row-level security policy for table objects\" означає, що вашому вивантаженню бракує правила insert. Публічний бакет його не додає.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":700,"title":701,"description":702,"published":703,"category":480,"image":704,"draft":484},"\u002Fblog\u002Fbase44-security-scan","Сканування безпеки Base44: те, що бачить лише воно","Сканування безпеки Base44 перевіряє сім видів проблем зсередини. Ось половина, яку читає тільки воно, і половина, на яку воно ніколи не дивиться.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":706,"title":707,"description":708,"published":709,"category":480,"image":710,"draft":484},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Ваш API-ключ витік. Порядок дій","API-ключ витік, і ви не знаєте, що робити першим. Не кожен ключ у вашому фронтенді є витоком, а порядок важить більше за швидкість.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":712,"title":713,"description":714,"published":715,"category":480,"image":716,"draft":484},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" без вимкнення RLS","\"Infinite recursion detected in policy for relation\" означає, що ваша policy запитала таблицю, яку вона захищає. Ось як розірвати коло.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":718,"title":719,"description":720,"published":721,"category":480,"image":722,"draft":484},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" у Supabase, і хибне виправлення","\"No API key found in request\" означає, що запит дійшов до Supabase без ключа. Більшість відповідей натомість вказують на правила вашої бази.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":724,"title":725,"description":726,"published":727,"category":480,"image":728,"draft":484},"\u002Fblog\u002Fis-base44-safe","Чи безпечний Base44? Дані 5 442 застосунків","Чи безпечний Base44? Ми прогнали дев’ять перевірок на 5 442 робочих застосунках Base44. Майже всі отримали B з причин, яких власник ніколи не обирав.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":730,"title":731,"description":732,"published":733,"category":480,"image":734,"draft":484},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Сховати ключ API: перенесіть його в Supabase Edge Function","Сховати ключ API означає прибрати його з браузера, а Supabase Edge Function це найменше місце, куди його покласти. Два кроки поруч важать більше.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":736,"title":737,"description":738,"published":739,"category":480,"image":740,"draft":484},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Чи відкритий ваш файл .env? Дванадцять шляхів для перевірки","Чи відкритий ваш файл .env на вашому власному вебсервері? Дванадцять адрес скажуть це за хвилину, а влучання означає, що все в ньому вже публічне.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":742,"title":743,"description":744,"published":745,"category":480,"image":746,"draft":484},"\u002Fblog\u002Fis-v0-safe","Безпека v0: усі 1 790 просканованих застосунків v0 отримали A","Безпека v0 на 1 790 живих застосунках v0: усі отримали A. Лише 17 згадували базу даних, і саме це здебільшого вимірює оцінка A.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":748,"title":749,"description":750,"published":751,"category":480,"image":752,"draft":484},"\u002Fblog\u002Fis-bolt-safe","Чи безпечний Bolt? Що показали 1 123 застосунки Bolt","Чи безпечний Bolt? Ми прогнали 1 123 живі застосунки Bolt через дев’ять перевірок. Хостинг був чистим. Знахідки: ключі й відкриті таблиці в самих застосунках.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":463,"title":754,"description":755,"published":756,"category":480,"image":757,"draft":484},"Supabase не працює чи проблема у вашому застосунку? Як розрізнити","Supabase не працює чи зламався ваш застосунок? Пауза, повна база й ваша власна помилка виглядають однаково. Чотири перевірки їх розрізняють.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":759,"title":760,"description":761,"published":762,"category":480,"image":763,"draft":484},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Чи шифрує Supabase мої дані? Так. Ось від чого це захищає","Чи шифрує Supabase дані? Так: AES-256 у стані спокою, TLS під час передавання, SOC 2 та ISO 27001. Що покриває кожне і який витік не зупиняє жодне.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":765,"title":766,"description":767,"published":768,"category":480,"image":769,"draft":484},"\u002Fblog\u002Fsupabase-free-plan-limits","Ліміти безкоштовного тарифу Supabase і що стається на кожному","Ліміти безкоштовного тарифу Supabase: 500 МБ бази, 5 ГБ egress і жодних резервних копій. Що стається на кожній межі і що змінює Pro за $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":771,"title":772,"description":773,"published":774,"category":588,"image":775,"draft":484},"\u002Fblog\u002Ftest-your-supabase-backup","Перевірте резервну копію Supabase до того, як вона знадобиться","Як перевірити резервну копію Supabase: відновити в тестовий проєкт, порахувати рядки, увійти й знайти рядок, якого бракує обрізаному файлу.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":777,"title":778,"description":779,"published":780,"category":588,"image":781,"draft":484},"\u002Fblog\u002Fsupabase-backup-github-action","Безкоштовна резервна копія Supabase через GitHub Action і підступ","Резервна копія Supabase через GitHub Action безкоштовна й годиться багатьом застосункам. Робочий процес, потрібний рядок підключення та egress.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":783,"title":784,"description":785,"published":786,"category":588,"image":787,"draft":484},"\u002Fblog\u002Fdownload-your-supabase-backup","Чому ви не можете завантажити резервну копію Supabase","Завантажити резервну копію Supabase на сучасному проєкті не вийде: щоденна копія там фізична. Як це перевірити і як тримати власну копію.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":789,"title":790,"description":791,"published":786,"category":480,"image":792,"draft":484},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": бракує GRANT","З 30 жовтня нова таблиця в Supabase відповідає \"permission denied for table\", доки ви не дасте доступ. Лист показує лише половину виправлення.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":794,"title":795,"description":796,"published":797,"category":480,"image":798,"draft":484},"\u002Fblog\u002Fopen-api-endpoint-exposed","Чи є відкритий API-ендпоінт проблемою безпеки? Читайте JSON","Ваше сканування позначило відкритий API-ендпоінт. Чи це важливо, залежить від того, що повернулося, і більшість знайдених належали платформі.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":800,"title":801,"description":802,"published":803,"category":480,"image":804,"draft":484},"\u002Fblog\u002Flovable-security-scan","Сканування безпеки Lovable: чого воно не доведе","Сканування безпеки Lovable: що перевіряють Quick scan і Deep scan, коли запускається кожне, і єдине, чого не доведе жодне сканування зсередини.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":806,"title":807,"description":808,"published":809,"category":588,"image":810,"draft":484},"\u002Fblog\u002Fsupabase-backup-auth-users","Чому у вашому дампі Supabase немає користувачів","Запустіть supabase db dump окремо і отримаєте форму вашої бази та жодного її рядка, без схеми auth, у якій живуть ваші користувачі.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":22,"title":812,"description":813,"published":814,"category":480,"image":815,"draft":484},"Домен закінчився, сайт лежить: що буде далі","Ваш домен закінчився і сайт лежить. Ось який годинник уже пішов, чому прострочений сертифікат це менша з двох бід, і як перевірити обидва.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":817,"title":818,"description":819,"published":820,"category":480,"image":821,"draft":484},"\u002Fblog\u002Fis-lovable-safe","Чи безпечний Lovable? Що показали 18 554 застосунки Lovable","Чи безпечний Lovable? Ми прогнали 18 554 живі застосунки Lovable через дев’ять перевірок. Платформа виявилася найчистішою з п’яти. Знахідки були в застосунках.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":823,"title":824,"description":825,"published":826,"category":480,"image":827,"draft":484},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Чек-лист безпеки для vibe coding, у девʼяти перевірках","Чек-лист безпеки для vibe coding із девʼяти пунктів, кожен з яких будь-хто може перевірити у вашому живому застосунку ззовні, і кожен має тест на один рядок.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":829,"title":830,"description":831,"published":832,"category":480,"image":833,"draft":484},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Секретний ключ Stripe у фронтенді може рухати гроші","Секретний ключ Stripe, відкритий у вашому фронтенді, може повертати кошти, списувати й читати кожну картку клієнта. А ключ pk_live_ там і має бути.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":835,"title":836,"description":837,"published":838,"category":480,"image":839,"draft":484},"\u002Fblog\u002Fvite-and-next-public-env-vars","Змінні оточення Vite відкриті: префікс означає опублікувати це","Змінні оточення Vite відкриті у вашому застосунку, бо так просив префікс. VITE_ і NEXT_PUBLIC_ означають опублікувати це, а ШІ, який їх додав, не знав ціни.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":841,"title":842,"description":843,"published":844,"category":480,"image":845,"draft":484},"\u002Fblog\u002Fbase44-source-maps","Безпека Base44: що позначає скан і що з цього виправляти вам","Безпека Base44 на 5 438 просканованих застосунках: три знахідки майже на кожному належать платформі, source map є бейджем Base44, а ваша частина коротка.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":847,"title":848,"description":849,"published":850,"category":480,"image":851,"draft":484},"\u002Fblog\u002Fis-cursor-ai-safe","Чи безпечний Cursor AI? Редактор, код і опублікований застосунок","Чи безпечний Cursor AI? Три запитання в одному пошуку: що Cursor зберігає, у чому помиляється його код і чи відкритий застосунок, який ви опублікували.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":853,"title":854,"description":855,"published":856,"category":480,"image":857,"draft":484},"\u002Fblog\u002Fis-replit-safe","Чи безпечний Replit? Що ми знайшли в 3 042 живих застосунках Replit","Чи безпечний Replit? Ми прогнали 3 042 живі застосунки Replit через дев’ять зовнішніх перевірок. Знахідки були в опублікованому застосунку, а не в хостингу.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":859,"title":860,"description":861,"published":862,"category":588,"image":863,"draft":484},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: у копії бази даних немає жодного файлу","Supabase storage backup це окрема робота. Копії бази даних зберігають список ваших файлів і жодного з них, тож після відновлення кожне завантаження зламане.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":865,"title":866,"description":867,"published":868,"category":588,"image":869,"draft":484},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery у Supabase: ціна та межі","Point-in-time recovery у Supabase відмотує базу на будь-яку секунду за останній тиждень. Коштує $100 на місяць понад Pro і покриває лише базу даних.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":871,"title":872,"description":873,"published":874,"category":588,"image":875,"draft":484},"\u002Fblog\u002Fsupabase-project-paused-recover","Проєкт Supabase на паузі? Ваші дані нікуди не зникли","Supabase поставив ваш проєкт на паузу після тижня без активності. Нічого не видалено, кнопка Restore стоїть поруч із назвою, і у вас є рік, щоб натиснути.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":877,"title":878,"description":879,"published":880,"category":480,"image":881,"draft":484},"\u002Fblog\u002Fsafest-ai-app-builder","Який білдер застосунків з ШІ найбезпечніший? 30 998 тестів","Який білдер застосунків з ШІ найбезпечніший? Ми просканували 30 998 живих застосунків з Lovable, Base44, Replit, v0 і Bolt. Оцінку вирішує не білдер.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":883,"title":884,"description":885,"published":886,"category":480,"image":887,"draft":484},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Увімкніть Row Level Security на кожній таблиці Supabase і перевірте","Row Level Security у Supabase без політики закриває таблицю повністю. Політика без увімкненого перемикача не робить нічого. Ось SQL, і ось перевірка.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":889,"title":890,"description":891,"published":892,"category":480,"image":893,"draft":484},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": чого не бачить попередження","Supabase позначає \"RLS disabled in public\" як помилку. Про політику читання, яка лишає вашу таблицю так само відкритою, він не каже нічого.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":895,"title":896,"description":897,"published":898,"category":480,"image":899,"draft":484},"\u002Fblog\u002Frotate-supabase-service-role-key","Як замінити злитий ключ service_role у Supabase","Supabase каже спершу закрити витік. Інші посібники кажуть міняти негайно. Що правильно, залежить від того, куди саме потрапив ваш ключ service_role.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":901,"title":902,"description":903,"published":904,"category":480,"image":905,"draft":484},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Сканери безпеки для vibe coding у порівнянні, наш теж","Найкращий сканер безпеки для vibe coding залежить від трьох питань, на які не відповідає жоден перелік функцій. Вісім інструментів і ціни.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":907,"title":908,"description":909,"published":910,"category":480,"image":911,"draft":484},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: п’ять перевірок, які зробите самі","Supabase security checker читає ваш опублікований застосунок, а не налаштування проєкту. Ось п’ять перевірок і як виконати кожну самостійно.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":913,"title":914,"description":915,"published":916,"category":480,"image":917,"draft":484},"\u002Fblog\u002Fvibe-coding-security-scanner","Сканер безпеки для vibe coding: чого не бачить скан URL","Сканер безпеки для vibe coding читає ваш робочий застосунок ззовні. Що це охоплює, чотири речі, яких він не бачить, і як читати результат.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":919,"title":920,"description":921,"published":922,"category":480,"image":923,"draft":484},"\u002Fblog\u002Fmissing-security-headers","Відсутні заголовки безпеки: коли це справді важливо","Відсутні заголовки безпеки трапляються в наших звітах найчастіше. Від чого вони захищають і коли це найменш терміновий рядок вашого звіту.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":925,"title":926,"description":927,"published":928,"category":480,"image":929,"draft":484},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Ваш ключ API OpenAI відкритий у фронтенді. Замініть його.","Ключ API OpenAI, відкритий у фронтенді, не можна прив'язати до домену. Замініть його сьогодні, перенесіть виклик на свій сервер і обмежте витрати.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":931,"title":932,"description":933,"published":934,"category":480,"image":935,"draft":484},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Ключ API у фронтенді: що насправді віддають 30 998 застосунків","Ключ API, відкритий у вашому фронтенді, зазвичай є ключем Google Maps. Ми просканували 30 998 vibe-coded застосунків і порахували, що витікає насправді.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":937,"title":938,"description":939,"published":940,"category":588,"image":941,"draft":484},"\u002Fblog\u002Fsupabase-backup-tools-compared","Інструменти резервного копіювання Supabase, і наш серед них","Чотири види інструментів резервного копіювання Supabase, що копіює кожен і коли безкоштовна GitHub Action виграє в будь-якої оплати, нашої теж.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":943,"title":944,"description":945,"published":946,"category":480,"image":947,"draft":484},"\u002Fblog\u002Freplit-secrets-explained","Як користуватися секретами в Replit і що все одно публікується","Як користуватися секретами в Replit: додати, прочитати і усунути дві причини undefined. А ще ключі, які цей інструмент не здатен зберегти в таємниці.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":949,"title":950,"description":951,"published":952,"category":588,"image":953,"draft":484},"\u002Fblog\u002Fback-up-supabase-free-tier","Резервні копії на безкоштовному тарифі Supabase без терміналу","На безкоштовному тарифі Supabase резервних копій немає: копію робите ви. Як зробити її з панелі та що втрачає шлях через CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":955,"title":956,"description":957,"published":958,"category":480,"image":959,"draft":484},"\u002Fblog\u002Fis-supabase-secure","Чи безпечний Supabase? Так. Ваш проєкт це інше питання","Чи безпечний Supabase? Платформа проходить аудити, шифрує дані й тримає пентести. Їхня документація каже, де це закінчується і починаються ваші налаштування.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":961,"title":962,"description":963,"published":964,"category":480,"image":965,"draft":484},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Де знайти API-ключі Supabase: anon, service_role і URL","URL проєкту, ключ anon і ключ service_role лежать на одній сторінці панелі. Ось де вона, і яке з чотирьох значень має бути у вашому застосунку.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":967,"title":968,"description":969,"published":970,"category":480,"image":971,"draft":484},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy в Supabase. Що далі?","\"New row violates row-level security policy\" означає, що Supabase відмовив у записі. Швидке виправлення знову відкриває таблицю для всіх.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":973,"title":974,"description":975,"published":976,"category":480,"image":977,"draft":484},"\u002Fblog\u002Fcors-wildcard-security-risk","Чи є вайлдкард CORS ризиком для безпеки? Майже ніколи.","Чи є вайлдкард CORS ризиком для безпеки? Зазвичай це типове налаштування вашого білдера, і воно не видає нічого, що ваш сервер і так віддавав кожному.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":979,"title":980,"description":981,"published":982,"category":588,"image":983,"draft":484},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Branching у Supabase це не бекап. Він іде тільки вперед.","Чому branching у Supabase це не бекап: гілка стартує без ваших даних, а мердж переносить саму лише схему. Для чого він потрібен і що брати замість нього.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":985,"title":986,"description":987,"published":988,"category":588,"image":989,"draft":484},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Як відновити резервну копію Supabase, і що ламається потім","Як відновити резервну копію Supabase з панелі або з файлу дампа, що саме замінює відновлення і чому ваш застосунок може лишитися зламаним після нього.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":991,"title":992,"description":993,"published":994,"category":480,"image":995,"draft":484},"\u002Fblog\u002Fsupabase-storage-bucket-public","Ваш бакет Supabase Storage публічний. Чи це проблема?","Публічний бакет Supabase Storage означає, що той, хто має URL файлу, може його відкрити. Він не означає, що хтось може переглянути список вмісту.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":997,"title":998,"description":999,"published":1000,"category":480,"image":1001,"draft":484},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Чи є проблемою ключ API Google у вашому браузері?","Ключ API Google у відкритому коді сторінки наш сканер знаходить найчастіше, і зазвичай усе гаразд. Вирішує це одне безкоштовне налаштування.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":1003,"title":1004,"description":1005,"published":1006,"category":588,"image":1007,"draft":484},"\u002Fblog\u002Fai-agent-deleted-my-database","ШІ-агент видалив мої дані в Supabase. Що можна відновити?","ШІ-агент видалив дані з вашої бази. Те, що ви зможете відновити, вирішилося раніше, а наступні хвилини вирішують, скільки з цього вціліє.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":1009,"title":1010,"description":1011,"published":1012,"category":480,"image":1013,"draft":484},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Чи може будь-хто прочитати вашу базу Supabase? 3 680 застосунків","Чи може будь-хто прочитати вашу базу даних Supabase без входу? Ми просканували 30 998 живих застосунків, зроблених ШІ-білдерами, і виміряли, як часто так.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":1015,"title":1016,"description":1017,"published":1012,"category":480,"image":1018,"draft":484},"\u002Fblog\u002Fsource-maps-exposed-in-production","Відкриті source maps: ваш застосунок публікує свій вихідний код","Відкрита source map дає будь-кому прочитати оригінальний код вашого застосунку, разом із коментарями. Перевірка за 30 секунд, і що важить насправді.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":1020,"title":1021,"description":1022,"published":1023,"category":480,"image":1024,"draft":484},"\u002Fblog\u002Fsupabase-new-api-keys","Supabase publishable key: це той самий anon key?","Supabase замінив anon і service_role публічними та секретними ключами. Який із них має бути у вашому застосунку, а який не має бути ніколи?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":1026,"title":1027,"description":1028,"published":1029,"category":588,"image":1030,"draft":484},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Чи робить Supabase резервні копії моєї бази? Залежить від тарифу.","Чи робить Supabase резервні копії вашої бази даних? На платних тарифах щодня, на безкоштовному жодної. Як дізнатися, що у вас насправді є.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":1032,"title":1033,"description":1034,"published":1035,"category":480,"image":1036,"draft":484},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security увімкнено. Таблиця досі публічна.","Увімкнути Supabase Row Level Security не означає захистити таблицю. Захищають політики, а та, що полагодила застосунок, часто впускає всіх.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":1038,"title":1039,"description":1040,"published":1035,"category":588,"image":1041,"draft":484},"\u002Fblog\u002Fversion-history-is-not-a-backup","Історія версій не є резервною копією. Вона не поверне таблицю.","Lovable і Bolt ведуть історію версій вашого коду. Ваша база даних працює як окремий сервіс, тож відкат назад не поверне ваші дані.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":1043,"title":1044,"description":1045,"published":1046,"category":588,"image":1047,"draft":484},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Три способи зробити резервну копію бази Supabase, і чого бракує","Панель, pg_dump і керований сервіс. Що насправді зберігає кожен спосіб, що тихо лишає осторонь і який із них переживе втрату акаунта.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":1049,"title":1050,"description":1051,"published":1046,"category":480,"image":1052,"draft":484},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Які API-ключі безпечні у браузері, а які ні","Ваш ключ anon у Supabase створений, щоб бути публічним. Ключ service_role для цього не створений, і він ігнорує всі правила, які ви задали. Як їх розрізнити.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1794213654331]