{"id":23254,"date":"2026-04-29T20:01:14","date_gmt":"2026-04-29T20:01:14","guid":{"rendered":"https:\/\/umang.pk\/2026\/04\/29\/github-%d8%a7%db%8c%da%a9%d8%b4%d9%86%d8%b2-ci-cd-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6%db%92-%da%a9%d9%84%d8%a7%d8%a4%da%88-%d9%81%d9%84\/"},"modified":"2026-04-29T20:01:14","modified_gmt":"2026-04-29T20:01:14","slug":"github-%d8%a7%db%8c%da%a9%d8%b4%d9%86%d8%b2-ci-cd-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6%db%92-%da%a9%d9%84%d8%a7%d8%a4%da%88-%d9%81%d9%84","status":"publish","type":"post","link":"https:\/\/umang.pk\/ur\/2026\/04\/29\/github-%d8%a7%db%8c%da%a9%d8%b4%d9%86%d8%b2-ci-cd-%da%a9%d8%a7-%d8%a7%d8%b3%d8%aa%d8%b9%d9%85%d8%a7%d9%84-%da%a9%d8%b1%d8%aa%db%92-%db%81%d9%88%d8%a6%db%92-%da%a9%d9%84%d8%a7%d8%a4%da%88-%d9%81%d9%84\/","title":{"rendered":"GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632 CI\/CD \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06a9\u0644\u0627\u0624\u0688 \u0641\u0644\u06cc\u0626\u0631 \u0648\u0631\u06a9\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0641\u0644 \u0627\u0633\u0679\u06cc\u06a9 Next.js \u0627\u06cc\u067e \u06a9\u0648 \u06a9\u06cc\u0633\u06d2 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2"},"content":{"rendered":"\n<div id=\"\">\n<p>\u0645\u06cc\u06ba \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 Postgres \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06d2 \u0644\u06cc\u06d2 Next.js 14 (App Router) \u0627\u0648\u0631 Supabase \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0628\u0646\u0627\u062a\u0627 \u06c1\u0648\u06ba\u06d4 Next.js \u0627\u06cc\u067e\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u06cc\u0641\u0627\u0644\u0679 \u0688\u0633\u0679\u0631\u06cc \u0628\u06cc\u0648\u0634\u0646 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 Vercel \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0688\u0648\u06cc\u0644\u067e\u0631 \u062a\u062c\u0631\u0628\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0644\u06cc\u06a9\u0646 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0627\u06cc\u06a9 \u06c1\u0641\u062a\u06d2 \u062a\u06a9 \u062f\u0648\u0646\u0648\u06ba \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645\u0632 \u067e\u0631 \u0627\u06cc\u06a9 \u06c1\u06cc \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u0648 \u0686\u0644\u0627\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0645\u06cc\u06ba \u0646\u06d2 \u0645\u062a\u0628\u0627\u062f\u0644 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 Cloudflare \u0648\u0631\u06a9\u0631\u0632 \u06a9\u0648 \u062a\u0644\u0627\u0634 \u06a9\u0631\u0646\u0627 \u0634\u0631\u0648\u0639 \u06a9\u06cc\u0627\u06d4 \u0645\u062c\u06be\u06d2 \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648\u0627 \u06a9\u06c1 \u062a\u0627\u062e\u06cc\u0631 \u06a9\u0648 \u0628\u06c1\u062a\u0631 \u0628\u0646\u0627\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627 (\u06a9\u0645 TTFB) \u0627\u0648\u0631 \u0645\u0641\u062a \u062f\u0631\u062c\u06d2 \u0645\u06cc\u0631\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06d2 \u0645\u0639\u0627\u0645\u0644\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0632\u06cc\u0627\u062f\u06c1 \u0644\u0686\u06a9\u062f\u0627\u0631 \u062a\u06be\u06d2\u06d4<\/p>\n<p>Cloudflare \u067e\u0631 Next.js \u0627\u06cc\u067e\u0633 \u06a9\u0648 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u0646\u0627 \u0627\u06cc\u06a9 \u0686\u06cc\u0644\u0646\u062c \u062a\u06be\u0627\u06d4 \u067e\u0686\u06be\u0644\u06d2 \u062d\u0644\u060c \u062c\u06cc\u0633\u06d2 Cloudflare \u067e\u06cc\u062c\u0632\u060c \u06a9\u06cc \u0645\u06a9\u0645\u0644 Next.js \u0641\u0639\u0627\u0644\u06cc\u062a \u0627\u0648\u0631 \u0679\u0648\u0644\u0632 \u062c\u06cc\u0633\u06d2 \u06a9\u06c1: <code>next-on-pages<\/code> \u06cc\u06c1 \u0627\u06a9\u062b\u0631 \u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u0631\u06cc\u0644\u06cc\u0632 \u0633\u06d2 \u067e\u06cc\u0686\u06be\u06d2 \u0631\u06c1 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u0645\u062a\u0639\u0627\u0631\u0641 \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0628\u0639\u062f \u0633\u06d2 \u06a9\u06cc\u0627 \u0628\u062f\u0644\u0627 \u06c1\u06d2\u06d4 <code>@opennextjs\/cloudflare<\/code>. \u06cc\u06c1 \u0645\u0639\u06cc\u0627\u0631\u06cc Next.js \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646\u0632 \u06a9\u0648 Cloudflare \u0648\u0631\u06a9\u0631\u0632 \u0645\u06cc\u06ba \u0645\u0631\u062a\u0628 \u06a9\u0631\u0646\u06d2 \u06a9\u06cc \u0627\u062c\u0627\u0632\u062a \u062f\u06cc\u062a\u0627 \u06c1\u06d2 \u062a\u0627\u06a9\u06c1 SSR\u060c ISR\u060c \u0645\u0688\u0644 \u0648\u06cc\u0626\u0631\u060c \u0627\u0648\u0631 \u062a\u0635\u0648\u06cc\u0631\u06cc \u0627\u062c\u0632\u0627\u0621 \u062c\u06cc\u0633\u06cc \u062e\u0635\u0648\u0635\u06cc\u0627\u062a \u06a9\u0648 \u0633\u067e\u0648\u0631\u0679 \u06a9\u06cc\u0627 \u062c\u0627 \u0633\u06a9\u06d2\u06d4 \u06a9\u0648\u0688 \u0645\u06cc\u06ba \u0628\u0691\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc\u0648\u06ba \u06a9\u06d2 \u0628\u063a\u06cc\u0631 \u0633\u0628 \u0645\u0645\u06a9\u0646 \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u06af\u0627\u0626\u06cc\u0688 \u0645\u06cc\u06ba\u060c \u0645\u06cc\u06ba \u0622\u067e \u06a9\u0648 \u0628\u0627\u0644\u06a9\u0644 \u062f\u0631\u0633\u062a \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u06a9\u06d2 \u0628\u0627\u0631\u06d2 \u0645\u06cc\u06ba \u0628\u062a\u0627\u0624\u06ba \u06af\u0627 \u062c\u0648 \u0645\u06cc\u06ba \u0646\u06d2 \u06a9\u0644\u0627\u0624\u0688 \u0641\u0644\u06cc\u0626\u0631 \u0648\u0631\u06a9\u0631\u0632 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u06a9 \u0645\u06a9\u0645\u0644 \u0627\u0633\u0679\u06cc\u06a9 Next.js + Supabase \u0627\u06cc\u067e\u0644\u06cc \u06a9\u06cc\u0634\u0646 \u06a9\u0648 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062a\u06be\u0627\u06d4<\/p>\n<p>\u06cc\u06c1 \u0645\u0636\u0645\u0648\u0646 \u0631\u0646 \u0628\u06a9 \u06c1\u06d2 \u06a9\u0627\u0634 \u062c\u0628 \u0645\u06cc\u06ba \u0646\u06d2 \u0634\u0631\u0648\u0639 \u06a9\u06cc\u0627 \u06c1\u0648\u062a\u0627\u06d4<\/p>\n<h2 id=\"heading-table-of-contents\">\u0627\u0646\u0688\u06cc\u06a9\u0633<\/h2>\n<h2 id=\"heading-why-choose-cloudflare-workers-over-vercel\">\u0648\u0631\u0633\u0644 \u067e\u0631 \u06a9\u0644\u0627\u0624\u0688 \u0641\u0644\u06cc\u0626\u0631 \u0648\u0631\u06a9\u0631\u0632 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u06cc\u0648\u06ba \u06a9\u0631\u06cc\u06ba\u061f<\/h2>\n<p>Next.js \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646\u0632 \u06a9\u0648 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a Vercel \u0627\u06a9\u062b\u0631 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0637\u06d2 \u0634\u062f\u06c1 \u0627\u0646\u062a\u062e\u0627\u0628 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0627\u06cc\u06a9 \u06c1\u0645\u0648\u0627\u0631 \u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u0627\u0648\u0631 Next.js \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0633\u062e\u062a \u0627\u0646\u0636\u0645\u0627\u0645 \u067e\u06cc\u0634 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<p>\u062a\u0627\u06c1\u0645\u060c Cloudflare \u0648\u0631\u06a9\u0631\u0632 \u0627\u06cc\u06a9 \u0632\u0628\u0631\u062f\u0633\u062a \u0645\u062a\u0628\u0627\u062f\u0644 \u067e\u06cc\u0634 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u062e\u0627\u0635 \u0637\u0648\u0631 \u067e\u0631 \u062c\u0628 \u0639\u0627\u0644\u0645\u06cc \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u0627\u0648\u0631 \u0644\u0627\u06af\u062a \u06a9\u06cc \u062a\u0627\u062b\u06cc\u0631 \u067e\u0631 \u063a\u0648\u0631 \u06a9\u06cc\u0627 \u062c\u0627\u0626\u06d2\u06d4<\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u0627\u06cc\u06a9 \u0645\u0648\u0679\u0627 \u0645\u0648\u0627\u0632\u0646\u06c1 \u06c1\u06d2 (\u062a\u062d\u0631\u06cc\u0631 \u06a9\u06d2 \u0648\u0642\u062a):<\/p>\n<table>\n<thead>\n<tr>\n<th>\u062e\u062f\u0634\u06c1<\/th>\n<th>\u0648\u0631\u0633\u0644 (\u0634\u0648\u0642)<\/th>\n<th>Cloudflare \u06a9\u0627\u0631\u06a9\u0646 (\u0645\u0641\u062a \u062f\u0631\u062c\u06d2)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u062f\u0631\u062e\u0648\u0627\u0633\u062a<\/td>\n<td>\u0645\u0646\u0635\u0641\u0627\u0646\u06c1 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc \u062d\u062f\u0648\u062f<\/td>\n<td>\u0631\u0648\u0632\u0627\u0646\u06c1 \u0644\u0627\u06a9\u06be\u0648\u06ba \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba\u06d4<\/td>\n<\/tr>\n<tr>\n<td>\u0633\u0631\u062f \u0622\u063a\u0627\u0632<\/td>\n<td>~100-300ms (\u0639\u0644\u0627\u0642\u06d2 \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631)<\/td>\n<td>\u0635\u0641\u0631 \u06a9\u06d2 \u0642\u0631\u06cc\u0628 (V8 \u062a\u0646\u06c1\u0627\u0626\u06cc)<\/td>\n<\/tr>\n<tr>\n<td>\u06a9\u0646\u0627\u0631\u06d2 \u06a9\u0627 \u0645\u0642\u0627\u0645<\/td>\n<td>\u0648\u06c1 \u0639\u0644\u0627\u0642\u06d2 \u062c\u06c1\u0627\u06ba SSR \u067e\u0631 \u067e\u0627\u0628\u0646\u062f\u06cc \u06c1\u06d2\u06d4<\/td>\n<td>300+ \u0639\u0627\u0644\u0645\u06cc \u06a9\u0646\u0627\u0631\u06d2 \u0648\u0627\u0644\u06d2 \u0645\u0642\u0627\u0645\u0627\u062a<\/td>\n<\/tr>\n<tr>\n<td>\u0628\u06cc\u0646\u0688\u0648\u062a\u06be<\/td>\n<td>~100GB\/\u0645\u06c1\u06cc\u0646\u06c1 (\u0646\u0631\u0645 \u0679\u0648\u067e\u06cc)<\/td>\n<td>\u0641\u0631\u0627\u062e\/\u0645\u0641\u062a \u062f\u0631\u062c\u06d2 \u067e\u0631 \u06a9\u0648\u0626\u06cc \u0633\u062e\u062a \u062d\u062f \u0646\u06c1\u06cc\u06ba\u06d4<\/td>\n<\/tr>\n<tr>\n<td>\u0627\u067e\u0646\u06cc \u0645\u0631\u0636\u06cc \u06a9\u06d2 \u0645\u0637\u0627\u0628\u0642 \u0688\u0648\u0645\u06cc\u0646<\/td>\n<td>\u062d\u0645\u0627\u06cc\u062a \u06a9\u06cc<\/td>\n<td>\u062d\u0645\u0627\u06cc\u062a \u06a9\u06cc<\/td>\n<\/tr>\n<tr>\n<td>\u0627\u0645\u06cc\u062c \u0622\u067e\u0679\u06cc\u0645\u0627\u0626\u0632\u06cc\u0634\u0646<\/td>\n<td>\u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u0645\u06cc\u06ba \u0634\u0627\u0645\u0644 \u06c1\u06d2\u06d4<\/td>\n<td>\u06a9\u06d2 \u0630\u0631\u06cc\u0639\u06d2 \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u06d2\u06d4 <code>IMAGES<\/code> \u067e\u0627\u0628\u0646\u062f<\/td>\n<\/tr>\n<tr>\n<td>\u0645\u0641\u062a \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1<\/td>\n<td>\u0641\u06cc \u0645\u06c1\u06cc\u0646\u06c1 ~$20 \u0633\u06d2 \u0634\u0631\u0648\u0639 \u06c1\u0648 \u0631\u06c1\u0627 \u06c1\u06d2\u06d4<\/td>\n<td>\u0633\u0633\u062a\u06cc\u060c \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u067e\u0631 \u0645\u0628\u0646\u06cc \u0642\u06cc\u0645\u062a<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3 id=\"heading-key-takeaways\">\u06a9\u0644\u06cc\u062f\u06cc \u0679\u06cc\u06a9 \u0648\u06cc\u0632<\/h3>\n<ul>\n<li>\n<p><strong>\u062f\u0646\u06cc\u0627 \u0628\u06be\u0631 \u0645\u06cc\u06ba \u06a9\u0645 \u062a\u0627\u062e\u06cc\u0631<\/strong>: Cloudflare \u0633\u06cc\u06a9\u0691\u0648\u06ba \u06a9\u0646\u0627\u0631\u06d2 \u0648\u0627\u0644\u06d2 \u0645\u0642\u0627\u0645\u0627\u062a \u067e\u0631 \u0627\u06cc\u067e\u0633 \u0686\u0644\u0627\u062a\u0627 \u06c1\u06d2\u060c \u062f\u0646\u06cc\u0627 \u0628\u06be\u0631 \u06a9\u06d2 \u0635\u0627\u0631\u0641\u06cc\u0646 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u062f\u0639\u0645\u0644 \u06a9\u06d2 \u0627\u0648\u0642\u0627\u062a \u06a9\u0648 \u062a\u06cc\u0632 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u06a9\u0645 \u0633\u06d2 \u06a9\u0645 \u0633\u0631\u062f\u06cc \u06a9\u0627 \u0622\u063a\u0627\u0632<\/strong>: V8 Isolate \u06a9\u06cc \u0628\u062f\u0648\u0644\u062a\u060c \u0641\u0646\u06a9\u0634\u0646 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0641\u0648\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0634\u0631\u0648\u0639 \u06c1\u0648 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0644\u0627\u06af\u062a \u06a9\u06cc \u062a\u0627\u062b\u06cc\u0631<\/strong>: \u0645\u0641\u062a \u062f\u0631\u062c\u06d2 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648\u0632\u060c \u0628\u0644\u0627\u06af\u0632\u060c \u0627\u0648\u0631 \u0628\u06c1\u062a \u0633\u06cc \u0686\u06be\u0648\u0679\u06cc \u0633\u06d2 \u062f\u0631\u0645\u06cc\u0627\u0646\u06cc \u0627\u06cc\u067e\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u06a9\u0627\u0641\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<h3 id=\"heading-trade-offs-to-consider\">\u0641\u0648\u0627\u0626\u062f \u0627\u0648\u0631 \u0646\u0642\u0635\u0627\u0646\u0627\u062a \u067e\u0631 \u063a\u0648\u0631 \u06a9\u0631\u0646\u0627<\/h3>\n<p>Cloudflare \u06a9\u0627\u0631\u06a9\u0646\u0627\u0646 \u0645\u06a9\u0645\u0644 Node.js \u0645\u0627\u062d\u0648\u0644 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 V8 \u0627\u0644\u06af \u062a\u06be\u0644\u06af \u0631\u0646 \u0679\u0627\u0626\u0645 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06a9\u0627 \u0645\u0637\u0644\u0628 \u06c1\u06d2:<\/p>\n<p>\u0627\u0633 \u0646\u06d2 \u06a9\u06c1\u0627\u060c \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u062c\u062f\u06cc\u062f \u0627\u0633\u0679\u06cc\u06a9\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2\u060c \u062c\u06cc\u0633\u06d2 Next.js + Supabase + Stripe + Resend\u060c \u06cc\u06c1 \u062d\u062f \u0634\u0627\u0630 \u0648 \u0646\u0627\u062f\u0631 \u06c1\u06cc \u06a9\u0648\u0626\u06cc \u0645\u0633\u0626\u0644\u06c1 \u06c1\u06d2\u06d4<\/p>\n<p>\u06cc\u0639\u0646\u06cc \u0633\u0644\u06cc\u06a9\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 <strong>\u0648\u0631\u0633\u0644<\/strong> \u0627\u06af\u0631 \u0622\u067e \u0622\u0633\u0627\u0646 \u062a\u0631\u06cc\u0646 \u067e\u0644\u06af \u0627\u06cc\u0646\u0688 \u067e\u0644\u06d2 Next.js \u06a9\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u0646\u062a\u062e\u0628 \u06a9\u0631\u06cc\u06ba <strong>\u06a9\u0644\u0627\u0624\u0688 \u0641\u0644\u06cc\u0626\u0631 \u0648\u0631\u06a9\u0631\u0632<\/strong> \u062c\u0628 \u0622\u067e \u0628\u06c1\u062a\u0631 \u06a9\u0646\u0627\u0631\u06d2 \u06a9\u06cc \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u0627\u0648\u0631 \u0632\u06cc\u0627\u062f\u06c1 \u0644\u0686\u06a9\u062f\u0627\u0631 \u0627\u0633\u06a9\u06cc\u0644\u0646\u06af \u0686\u0627\u06c1\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-prerequisites\">\u0634\u0631\u0627\u0626\u0637<\/h2>\n<p>\u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u0633\u06d2 \u067e\u06c1\u0644\u06d2\u060c \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u0622\u067e \u06a9\u06d2 \u067e\u0627\u0633 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0633\u06cc\u0679 \u0627\u067e \u06c1\u06cc\u06ba: \u0632\u06cc\u0627\u062f\u06c1 \u062a\u0631 \u06a9\u0627\u0645\u0648\u06ba \u0645\u06cc\u06ba \u0635\u0631\u0641 \u0686\u0646\u062f \u0645\u0646\u0679 \u0644\u06af\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4<\/p>\n<ul>\n<li>\n<p><strong>Node.js 18+<\/strong> \u0627\u0648\u0631 <strong>pnpm 9+<\/strong> (\u0622\u067e \u0627\u06cc\u0646 \u067e\u06cc \u0627\u06cc\u0645 \u06cc\u0627 \u06cc\u0627\u0631\u0646 \u0628\u06be\u06cc \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u060c \u0644\u06cc\u06a9\u0646 \u06cc\u06c1 \u06af\u0627\u0626\u06cc\u0688 \u067e\u06cc \u0627\u06cc\u0646 \u067e\u06cc \u0627\u06cc\u0645 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4)<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>Cloudflare \u0627\u06a9\u0627\u0624\u0646\u0679<\/strong>  https:\/\/dash.cloudflare.com\/sign-up<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u0633\u067e\u0631 \u0628\u06cc\u0633 \u0627\u06a9\u0627\u0624\u0646\u0679<\/strong> (\u0627\u06af\u0631 \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06cc \u06c1\u06d2)  https:\/\/supabase.com<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>GitHub \u0630\u062e\u06cc\u0631\u06c1<\/strong> \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 (\u0628\u0639\u062f \u0645\u06cc\u06ba CI\/CD \u0633\u06cc\u0679 \u0627\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06d2)<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0648\u0626\u06cc \u0631\u0627\u0633\u062a\u06c1 \u0646\u06c1\u06cc\u06ba <strong>\u0688\u0648\u0645\u06cc\u0646 \u06a9\u0627 \u0646\u0627\u0645<\/strong> (\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc) &#8211; \u0622\u067e \u0627\u0633\u06d2 \u0645\u0641\u062a \u0645\u06cc\u06ba \u062d\u0627\u0635\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba\u06d4 <code>*.workers.dev<\/code> \u06cc\u06c1 \u0628\u0646\u06cc\u0627\u062f\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u06cc\u06a9 URL \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<h3 id=\"heading-install-wrangler-cloudflare-cli\">\u0631\u06cc\u0646\u06af\u0644\u0631 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba (Cloudflare CLI)<\/h3>\n<p>\u06c1\u0645 \u0627\u067e\u0646\u06cc \u0627\u06cc\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0628\u0646\u0627\u0646\u06d2 \u0627\u0648\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0631\u06cc\u0646\u06af\u0644\u0631 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba \u06af\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">pnpm add -D wrangler\n<\/code><\/pre>\n<h2 id=\"heading-the-stack\">\u0627\u0633\u0679\u06cc\u06a9<\/h2>\n<p>\u0627\u0633 \u0645\u0646\u0635\u0648\u0628\u06d2 \u0645\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06c1\u0648\u0646\u06d2 \u0648\u0627\u0644\u06cc \u0679\u06cc\u06a9\u0646\u0627\u0644\u0648\u062c\u06cc \u0627\u0633\u0679\u06cc\u06a9 \u06c1\u06d2:<\/p>\n<ul>\n<li>\n<p><strong>Next.js (v14.2.x):<\/strong> \u0639\u0648\u0627\u0645\u06cc \u0627\u0648\u0631 \u0688\u06cc\u0634 \u0628\u0648\u0631\u0688 \u062f\u0648\u0646\u0648\u06ba \u0631\u0627\u0633\u062a\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u06cc\u062c \u0631\u0646 \u0679\u0627\u0626\u0645 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u06cc\u067e \u0631\u0627\u0624\u0679\u0631 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644<\/p>\n<\/li>\n<li>\n<p><strong>\u0630\u06cc\u0644\u06cc \u0628\u0646\u06cc\u0627\u062f:<\/strong> \u062a\u0648\u062b\u06cc\u0642\u060c \u067e\u0648\u0633\u0679\u06af\u0631\u06cc\u0633 \u0688\u06cc\u0679\u0627 \u0628\u06cc\u0633\u060c \u0627\u0648\u0631 \u0642\u0637\u0627\u0631 \u06a9\u06cc \u0633\u0637\u062d \u06a9\u06cc \u0633\u06cc\u06a9\u06cc\u0648\u0631\u0679\u06cc (RLS) \u06a9\u0648 \u06c1\u06cc\u0646\u0688\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p><strong>\u0679\u06cc\u0644 \u0648\u0646\u0688 \u0633\u06cc \u0627\u06cc\u0633 \u0627\u06cc\u0633<\/strong> + UI \u06cc\u0648\u0679\u06cc\u0644\u06cc\u0679\u06cc\u0632: Framer Motion \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06c1\u0644\u06a9\u06d2 \u0627\u06cc\u0646\u06cc\u0645\u06cc\u0634\u0646 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0627\u0633\u0679\u0627\u0626\u0644 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2<\/p>\n<\/li>\n<li>\n<p><strong>Cloudflare \u06a9\u0627\u0631\u06a9\u0646\u0627\u0646:<\/strong> \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u06cc \u0628\u0646\u06cc\u0627\u062f \u067e\u0631 <code>@opennextjs\/cloudflare<\/code> \u0627\u0648\u0631 <code>wrangler<\/code><\/p>\n<\/li>\n<li>\n<p><strong>GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632:<\/strong> CI\/CD \u0627\u0648\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u0648 \u062e\u0648\u062f\u06a9\u0627\u0631 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0645\u06cc\u0645\u0648:<\/strong> \u0627\u06af\u0631 \u0622\u067e Next.js \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631 \u0631\u06c1\u06d2 \u06c1\u06cc\u06ba\u06d4 <strong>15 \u06cc\u0627 \u0627\u0633 \u0633\u06d2 \u0632\u06cc\u0627\u062f\u06c1<\/strong>\u0622\u067e \u06c1\u0679\u0627 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba<br \/><code>--dangerouslyUseUnsupportedNextVersion<\/code>    \u06cc\u06c1 \u0635\u0631\u0641 \u0645\u062e\u0635\u0648\u0635 Next.js 14 \u0633\u06cc\u0679 \u0627\u067e \u06a9\u06d2 \u0644\u06cc\u06d2 \u062f\u0631\u06a9\u0627\u0631 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u0627\u0633\u06d2 \u0627\u067e\u0646\u06cc \u0628\u0644\u0688 \u0627\u0633\u06a9\u0631\u067e\u0679 \u0645\u06cc\u06ba \u062c\u06be\u0646\u0688\u0627 \u0644\u06af\u0627\u0626\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-step-1-install-the-cloudflare-adapter\">\u0645\u0631\u062d\u0644\u06c1 1 &#8211; Cloudflare \u0627\u0688\u0627\u067e\u0679\u0631 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u06cc\u06a9 \u0645\u0648\u062c\u0648\u062f\u06c1 Next.js \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0627\u0646\u062f\u0631 Wrangler (Cloudflare \u06a9\u06d2 CLI \u0679\u0648\u0644) \u06a9\u06d2 \u0633\u0627\u062a\u06be OpenNext \u0627\u0688\u0627\u067e\u0679\u0631 \u0627\u0646\u0633\u0679\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<pre><code class=\"language-bash\">pnpm add @opennextjs\/cloudflare\npnpm add -D wrangler\n<\/code><\/pre>\n<p>\u067e\u06be\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0627\u0633\u06a9\u0631\u067e\u0679 <code>package.json<\/code>:<\/p>\n<pre><code class=\"language-jsonc\">{\n  \"scripts\": {\n    \"dev\": \"next dev\",\n    \"build\": \"next build\",\n    \"start\": \"next start\",\n    \"lint\": \"next lint\",\n\n    \"cloudflare-build\": \"opennextjs-cloudflare build --dangerouslyUseUnsupportedNextVersion\",\n    \"preview\":          \"pnpm cloudflare-build && opennextjs-cloudflare preview\",\n    \"deploy\":           \"pnpm cloudflare-build && wrangler deploy\",\n    \"upload\":           \"pnpm cloudflare-build && opennextjs-cloudflare upload\",\n    \"cf-typegen\":       \"wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts\"\n  }\n}\n<\/code><\/pre>\n<p>\u06c1\u0631 \u0627\u0633\u06a9\u0631\u067e\u0679 \u06a9\u06d2 \u0627\u0641\u0639\u0627\u0644 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06c1\u06cc\u06ba:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u0633\u06a9\u0631\u067e\u0679<\/th>\n<th>\u0641\u0646\u06a9\u0634\u0646<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>pnpm cloudflare-build<\/code><\/td>\n<td>\u0627\u06af\u0644\u0627 \u0627\u06cc\u067e \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0631\u062a\u0628 \u06a9\u0631\u06cc\u06ba: <code>.open-next\/<\/code> (\u0645\u0632\u062f\u0648\u0631 \u0628\u0646\u0688\u0644) \u06a9\u0648\u0626\u06cc \u0627\u067e \u0644\u0648\u0688\u0632 \u0646\u06c1\u06cc\u06ba \u06c1\u06cc\u06ba\u06d4<\/td>\n<\/tr>\n<tr>\n<td><code>pnpm preview<\/code><\/td>\n<td>\u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0627\u0633 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u0648 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0686\u0644\u0627\u0626\u06cc\u06ba: <code>wrangler dev<\/code>. \u0645\u062d\u0631\u06a9 \u06a9\u06d2 \u0642\u0631\u06cc\u0628 \u062a\u0631\u06cc\u0646 \u0686\u06cc\u0632\u06d4<\/td>\n<\/tr>\n<tr>\n<td><code>pnpm deploy<\/code><\/td>\n<td>Cloudflare \u067e\u0631 \u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u067e \u0644\u0648\u0688 \u06a9\u0631\u06cc\u06ba\u06d4 <strong>\u06cc\u06c1 \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u0645\u06cc\u06ba \u0628\u06be\u06cc\u062c \u062f\u06cc\u0627 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4<\/strong><\/td>\n<\/tr>\n<tr>\n<td><code>pnpm upload<\/code><\/td>\n<td>\u0628\u0646\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u0627\u067e \u0644\u0648\u0688 \u06a9\u0631\u06cc\u06ba\u06d4 <em>\u0646\u06cc\u0627 \u0648\u0631\u0698\u0646<\/em> \u067e\u0631\u0648\u0645\u0648\u0634\u0646 \u06a9\u06d2 \u0628\u063a\u06cc\u0631 (\u0645\u0631\u062d\u0644\u06c1 \u0648\u0627\u0631 \u0631\u0648\u0644 \u0622\u0624\u0679\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2)<\/td>\n<\/tr>\n<tr>\n<td><code>pnpm cf-typegen<\/code><\/td>\n<td>\u062f\u0648\u0628\u0627\u0631\u06c1 \u067e\u06cc\u062f\u0627 \u06a9\u0631\u0646\u0627 <code>cloudflare-env.d.ts<\/code> \u062a\u0631\u0645\u06cc\u0645 \u06a9\u06d2 \u0628\u0639\u062f \u0679\u0627\u0626\u067e \u06a9\u0631\u06cc\u06ba\u06d4 <code>wrangler.jsonc<\/code>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u0627\u062d\u062a\u06cc\u0627\u0637:<\/strong> \u0635\u0641\u062d\u06c1 \u067e\u0631 \u0645\u0628\u0646\u06cc <code>@cloudflare\/next-on-pages<\/code> \u06cc\u06c1 \u0627\u06cc\u06a9 \u0645\u062e\u062a\u0644\u0641 \u0679\u0648\u0644 \u06c1\u06d2\u06d4 \u06c1\u0645 \u06c1\u06cc\u06ba <strong>~ \u0646\u06c1\u06cc\u06ba<\/strong> \u0645\u06cc\u06ba \u0627\u0633\u06d2 \u0635\u0641\u062d\u0627\u062a \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0627\u06cc\u06a9 \u062d\u0642\u06cc\u0642\u06cc \u06a9\u0627\u0631\u06a9\u0646 \u06a9\u06d2 \u0637\u0648\u0631 \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631 \u0631\u06c1\u0627 \u06c1\u0648\u06ba\u06d4 \u062f\u0648\u0646\u0648\u06ba \u06a9\u0648 \u0645\u06a9\u0633 \u0646\u06c1 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h2 id=\"heading-step-2-wire-opennext-into-next-dev\">\u0645\u0631\u062d\u0644\u06c1 2 &#8211; OpenNext \u06a9\u0648 \u062c\u0648\u0691\u06cc\u06ba\u06d4 <code>next dev<\/code><\/h2>\n<p>\u0628\u0646\u0627\u0646\u0627 <code>pnpm dev<\/code> \u0622\u067e Cloudflare \u0628\u0627\u0626\u0646\u0688\u0646\u06af\u0632 (env vars, R2, KV, D1, \u0648\u063a\u06cc\u0631\u06c1) \u06a9\u0648 \u0627\u0633\u06cc \u0637\u0631\u062d \u067e\u0691\u06be \u0627\u0648\u0631 \u062a\u0631\u0645\u06cc\u0645 \u06a9\u0631 \u0633\u06a9\u062a\u06d2 \u06c1\u06cc\u06ba \u062c\u0633 \u0637\u0631\u062d \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u0645\u06cc\u06ba \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u06d4 <code>next.config.mjs<\/code>:<\/p>\n<pre><code class=\"language-js\">\/** @type {import('next').NextConfig} *\/\nconst nextConfig = {};\n\nif (process.env.NODE_ENV !== \"production\") {\n  const { initOpenNextCloudflareForDev } = await import(\n    \"@opennextjs\/cloudflare\"\n  );\n  initOpenNextCloudflareForDev();\n}\n\nexport default nextConfig;\n<\/code><\/pre>\n<p>\u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u0627\u0633\u06d2 \u062a\u0631\u0642\u06cc \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u06c1\u06cc \u06a9\u06c1\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 <code>next build<\/code> \u06cc\u06c1 \u062a\u06cc\u0632 \u0631\u06c1\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 CI \u0628\u06cc\u06a9\u0627\u0631 \u0645\u06cc\u06ba Miniflare \u0645\u062b\u0627\u0644\u0648\u06ba \u06a9\u0648 \u0646\u06c1\u06cc\u06ba \u06af\u06be\u0645\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-step-3-local-environment-setup-with-devvars\">\u0645\u0631\u062d\u0644\u06c1 3 \u2014 \u0627\u067e\u0646\u0627 \u0645\u0642\u0627\u0645\u06cc \u0645\u0627\u062d\u0648\u0644 \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4 <code>.dev.vars<\/code><\/h2>\n<p>\u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 Cloudflare \u06a9\u0627\u0631\u06a9\u0646\u0648\u06ba \u06a9\u06d2 \u0633\u0627\u062a\u06be \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06d2 \u0648\u0642\u062a\u060c Wrangler \u062f\u0631\u062c \u0630\u06cc\u0644 \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u0627 \u06c1\u06d2: <code>.dev.vars<\/code> \u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u06a9\u0648 \u0630\u062e\u06cc\u0631\u06c1 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u0626\u06d2 (\u0627\u0633 \u06a9\u06d2 \u0628\u062c\u0627\u0626\u06d2 <code>.env.local<\/code> Next.js \u0645\u06cc\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2)\u06d4<\/p>\n<p>\u0627\u06cc\u06a9 \u0633\u0627\u062f\u06c1 \u0627\u0648\u0631 \u0642\u0627\u0628\u0644 \u0627\u0639\u062a\u0645\u0627\u062f \u0637\u0631\u06cc\u0642\u06c1 \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u0645\u062b\u0627\u0644 \u06a9\u06cc \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0648 \u0627\u067e\u0646\u06d2 \u0630\u062e\u06cc\u0631\u06d2 \u0645\u06cc\u06ba \u0631\u06a9\u06be\u06cc\u06ba \u0627\u0648\u0631 \u0627\u0635\u0644 \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0648 \u0646\u0638\u0631 \u0627\u0646\u062f\u0627\u0632 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<h3 id=\"heading-example-devvarsexample-committed\">\u06c1\u0627\u06ba: <code>.dev.vars.example<\/code> (\u0633\u0631\u0634\u0627\u0631)<\/h3>\n<pre><code class=\"language-bash\">NEXT_PUBLIC_SUPABASE_URL=\"https:\/\/YOUR-PROJECT-ref.supabase.co\"\nNEXT_PUBLIC_SUPABASE_ANON_KEY=\"YOUR-ANON-KEY\"\nNEXT_PUBLIC_DASHBOARD_DEFAULT_EMAIL=\"admin@example.com\"\n<\/code><\/pre>\n<h3 id=\"heading-set-up-your-local-environment\">\u0645\u0642\u0627\u0645\u06cc \u0645\u0627\u062d\u0648\u0644 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628\u0627\u062a<\/h3>\n<p>\u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0645\u0627\u0646\u0688 \u06a9\u0648 \u0686\u0644\u0627\u0626\u06cc\u06ba:<\/p>\n<pre><code class=\"language-plaintext\">cp .dev.vars.example .dev.vars\ncp .dev.vars .env.local\n<\/code><\/pre>\n<h3 id=\"heading-why-use-both-files\">\u062f\u0648\u0646\u0648\u06ba \u0641\u0627\u0626\u0644\u06cc\u06ba \u06a9\u06cc\u0648\u06ba \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u06cc\u06ba\u061f<\/h3>\n<p>\u062f\u0648\u0646\u0648\u06ba \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0648 \u0645\u0637\u0627\u0628\u0642\u062a \u067e\u0630\u06cc\u0631 \u0631\u06a9\u06be\u0646\u06d2 \u0633\u06d2 \u06cc\u06c1 \u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u062a\u0627 \u06c1\u06d2 \u06a9\u06c1 \u0622\u067e \u06a9\u06cc \u0627\u06cc\u067e \u0688\u06cc\u0648\u0644\u067e\u0645\u0646\u0679 \u06a9\u06d2 \u062f\u0648\u0631\u0627\u0646 \u0627\u0648\u0631 Cloudflare \u0631\u0646 \u0679\u0627\u0626\u0645 \u067e\u0631 \u0686\u0644\u062a\u06d2 \u0648\u0642\u062a \u0645\u0633\u062a\u0642\u0644 \u0637\u0648\u0631 \u067e\u0631 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-update-gitignore\">\u0627\u067e \u0688\u06cc\u0679 <code>.gitignore<\/code><\/h3>\n<p>\u06cc\u0642\u06cc\u0646\u06cc \u0628\u0646\u0627\u0626\u06cc\u06ba \u06a9\u06c1 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0641\u0627\u0626\u0644\u0648\u06ba \u06a9\u0648 \u0646\u0638\u0631 \u0627\u0646\u062f\u0627\u0632 \u06a9\u0631 \u062f\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-plaintext\">.dev.vars\n.env*.local\n.open-next\n.wrangler\n<\/code><\/pre>\n<h2 id=\"heading-step-4-deploy-your-app-from-your-local-machine\">\u0645\u0631\u062d\u0644\u06c1 4 &#8211; \u0627\u067e\u0646\u06d2 \u0645\u0642\u0627\u0645\u06cc \u06a9\u0645\u067e\u06cc\u0648\u0679\u0631 \u0633\u06d2 \u0627\u06cc\u067e \u06a9\u0648 \u0645\u062a\u0639\u06cc\u0646 \u06a9\u0631\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 <code>pnpm preview<\/code> \u0627\u06af\u0631 \u06cc\u06c1 \u0635\u062d\u06cc\u062d \u0637\u0631\u06cc\u0642\u06d2 \u0633\u06d2 \u06a9\u0627\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u060c \u062a\u0648 \u0622\u067e \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062a\u0639\u06cc\u0646\u0627\u062a \u06c1\u0648\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u062a\u06cc\u0627\u0631 \u06c1\u06d2\u06d4<\/p>\n<pre><code class=\"language-bash\">pnpm deploy\n<\/code><\/pre>\n<p>\u06c1\u0688 \u06a9\u06d2 \u0646\u06cc\u0686\u06d2 \u06cc\u06c1 \u0686\u0644\u062a\u0627 \u06c1\u06d2:<\/p>\n<pre><code class=\"language-bash\">pnpm cloudflare-build && wrangler deploy\n<\/code><\/pre>\n<p>\u067e\u06c1\u0644\u06cc \u0628\u0627\u0631\u060c \u0631\u06cc\u0646\u06af\u0644\u0631 \u06a9\u0631\u06d2 \u06af\u0627:<\/p>\n<ol>\n<li>\n<p>\u0627\u067e\u0646\u06cc \u0627\u06cc\u067e \u06a9\u0648 \u0627\u0633 \u06a9\u06d2 \u0633\u0627\u062a\u06be \u0645\u0631\u062a\u0628 \u06a9\u0631\u06cc\u06ba: <code>.open-next\/worker.js<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0627\u067e\u0646\u06d2 \u0627\u0633\u06a9\u0631\u067e\u0679\u0633 \u0627\u0648\u0631 \u0627\u062b\u0627\u062b\u0648\u06ba \u06a9\u0648 Cloudflare \u067e\u0631 \u0627\u067e \u0644\u0648\u0688 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u0627\u0635\u0644 URL \u067e\u0631\u0646\u0679 \u06a9\u0631\u06cc\u06ba\u06d4 \u06c1\u0627\u06ba: <code>https:\/\/porfolio.<your-account>.workers.dev<\/your-account><\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u0628\u0631\u0627\u0624\u0632\u0631 \u0645\u06cc\u06ba \u06a9\u06be\u0648\u0644\u06cc\u06ba\u06d4 \u0645\u0628\u0627\u0631\u06a9 \u06c1\u0648 \u0622\u067e 330 \u0633\u06d2 \u200b\u200b\u0632\u06cc\u0627\u062f\u06c1 \u0634\u06c1\u0631\u0648\u06ba \u0645\u06cc\u06ba Cloudflare \u06a9\u06d2 \u06a9\u0646\u0627\u0631\u06d2 \u067e\u0631 \u06c1\u06cc\u06ba\u06d4 \u0635\u0641\u062d\u0627\u062a \u062f\u0631\u062c \u0630\u06cc\u0644 \u0641\u0627\u0631\u0645\u06cc\u0679 \u0645\u06cc\u06ba \u0641\u0631\u0627\u06c1\u0645 \u06a9\u06cc\u06d2 \u062c\u0627\u0626\u06cc\u06ba: <strong><100ms<\/strong> TTFB \u06c1\u0631 \u062c\u06af\u06c1\u06d4  <\/p>\n<p>\u06cc\u06c1\u0627\u06ba \u0645\u06cc\u0631\u06d2 \u067e\u0648\u0631\u0679 \u0641\u0648\u0644\u06cc\u0648 \u06a9\u0627 \u0644\u0627\u0626\u06cc\u0648 \u0648\u0631\u0698\u0646 \u06c1\u06d2 \u062c\u0648 \u0627\u0633 \u0637\u0631\u062d \u062a\u0642\u0633\u06cc\u0645 \u06a9\u06cc\u0627 \u06af\u06cc\u0627 \u06c1\u06d2:<\/p>\n<h2 id=\"heading-step-5-push-your-secrets-to-the-worker\">\u0645\u0631\u062d\u0644\u06c1 5 &#8211; \u0631\u0627\u0632 \u06a9\u0648 \u06a9\u0627\u0631\u06a9\u0646 \u062a\u06a9 \u067e\u06c1\u0646\u0686\u0627\u0626\u06cc\u06ba\u06d4<\/h2>\n<p>\u0645\u0642\u0627\u0645\u06cc <code>.dev.vars<\/code> \u06c1\u06d2 <strong>~ \u0646\u06c1\u06cc\u06ba<\/strong> \u06a9\u06cc \u0637\u0631\u0641 \u0633\u06d2 \u0627\u067e \u0644\u0648\u0688 <code>wrangler deploy<\/code>. \u0622\u067e \u06a9\u0648 \u0631\u0627\u0632 \u06a9\u0648 \u0648\u0627\u0636\u062d \u0637\u0648\u0631 \u067e\u0631 \u062f\u06be\u06a9\u06cc\u0644\u0646\u0627 \u06c1\u0648\u06af\u0627\u06d4<\/p>\n<pre><code class=\"language-bash\">wrangler secret put NEXT_PUBLIC_SUPABASE_URL\nwrangler secret put NEXT_PUBLIC_SUPABASE_ANON_KEY\nwrangler secret put NEXT_PUBLIC_DASHBOARD_DEFAULT_EMAIL\n<\/code><\/pre>\n<p>\u06c1\u0631 \u06a9\u0645\u0627\u0646\u0688 \u0622\u067e \u06a9\u0648 \u0627\u06cc\u06a9 \u0642\u062f\u0631 \u06a9\u0627 \u0627\u0634\u0627\u0631\u06c1 \u06a9\u0631\u062a\u0627 \u06c1\u06d2 \u0627\u0648\u0631 Cloudflare \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062e\u0641\u06cc\u06c1 \u06a9\u0631\u062f\u06c1 \u0642\u062f\u0631 \u06a9\u0648 \u0627\u0633\u0679\u0648\u0631 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u06cc\u0627 \u0627\u0633\u06d2 \u0628\u0635\u0631\u06cc \u0637\u0648\u0631 \u067e\u0631 \u0622\u0632\u0645\u0627\u0626\u06cc\u06ba:<\/p>\n<blockquote>\n<p>Cloudflare \u0688\u06cc\u0634 \u0628\u0648\u0631\u0688 \u2192 <strong>\u0648\u0631\u06a9\u0631\u0632 \u0627\u0648\u0631 \u067e\u06cc\u062c\u0632<\/strong> \u2192 \u0622\u067e \u06a9\u06d2 \u0645\u0644\u0627\u0632\u0645\u06cc\u0646 \u2192 <strong>\u062a\u0631\u062a\u06cc\u0628<\/strong> \u2192 <strong>\u0645\u062a\u063a\u06cc\u0631\u0627\u062a \u0627\u0648\u0631 \u0631\u0627\u0632<\/strong> \u2192 <strong>\u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba<\/strong>.<\/p>\n<\/blockquote>\n<p>\u0627\u06c1\u0645: <code>NEXT_PUBLIC_*<\/code> var \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0648\u0642\u062a \u06a9\u0644\u0627\u0626\u0646\u0679 \u06a9\u06d2 \u0628\u0646\u0688\u0644 \u0645\u06cc\u06ba \u0627\u0646 \u0644\u0627\u0626\u0646 \u06c1\u0648\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u06cc\u06c1 pnpm cloudflare-build \u06a9\u06d2 \u0686\u0644\u0646\u06d2 \u067e\u0631 \u0628\u06be\u06cc \u062f\u0633\u062a\u06cc\u0627\u0628 \u06c1\u0648\u0646\u0627 \u0686\u0627\u06c1\u06cc\u06d2 (\u0645\u0642\u0627\u0645\u06cc \u0637\u0648\u0631 \u067e\u0631 \u06cc\u06c1 .env.local\u061b CI \u0645\u06cc\u06ba\u060c \u0645\u0631\u062d\u0644\u06c1 10 \u062f\u06cc\u06a9\u06be\u06cc\u06ba)\u06d4<\/p>\n<h2 id=\"heading-step-6-set-up-continuous-deployment-with-github-actions\">\u0645\u0631\u062d\u0644\u06c1 6 &#8211; GitHub \u0627\u06cc\u06a9\u0634\u0646\u0632 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u0645\u0633\u0644\u0633\u0644 \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u062a\u0631\u062a\u06cc\u0628 \u062f\u06cc\u06ba\u06d4<\/h2>\n<p>\u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u06a9\u06cc \u0645\u0642\u0627\u0645\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u0627\u0645 \u06a9\u0631 \u0644\u06cc\u062a\u06cc \u06c1\u06d2\u060c \u062a\u0648 \u0627\u06af\u0644\u0627 \u0645\u0631\u062d\u0644\u06c1 \u0627\u067e\u0646\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u06a9\u0648 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0628\u0646\u0627\u0646\u0627 \u06c1\u06d2\u06d4 <code>main<\/code> \u0628\u0631\u0627\u0646\u0686 \u062e\u0648\u062f \u0628\u062e\u0648\u062f \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u0627\u0633 \u0648\u0631\u06a9 \u0641\u0644\u0648 \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2:<\/p>\n<ul>\n<li>\n<p>\u067e\u0644 \u06a9\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u06cc\u06ba \u062a\u0648\u062b\u06cc\u0642 \u06a9\u06cc \u062c\u0627\u0646\u0686 \u06a9\u0648 \u0686\u0644\u0627\u062a\u06cc \u06c1\u06cc\u06ba\u06d4<\/p>\n<\/li>\n<li>\n<p>\u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u06a9\u06cc \u062a\u0639\u06cc\u0646\u0627\u062a\u06cc \u0635\u0631\u0641 \u0627\u06cc\u06a9 \u06a9\u0627\u0645\u06cc\u0627\u0628 \u062a\u0639\u0645\u06cc\u0631 \u06a9\u06d2 \u0628\u0639\u062f \u06c1\u0648\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<\/li>\n<li>\n<p>\u06a9\u0631\u067e\u0679 \u06a9\u0648\u0688 \u06a9\u0628\u06be\u06cc \u0628\u06be\u06cc \u0622\u067e \u06a9\u06cc \u0627\u0635\u0644 \u0633\u0627\u0626\u0679 \u062a\u06a9 \u0646\u06c1\u06cc\u06ba \u067e\u06c1\u0646\u0686\u062a\u0627\u06d4<\/p>\n<\/li>\n<\/ul>\n<p>\u0627\u067e\u0646\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06d2 \u0627\u0646\u062f\u0631 \u062f\u0631\u062c \u0630\u06cc\u0644 \u0641\u0627\u0626\u0644\u06cc\u06ba \u0628\u0646\u0627\u0626\u06cc\u06ba:<\/p>\n<p><code>.github\/workflows\/deploy.yml<\/code><\/p>\n<pre><code class=\"language-yaml\">name: CI \/ Deploy to Cloudflare Workers\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n  workflow_dispatch:\n\nconcurrency:\n  group: cloudflare-deploy-${{ github.ref }}\n  cancel-in-progress: true\n\njobs:\n  verify:\n    name: Lint and Build\n    runs-on: ubuntu-latest\n    timeout-minutes: 10\n\n    steps:\n      - uses: actions\/checkout@v4\n\n      - uses: pnpm\/action-setup@v4\n        with:\n          version: 10\n\n      - uses: actions\/setup-node@v4\n        with:\n          node-version: 20\n          cache: pnpm\n\n      - run: pnpm install --frozen-lockfile\n      - run: pnpm lint\n      - run: pnpm build\n        env:\n          NEXT_PUBLIC_SUPABASE_URL: ${{ secrets.NEXT_PUBLIC_SUPABASE_URL }}\n          NEXT_PUBLIC_SUPABASE_ANON_KEY: ${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }}\n          NEXT_PUBLIC_DASHBOARD_DEFAULT_EMAIL: ${{ secrets.NEXT_PUBLIC_DASHBOARD_DEFAULT_EMAIL }}\n\n  deploy:\n    name: Deploy to Cloudflare Workers\n    needs: verify\n    if: github.event_name == 'push' && github.ref == 'refs\/heads\/main'\n    runs-on: ubuntu-latest\n    timeout-minutes: 15\n\n    steps:\n      - uses: actions\/checkout@v4\n\n      - uses: pnpm\/action-setup@v4\n        with:\n          version: 10\n\n      - uses: actions\/setup-node@v4\n        with:\n          node-version: 20\n          cache: pnpm\n\n      - run: pnpm install --frozen-lockfile\n\n      - name: Build and Deploy\n        run: pnpm run deploy\n        env:\n          CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}\n          CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}\n          NEXT_PUBLIC_SUPABASE_URL: ${{ secrets.NEXT_PUBLIC_SUPABASE_URL }}\n          NEXT_PUBLIC_SUPABASE_ANON_KEY: ${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }}\n          NEXT_PUBLIC_DASHBOARD_DEFAULT_EMAIL: ${{ secrets.NEXT_PUBLIC_DASHBOARD_DEFAULT_EMAIL }}\n<\/code><\/pre>\n<h3 id=\"heading-required-github-repo-secrets\">\u0645\u0637\u0644\u0648\u0628\u06c1 GitHub \u0630\u062e\u06cc\u0631\u06c1 \u0631\u0627\u0632<\/h3>\n<p>GitHub Repository \u2192 Settings \u2192 Secrets and Variables \u2192 Actions \u2192 New Repository Secret \u067e\u0631 \u062c\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u062f\u0631\u062c \u0630\u06cc\u0644 \u06a9\u0648 \u0634\u0627\u0645\u0644 \u06a9\u0631\u06cc\u06ba:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u062e\u0641\u06cc\u06c1<\/th>\n<th>\u0645\u06cc\u06ba \u0627\u0633\u06d2 \u06a9\u06c1\u0627\u06ba \u0633\u06d2 \u062d\u0627\u0635\u0644 \u06a9\u0631 \u0633\u06a9\u062a\u0627 \u06c1\u0648\u06ba\u061f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>CLOUDFLARE_API_TOKEN<\/code><\/td>\n<td>https:\/\/dash.cloudflare.com\/profile\/api-tokens \u2192 &quot;Cloudflare Worker Edit&#8221; \u0679\u06cc\u0645\u067e\u0644\u06cc\u0679<\/td>\n<\/tr>\n<tr>\n<td><code>CLOUDFLARE_ACCOUNT_ID<\/code><\/td>\n<td>Cloudflare \u0688\u06cc\u0634 \u0628\u0648\u0631\u0688 \u2192 \u062f\u0627\u0626\u06cc\u06ba \u0633\u0627\u0626\u0688\u0628\u0627\u0631\u060c &quot;\u0627\u06a9\u0627\u0624\u0646\u0679 ID&#8221;<\/td>\n<\/tr>\n<tr>\n<td><code>CLOUDFLARE_ACCOUNT_SUBDOMAIN<\/code><\/td>\n<td>\u0622\u067e \u06a9\u0627 <code>*.workers.dev<\/code> \u0630\u06cc\u0644\u06cc \u0688\u0648\u0645\u06cc\u0646 (\u0635\u0631\u0641 \u062a\u0642\u0633\u06cc\u0645 \u06cc\u0648 \u0622\u0631 \u0627\u06cc\u0644 \u0644\u0646\u06a9\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2)<\/td>\n<\/tr>\n<tr>\n<td><code>NEXT_PUBLIC_SUPABASE_URL<\/code><\/td>\n<td>\u0633\u0648\u067e\u0627 \u0628\u06cc\u0633 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628\u0627\u062a<\/td>\n<\/tr>\n<tr>\n<td><code>NEXT_PUBLIC_SUPABASE_ANON_KEY<\/code><\/td>\n<td>\u0633\u0648\u067e\u0627 \u0628\u06cc\u0633 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u06a9\u06cc \u062a\u0631\u062a\u06cc\u0628\u0627\u062a<\/td>\n<\/tr>\n<tr>\n<td><code>NEXT_PUBLIC_DASHBOARD_DEFAULT_EMAIL<\/code><\/td>\n<td>\u0627\u06cc \u0645\u06cc\u0644 \u067e\u06c1\u0644\u06d2 \u0633\u06d2 \u0622\u0628\u0627\u062f \u06c1\u06d2\u06d4 <code>\/dashboard\/login<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u0628\u0633\u06d4 \u0627\u0633\u06d2 \u062f\u06be\u06a9\u0627 <code>main<\/code> \u06cc\u06c1 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b 90 \u0633\u06cc\u06a9\u0646\u0688 \u06a9\u06d2 \u0628\u0639\u062f \u0686\u0627\u0644\u0648 \u06c1\u0648 \u062c\u0627\u0626\u06d2 \u06af\u0627\u06d4 PR \u0635\u0631\u0641 \u0644\u0646\u0679 \u0627\u0648\u0631 \u0628\u0646\u0627\u062a\u0627 \u06c1\u06d2\u060c \u0644\u06c1\u0630\u0627 \u06a9\u0648\u0626\u06cc \u0679\u0648\u0679\u0627 \u06c1\u0648\u0627 \u06a9\u0648\u0688 \u06a9\u0628\u06be\u06cc \u067e\u0631\u0648\u0688\u06a9\u0634\u0646 \u062a\u06a9 \u0646\u06c1\u06cc\u06ba \u067e\u06c1\u0646\u0686\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h2 id=\"heading-step-7-updating-the-project-the-daily-workflow\">\u0645\u0631\u062d\u0644\u06c1 7 &#8211; \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0627\u067e \u0688\u06cc\u0679\u0633 (\u0631\u0648\u0632\u0627\u0646\u06c1 \u0648\u0631\u06a9 \u0641\u0644\u0648)<\/h2>\n<p>\u0627\u0628\u062a\u062f\u0627\u0626\u06cc \u0633\u06cc\u0679 \u0627\u067e \u06a9\u06d2 \u0628\u0639\u062f\u060c \u0644\u0648\u067e \u0628\u0648\u0631\u0646\u06af \u062d\u062f \u062a\u06a9 \u0622\u0633\u0627\u0646 \u06c1\u06d2\u06d4 \u06cc\u06c1 \u0646\u0642\u0637\u06c1 \u06c1\u06d2. \u06cc\u06c1\u0627\u06ba \u06c1\u06d2 \u062c\u0648 \u0645\u06cc\u06ba \u0627\u0635\u0644 \u0645\u06cc\u06ba \u06c1\u0631 \u0631\u0648\u0632 \u06a9\u0631\u062a\u0627 \u06c1\u0648\u06ba:<\/p>\n<h3 id=\"heading-code-change\">\u06a9\u0648\u0688 \u06a9\u06cc \u062a\u0628\u062f\u06cc\u0644\u06cc<\/h3>\n<pre><code class=\"language-bash\">git checkout -b feat\/new-section\n# ...edit files...\npnpm dev                # iterate locally\npnpm preview            # final smoke test on the Worker runtime\ngit commit -am \"feat: add new section\"\ngit push origin feat\/new-section\n<\/code><\/pre>\n<p>PR \u06a9\u06be\u0648\u0644\u06cc\u06ba\u06d4 <strong>\u0686\u06cc\u06a9 \u06a9\u0631\u06cc\u06ba<\/strong> \u0628\u0627\u062a \u06cc\u06c1 \u06c1\u06d2 \u06a9\u06c1 \u06a9\u0627\u0645 \u0627\u0646\u062c\u0627\u0645 \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4 \u067e\u06be\u0631 \u0627\u0646 \u06a9\u0627 \u062c\u0627\u0626\u0632\u06c1 \u0644\u06cc\u06ba\u060c \u0627\u0646\u0636\u0645\u0627\u0645 \u06a9\u0631\u06cc\u06ba\u060c \u0627\u0648\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a \u06a9\u0631\u06cc\u06ba\u06d4 \u0622\u067e \u06a9\u0627 \u06a9\u0627\u0645 \u062e\u0648\u062f \u0628\u062e\u0648\u062f Cloudflare \u06a9\u0648 \u0628\u06be\u06cc\u062c \u062f\u06cc\u0627 \u062c\u0627\u062a\u0627 \u06c1\u06d2\u06d4<\/p>\n<h3 id=\"heading-updating-env-vars-secrets\">\u0645\u0627\u062d\u0648\u0644\u06cc\u0627\u062a\u06cc \u0645\u062a\u063a\u06cc\u0631\u0627\u062a \/ \u0631\u0627\u0632\u0648\u06ba \u06a9\u0648 \u0627\u067e \u0688\u06cc\u0679 \u06a9\u0631\u06cc\u06ba\u06d4<\/h3>\n<pre><code class=\"language-bash\"># Local\nnano .dev.vars\n\n# Production\nwrangler secret put NEXT_PUBLIC_SUPABASE_URL\n# ...etc.\n<\/code><\/pre>\n<h2 id=\"heading-final-thoughts\">\u062d\u062a\u0645\u06cc \u062e\u06cc\u0627\u0644\u0627\u062a<\/h2>\n<p>\u062c\u0628 \u0645\u06cc\u06ba \u0646\u06d2 \u06cc\u06c1 \u06c1\u062c\u0631\u062a \u0634\u0631\u0648\u0639 \u06a9\u06cc \u062a\u0648 \u0645\u06cc\u06ba \u0648\u0631\u0633\u0644 \u06a9\u0648 \u0686\u06be\u0648\u0691\u0646\u06d2 \u0633\u06d2 \u06af\u06be\u0628\u0631\u0627 \u06af\u06cc\u0627 \u062a\u06be\u0627\u06d4 Next.js DX \u0648\u06c1\u0627\u06ba \u0648\u0627\u0642\u0639\u06cc \u0628\u06c1\u062a \u0627\u0686\u06be\u0627 \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u0627\u06cc\u06a9 \u0628\u0627\u0631 \u062c\u0628 \u0622\u067e \u0634\u0648\u0642 \u06a9\u06cc \u0633\u0627\u0626\u0679\u0648\u06ba \u0633\u06d2 \u0622\u06af\u06d2 \u0628\u0691\u06be \u062c\u0627\u062a\u06d2 \u06c1\u06cc\u06ba\u060c Cloudflare \u06a9\u06cc \u0645\u0639\u0627\u0634\u06cc\u0627\u062a \u0627\u0648\u0631 \u06a9\u0646\u0627\u0631\u06d2 \u06a9\u06cc \u06a9\u0627\u0631\u06a9\u0631\u062f\u06af\u06cc \u0642\u0631\u06cc\u0628 \u0646\u06c1\u06cc\u06ba \u0622\u062a\u06cc \u06c1\u06d2\u06d4<\/p>\n<p>\u06a9\u06d2 \u0633\u0627\u062a\u06be <code>@opennextjs\/cloudflare<\/code>\u0688\u0648\u06cc\u0644\u067e\u0631 \u06a9\u0627 \u062a\u062c\u0631\u0628\u06c1 \u0628\u06be\u06cc \u067e\u06a9\u0691\u0627 \u06af\u06cc\u0627\u06d4 <code>pnpm dev<\/code> \u0644\u0648\u067e\u0633 \u0627\u06cc\u06a9 \u062c\u06cc\u0633\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0645\u06cc\u0631\u0627 <code>pnpm preview<\/code> \u067e\u06cc\u062f\u0627\u0648\u0627\u0631 \u06a9\u06cc \u0646\u0642\u0644 \u06a9\u0631\u0646\u0627\u060c <code>git push<\/code> ~90 \u0633\u06cc\u06a9\u0646\u0688 \u0645\u06cc\u06ba \u0639\u0627\u0644\u0645\u06cc \u0633\u0637\u062d \u067e\u0631 \u062a\u0639\u06cc\u0646\u0627\u062a\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u067e\u0631\u0627\u0646\u06d2 Cloudflare Pages + Next.js \u06a9\u06c1\u0627\u0646\u06cc \u06a9\u0648 \u0631\u0648\u06a9\u06d2 \u06c1\u0648\u0626\u06d2 \u06c1\u06cc\u06ba \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u06a9\u0686\u0627 \u062a\u06be\u0627\u060c \u062a\u0648 \u0648\u06c1 \u062f\u0646 \u062e\u062a\u0645 \u06c1\u0648 \u06af\u0626\u06d2 \u06c1\u06cc\u06ba\u06d4 \u0627\u0633 \u06c1\u0641\u062a\u06d2 \u06a9\u06d2 \u0622\u062e\u0631 \u0645\u06cc\u06ba \u0627\u0633 \u0631\u0646 \u0628\u06a9 \u06a9\u0648 \u0633\u0627\u0626\u06cc\u0688 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u067e\u0631 \u0622\u0632\u0645\u0627\u0626\u06cc\u06ba \u0627\u0648\u0631 \u062e\u0648\u062f \u06c1\u06cc \u062f\u06cc\u06a9\u06be\u06cc\u06ba\u06d4<\/p>\n<p>\u0627\u06af\u0631 \u0622\u067e \u06a9\u0648 \u06cc\u06c1 \u0645\u0641\u06cc\u062f \u0645\u0639\u0644\u0648\u0645 \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u062a\u0648\u060c \u0645\u06a9\u0645\u0644 \u0630\u062e\u06cc\u0631\u06c1 \u06cc\u06c1\u0627\u06ba \u06c1\u06d2\u06d4 \u0634\u0631\u0648\u0639 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0627\u0633\u06d2 \u0688\u067e\u0644\u06cc\u06a9\u06cc\u0679 \u06a9\u0631\u0646\u06d2 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0622\u0632\u0627\u062f \u0645\u062d\u0633\u0648\u0633 \u06a9\u0631\u06cc\u06ba\u06d4<\/p>\n<p>\u0645\u0628\u0627\u0631\u06a9 \u0634\u067e\u0646\u06af.<\/p>\n<p>&#8211; <em>\u0637\u0627\u0631\u0642\u0648\u0644<\/em><\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0645\u06cc\u06ba \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 Postgres \u06a9\u06d2 \u0633\u0627\u062a\u06be \u062a\u0635\u062f\u06cc\u0642 \u06a9\u06d2 \u0644\u06cc\u06d2 Next.js 14 (App Router) \u0627\u0648\u0631 Supabase \u06a9\u0627 \u0627\u0633\u062a\u0639\u0645\u0627\u0644 \u06a9\u0631\u062a\u06d2 \u06c1\u0648\u0626\u06d2 \u067e\u0631\u0648\u062c\u06cc\u06a9\u0679 \u0628\u0646\u0627\u062a\u0627 \u06c1\u0648\u06ba\u06d4 Next.js \u0627\u06cc\u067e\u0633 \u06a9\u06d2 \u0644\u06cc\u06d2 \u0688\u06cc\u0641\u0627\u0644\u0679 \u0688\u0633\u0679\u0631\u06cc \u0628\u06cc\u0648\u0634\u0646 \u06a9\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u0639\u0627\u0645 \u0637\u0648\u0631 \u067e\u0631 Vercel \u06c1\u0648\u062a\u0627 \u06c1\u06d2 \u06a9\u06cc\u0648\u0646\u06a9\u06c1 \u06cc\u06c1 \u0627\u06cc\u06a9 \u0628\u06c1\u062a\u0631\u06cc\u0646 \u0688\u0648\u06cc\u0644\u067e\u0631 \u062a\u062c\u0631\u0628\u06c1 \u0641\u0631\u0627\u06c1\u0645 \u06a9\u0631\u062a\u0627 \u06c1\u06d2\u06d4 \u0644\u06cc\u06a9\u0646 \u062a\u0642\u0631\u06cc\u0628\u0627\u064b \u0627\u06cc\u06a9 \u06c1\u0641\u062a\u06d2 \u062a\u06a9 \u062f\u0648\u0646\u0648\u06ba \u067e\u0644\u06cc\u0679 \u0641\u0627\u0631\u0645\u0632 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-23254","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts\/23254","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/comments?post=23254"}],"version-history":[{"count":0,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/posts\/23254\/revisions"}],"wp:attachment":[{"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/media?parent=23254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/categories?post=23254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/umang.pk\/ur\/wp-json\/wp\/v2\/tags?post=23254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}