قسمت بیست و هشتم - استقرار کامل پروژه Next.js روی Vercel
در این قسمت میخواهیم پروژه را بهصورت کامل روی Vercel deploy کنیم. اما قبل از deploy، یک مرحله مهم داریم: آمادهسازی پروژه و commit کردن آن روی Git.
#استقرار کامل پروژه Next.js روی Vercel
در قسمت قبل، دیتابیس پروژه را روی Neon آماده کردیم و یاد گرفتیم چطور Prisma را به یک دیتابیس PostgreSQL واقعی متصل کنیم.
حالا پروژه ما از نظر دیتابیس production-ready شده و وقت آن رسیده که نسخه آنلاین پروژه را منتشر کنیم.
در این قسمت میخواهیم پروژه را بهصورت کامل روی Vercel deploy کنیم.
اما قبل از deploy، یک مرحله مهم داریم: آمادهسازی پروژه و commit کردن آن روی Git.
هدف این قسمت
در پایان این قسمت:
- پروژه را برای commit آماده میکنید
- فایلهای حساس را از Git خارج نگه میدارید
- پروژه را روی GitHub قرار میدهید
- پروژه را به Vercel متصل میکنید
- envهای production را در Vercel تنظیم میکنید
- migrationهای Prisma را برای production اعمال میکنید
- deploy نهایی را تست میکنید
چرا قبل از Vercel باید Git را آماده کنیم؟
Vercel معمولاً پروژه را مستقیم از یک repository مثل GitHub, GitLab یا Bitbucket deploy میکند.
یعنی روند معمول این است:
Local Project → Git Repository → GitHub → Vercel
پس قبل از اینکه سراغ Vercel برویم، باید مطمئن شویم پروژه به شکل درست commit شده است.
مرحله ۱: بررسی وضعیت پروژه
اول در ریشه پروژه، وضعیت فایلها را بررسی کنید:
git status
اگر پروژه هنوز Git repository نیست، باید Git را initialize کنید:
git init
بعد دوباره وضعیت را ببینید:
git status
مرحله ۲: بررسی .gitignore
قبل از commit کردن، بسیار مهم است که فایلهای حساس وارد Git نشوند.
فایل .gitignore باید حداقل این موارد را داشته باشد:
node_modules
.next
.env
.env.local
.env.*.local
.vercel
اگر از Prisma استفاده میکنید، معمولاً پوشه migrationها باید commit شوند:
prisma/migrations
یعنی migrationها را در .gitignore نگذارید، چون برای production لازم هستند.
نکته امنیتی مهم درباره envها
هیچوقت این فایلها را commit نکنید:
.env
.env.local
.env.production
چون ممکن است داخل آنها اطلاعات حساس باشد، مثل:
DATABASE_URL=...
CLOUDINARY_API_SECRET=...
SESSION_SECRET=...
ADMIN_PASSWORD=...
اگر قبلاً یکی از این فایلها را commit کردهاید، فقط حذف کردن فایل کافی نیست.
باید secretهای داخل آن را تغییر دهید، چون ممکن است لو رفته باشند.
مرحله ۳: آمادهسازی فایل نمونه env
برای اینکه خودتان یا افراد دیگر بدانند چه envهایی لازم است، بهتر است یک فایل نمونه بسازید:
.env.example
مثلاً:
DATABASE_URL=""
DIRECT_URL=""
CLOUDINARY_CLOUD_NAME=""
CLOUDINARY_API_KEY=""
CLOUDINARY_API_SECRET=""
SITE_URL=""
SESSION_SECRET=""
ADMIN_EMAIL=""
ADMIN_PASSWORD=""
این فایل مقدار واقعی ندارد و میتواند commit شود.
مرحله ۴: نصب و تست local قبل از commit
قبل از اینکه پروژه را commit کنید، بهتر است یک بار نصب و build را بررسی کنید:
npm install
npm run build
اگر پروژه build نشود، احتمالاً روی Vercel هم deploy نمیشود.
اگر build درست بود، اجرای production را هم تست کنید:
npm start
بعد routeهای مهم را دستی بررسی کنید:
/
/blog
/projects
/admin/login
/admin
/admin/projects
/admin/posts
مرحله ۵: اضافه کردن فایلها به Git
حالا فایلها را stage کنید:
git add .
بعد دوباره وضعیت را بررسی کنید:
git status
مطمئن شوید فایلهای حساس مثل .env یا .env.local داخل لیست staged files نیستند.
اگر اشتباهی stage شده بودند، آنها را خارج کنید:
git restore --staged .env
git restore --staged .env.local
مرحله ۶: commit کردن پروژه
حالا اولین commit یا commit جدید را بسازید:
git commit -m "Prepare project for production deploy"
اگر این اولین commit پروژه است، میتوانید پیام سادهتری هم بنویسید:
git commit -m "Initial commit"
مرحله ۷: ساخت repository در GitHub
وارد GitHub شوید و یک repository جدید بسازید.
مثلاً نام repository:
next-portfolio
هنگام ساخت repository، اگر پروژه را قبلاً در local ساختهاید، بهتر است گزینههای زیر را فعال نکنید:
- README
.gitignore- license
چون این فایلها ممکن است از قبل در پروژه شما وجود داشته باشند.
مرحله ۸: اتصال پروژه local به GitHub
بعد از ساخت repository، GitHub چند دستور به شما میدهد.
معمولاً چیزی شبیه این است:
git remote add origin https://github.com/username/next-portfolio.git
git branch -M main
git push -u origin main
بعد از اجرای این دستورات، کد پروژه روی GitHub قرار میگیرد.
مرحله ۹: ورود به Vercel
حالا وارد Vercel شوید.
بهترین حالت این است که با همان حساب GitHub وارد شوید تا Vercel بتواند repositoryهای شما را بخواند.
بعد از ورود، روی گزینه import project یا add new project کلیک کنید.
مرحله ۱۰: Import کردن repository در Vercel
در صفحه Import، repository پروژه را انتخاب کنید.
مثلاً:
next-portfolio
Vercel معمولاً خودش تشخیص میدهد پروژه Next.js است.
تنظیمات پیشفرض معمولاً اینطور هستند:
Framework Preset: Next.js
Build Command: next build
Output Directory: .next
Install Command: npm install
در بیشتر پروژههای Next.js نیازی نیست این موارد را تغییر دهید.
مرحله ۱۱: تنظیم envها در Vercel
قبل از deploy، باید envهای production را در Vercel وارد کنید.
در بخش Environment Variables، مقادیر لازم را اضافه کنید.
برای پروژه ما معمولاً این envها مهماند:
DATABASE_URL=...
DIRECT_URL=...
CLOUDINARY_CLOUD_NAME=...
CLOUDINARY_API_KEY=...
CLOUDINARY_API_SECRET=...
SITE_URL=https://your-domain.vercel.app
SESSION_SECRET=...
ADMIN_EMAIL=...
ADMIN_PASSWORD=...
نکته مهم: مقدار SITE_URL باید آدرس production باشد.
در deploy اول ممکن است هنوز دامنه نهایی را ندانید.
میتوانید بعد از اولین deploy، دامنه Vercel را بردارید و مقدار SITE_URL را آپدیت کنید.
مرحله ۱۲: تنظیم DATABASE_URL برای Neon
از قسمت قبل میدانیم که برای Neon معمولاً دو connection string داریم:
DATABASE_URL="postgresql://...pooler.../neondb?sslmode=require"
DIRECT_URL="postgresql://...neon.tech/neondb?sslmode=require"
پیشنهاد رایج:
DATABASE_URL: اتصال pooledDIRECT_URL: اتصال direct
در schema.prisma هم باید چیزی شبیه این داشته باشید:
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_URL")
}
مرحله ۱۳: نکته مهم درباره Prisma Client در Vercel
برای اینکه Prisma Client در زمان build درست generate شود، بهتر است اسکریپت build را در package.json بررسی کنید.
حالت ساده:
{
"scripts": {
"build": "next build"
}
}
در بسیاری از پروژهها همین کافی است.
اما اگر در Vercel با خطای Prisma Client مواجه شدید، میتوانید build script را اینطور تغییر دهید:
json
{
"scripts": {
"build": "prisma generate && next build"
}
}
این کار باعث میشود قبل از build، Prisma Client ساخته شود.
مرحله ۱۴: اجرای migration در production
یک نکته مهم:
Vercel بهصورت خودکار migrationهای Prisma را برای شما اجرا نمیکند، مگر اینکه خودتان تنظیم کنید.
برای production باید migrationها با این دستور اعمال شوند:
npx prisma migrate deploy
چند روش برای انجام این کار وجود دارد.
روش ۱: اجرای migration از سیستم local روی دیتابیس production
اگر envهای local شما به دیتابیس Neon production وصل هستند، میتوانید از سیستم خودتان اجرا کنید:
npx prisma migrate deploy
این دستور migrationهای موجود در prisma/migrations را روی دیتابیس Neon اعمال میکند.
بعد از آن، Vercel فقط اپلیکیشن را deploy میکند.
این روش برای شروع ساده و قابل فهم است.
روش ۲: اضافه کردن migration به build command
میتوانید build script را اینطور بنویسید:
{
"scripts": {
"build": "prisma migrate deploy && prisma generate && next build"
}
}
اما این روش همیشه بهترین انتخاب نیست.
چرا؟
چون هر بار deploy اجرا میشود، migration هم بررسی میشود.
اگر migrationها درست مدیریت نشوند، ممکن است deploy شما به مشکل بخورد.
بهتر این است:
اول migration را دستی روی Neon اجرا کنیم
بعد پروژه را روی Vercel deploy کنیم
یعنی:
npx prisma migrate deploy
git push
بعد Vercel با push جدید deploy را انجام میدهد.
مرحله ۱۵: اولین deploy در Vercel
بعد از تنظیم envها، روی Deploy کلیک کنید.
Vercel مراحل زیر را انجام میدهد:
- نصب dependencyها
- اجرای build
- ساخت خروجی production
- انتشار پروژه روی دامنه Vercel
اگر همهچیز درست باشد، در پایان یک URL میگیرید، مثلاً:
https://next-portfolio.vercel.app
مرحله ۱۶: آپدیت کردن SITE_URL
بعد از اینکه URL پروژه را گرفتید، به تنظیمات پروژه در Vercel برگردید و مقدار SITE_URL را دقیق تنظیم کنید:
SITE_URL=https://next-portfolio.vercel.app
اگر از NEXT_PUBLIC_SITE_URL استفاده کردهاید، آن را هم تنظیم کنید:
NEXT_PUBLIC_SITE_URL=https://next-portfolio.vercel.app
بعد از تغییر env، باید redeploy انجام دهید.
مرحله ۱۷: Redeploy بعد از تغییر env
در Vercel بعد از تغییر envها، باید deployment جدید بسازید.
دو روش دارید:
روش ۱
از پنل Vercel گزینه Redeploy را بزنید.
روش ۲
یک commit کوچک بزنید و push کنید:
git commit --allow-empty -m "Trigger redeploy"
git push
مرحله ۱۸: تست سایت بعد از deploy
بعد از deploy، فقط دیدن صفحه اصلی کافی نیست.
باید مسیرهای مهم را تست کنید.
صفحات عمومی
/
/blog
/projects
/blog/[slug]
/projects/[slug]
صفحات ادمین
/admin/login
/admin
/admin/projects
/admin/posts
عملیات مهم
- لاگین ادمین
- ساخت پروژه
- ویرایش پروژه
- حذف پروژه
- ساخت پست
- ویرایش پست
- حذف پست
- آپلود تصویر
- نمایش تصویر در صفحه عمومی
مرحله مهم
- لاگین ادمین
- ساخت پروژه
- ویرایش پروژه
- حذف پروژه
- ساخت پست
- ویرایش پست
- حذف پست
- آپلود تصویر
- نمایش تصویر در صفحه عمومی
مرحله ۱۹: بررسی Cloudinary در production
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'res.cloudinary.com',
},
],
},
}
export default nextConfig
مرحله ۲۰: بررسی لاگهای Vercel
اگر deploy یا اجرای سایت خطا داد، اولین جایی که باید بررسی کنید logs است.
در Vercel:
Project → Deployments → Select Deployment → Logs
یا برای خطاهای runtime:
Project → Logs
در logs معمولاً میتوانید خطاهایی مثل اینها را ببینید:
- env missing
- Prisma connection error
- build error
- route handler error
- image config error
خطاهای رایج در deploy روی Vercel
خطای ۱: env تعریف نشده
مثلاً:
Missing required environment variable: DATABASE_URL
راهحل:
- Environment Variables را در Vercel بررسی کنید
- نام env را دقیق مطابق کد وارد کنید
- بعد redeploy بزنید
خطای ۲: Prisma Client ساخته نشده
نمونه خطا:
PrismaClientInitializationError
یا:
@prisma/client did not initialize yet
راهحل:
در package.json:
{
"scripts": {
"build": "prisma generate && next build"
}
}
بعد commit و push کنید:
git add package.json
git commit -m "Generate Prisma client before build"
git push
خطای ۳: جدولها در دیتابیس وجود ندارند
نمونه مشکل:
The table `public.Post` does not exist
دلیل:
migrationها روی Neon اعمال نشدهاند.
راهحل:
npx prisma migrate deploy
خطای ۴: تصویر Cloudinary نمایش داده نمیشود
دلیلهای رایج:
remotePatternsتنظیم نشدهnext.config.tsبعد از تغییر redeploy نشده- URL تصویر اشتباه ذخیره شده
راهحل:
- config را اصلاح کنید
- commit و push کنید
- redeploy بزنید
خطای ۵: لاگین در production کار نمیکند
دلیلهای رایج:
SESSION_SECRETدر Vercel تعریف نشده- cookie برای HTTPS درست تنظیم نشده
- آدرس redirect اشتباه است
- env مربوط به auth متفاوت است
راهحل:
- envهای auth را بررسی کنید
- تنظیمات cookie و session را با production هماهنگ کنید
- logs را بررسی کنید
مرحله ۲۱: اتصال دامنه اختصاصی
اگر دامنه اختصاصی دارید، میتوانید در Vercel اضافه کنید:
Project → Settings → Domains
بعد دامنه را وارد میکنید و Vercel تنظیمات DNS لازم را نشان میدهد.
بعد از اتصال دامنه، مقدار SITE_URL را هم تغییر دهید:
SITE_URL=https://your-domain.com
و دوباره redeploy بزنید.
مرحله ۲۲: روند deploy بعدی چطور است؟
بعد از setup اولیه، روند توسعه خیلی ساده میشود:
تغییر کد → commit → push → deploy خودکار در Vercel
مثلاً:
git add .
git commit -m "Update admin projects page"
git push
بعد از push، Vercel بهصورت خودکار build و deploy جدید را شروع میکند.
مرحله ۲۳: چکلیست قبل از deploy نهایی
قبل از اینکه پروژه را نهایی بدانید، این موارد را بررسی کنید:
-
.envو.env.localcommit نشدهاند -
.env.exampleساخته شده - پروژه روی GitHub push شده
- repository در Vercel import شده
- همه envها در Vercel تنظیم شدهاند
-
DATABASE_URLوDIRECT_URLدرست هستند - migrationها روی Neon اعمال شدهاند
- Prisma Client در build ساخته میشود
-
SITE_URLمقدار production دارد - Cloudinary envها تنظیم شدهاند
-
next.config.tsبرای Cloudinary تنظیم شده - deploy بدون خطا انجام شده
- routeهای public تست شدهاند
- routeهای admin تست شدهاند
- CRUD پروژه و پست تست شدهاند
- آپلود تصویر تست شده
- metadata و Open Graph بررسی شدهاند
فایلهایی که در این قسمت مهم هستند
در این قسمت با این فایلها بیشتر سروکار داریم:
.gitignore
.env
.env.example
package.json
prisma/schema.prisma
prisma/migrations/
next.config.ts
نمونه نهایی .gitignore
برای این پروژه، .gitignore میتواند چیزی شبیه این باشد:
node_modules
.next
out
.vercel
.env
.env.local
.env.*.local
.DS_Store
npm-debug.log*
نمونه envهای لازم در Vercel
DATABASE_URL=""
DIRECT_URL=""
CLOUDINARY_CLOUD_NAME=""
CLOUDINARY_API_KEY=""
CLOUDINARY_API_SECRET=""
SITE_URL=""
SESSION_SECRET=""
ADMIN_EMAIL=""
ADMIN_PASSWORD=""
مقادیر واقعی را فقط در Vercel و local نگه دارید، نه داخل repository.
جمعبندی
در این قسمت، پروژه Next.js را برای انتشار واقعی آماده کردیم و روند کامل deploy روی Vercel را یاد گرفتیم.
کارهایی که انجام دادیم:
- پروژه را برای Git آماده کردیم
.gitignoreو.env.exampleرا بررسی کردیم- پروژه را commit و روی Git کردیم
- migrationهای Prisma را روی Vercel import کردیم
- envهای production را تنظیم کردیم
- migrationهای Prisma را روی Neon اعمال کردیم
- deploy را انجام دادیم
- routeهای اصلی، admin، CRUD و آپلود تصویر را تست کردیم
از اینجا به بعد، هر بار که تغییری در پروژه ایجاد کنید، کافی است:
git add .
git commit -m "Your message"
git push
و Vercel بهصورت خودکار نسخه جدید پروژه را deploy میکند.