Next.js همانطور که نوشتهاید
بیلدپک سکو کلود وابستگی next را در package.json پیدا میکند و پروژه را بهعنوان Next.js میشناسد. اگر در next.config گزینهی output: 'standalone' را فعال کرده باشید، فقط خروجی standalone و فایلهای static به ایمیج نهایی میرود و برنامه با node server.js اجرا میشود؛ در غیر این صورت next start اجرا میشود.
صفحههای SSR، ISR، Middleware، Route Handler و Server Action روی سرور Node.js اجرا میشوند و نیازی به سرویس جداگانه ندارند. اگر پروژه را با output: 'export' کاملاً استاتیک ساختهاید، پوشهی out بهعنوان سایت استاتیک سرو میشود.
مناسب برای
- فروشگاه و سایت محتوایی با SSR و ISR
- داشبورد و پنل با App Router
- API کنار رابط کاربری با Route Handler
- لندینگ کاملاً استاتیک با output: 'export'
مسیر بیلد Next.js
تشخیص
وابستگی
nextدرpackage.jsonو لاکفایل در ریشه."next": "15.x"نصب
پکیجمنیجر از روی لاکفایل انتخاب میشود.
npm ciبیلد
اسکریپت build اجرا میشود و کش
.next/cacheبین بیلدها نگه داشته میشود.next buildاجرا
در حالت standalone فقط خروجی لازم کپی و با
server.jsاجرا میشود.node server.js
خروجی یک استقرار واقعی
sakoocloud deploy ✔ Packed 3.2MB ✔ Source uploaded ℹ Build started · dep_7k2m9q #4 [builder 1/6] FROM node:22-alpine #6 [builder 3/6] RUN npm ci #8 [builder 4/6] RUN npm run build #10 [stage-1 3/4] COPY .next/standalone ./ #12 exporting to image ✔ Deployed — app is running. → https://my-site.sakooapps.ir
تنظیم پیشنهادی
خروجی standalone را روشن کنید و مطمئن شوید سرور روی 0.0.0.0 و پورت PORT بالا میآید.
/** @type {import('next').NextConfig} */
const nextConfig = {
output: "standalone",
};
export default nextConfig;
{
"scripts": {
"build": "next build",
"start": "next start -H 0.0.0.0 -p ${PORT:-3000}"
}
}
sakoocloud apps create --name my-site --runtime nextjs --port 3000
sakoocloud deploy
تنظیمات
حالتهای خروجی Next.js
| تنظیم در next.config | روی سکو کلود |
|---|---|
output: "standalone" | ایمیج سبک، اجرا با node server.js (پیشنهادی) |
| بدون output | اجرا با next start |
output: "export" | سایت استاتیک از پوشهی out، سرو با nginx |
نسخهی Node.js
نسخههای 24، 22 و 20 (LTS) در دسترساند. اگر پروژه نسخهای اعلام نکند، Node.js 22 استفاده میشود.
| از کجا خوانده میشود | نمونه |
|---|---|
.nvmrc یا .node-version | 22 |
engines.node در package.json | "node": "22.x" |
mise.toml یا .tool-versions | node = "22" |
فلگ --runtime-version در CLI | --runtime-version 22 |
پکیجمنیجر
ابزار از روی لاکفایل انتخاب میشود و نصب همیشه دقیقاً همان نسخههای قفلشده را میگیرد.
| لاکفایل | ابزار | دستور نصب |
|---|---|---|
package-lock.json | npm | npm ci |
yarn.lock | yarn | yarn install --frozen-lockfile |
pnpm-lock.yaml | pnpm | pnpm install --frozen-lockfile |
اتصال به دیتابیس
دیتابیس لینکشده DATABASE_URL را به محیط اپ میدهد. اگر از Prisma استفاده میکنید، prisma generate را جلوی next build بگذارید.
sakoocloud apps link-db <db-id> --app my-site
{
"scripts": {
"build": "prisma generate && next build"
}
}
import { PrismaClient } from "@prisma/client";
export const db = new PrismaClient();
دیتابیسهایی که معمولاً کنارش میآیند
همراه هر استقرار
اینها به رانتایم بستگی ندارند و برای هر اپ روی سکو کلود فعالاند. بعضی، مثل مقیاسدهی خودکار و کرانجاب، به پلن بستگی دارند.
- دامنهی اختصاصی و SSLدامنه را اضافه کنید؛ گواهی خودکار صادر و تمدید میشود.
- متغیرهای محیطی و سکرتمقادیر رمزگذاریشده فقط در زمان اجرا به اپ میرسند.
- مرحلهی انتشارmigration بعد از بیلد و پیش از جایگزینی نسخهی قبلی اجرا میشود.
- لاگ زندهلاگ بیلد و زمان اجرا، در CLI و کنسول.
- بازگشت به نسخهی قبلهر استقرار قبلی با یک دستور برمیگردد.
- مقیاسدهیمنابع و تعداد نمونهها را تغییر دهید یا خودکارش کنید.
- دیسک ماندگاربرای فایلهایی که باید بعد از هر استقرار بمانند.
- کرانجابدستور زمانبندیشده با همان ایمیج و متغیرها.
- استقرار خودکار با گیتهر push روی شاخهی هدف بیلد و مستقر میشود.
خطاهای رایج
اپ بالا نمیآید یا مدام ریاستارت میشود
علتnext start بهطور پیشفرض فقط روی localhost گوش میدهد.
راهحلپورت را از PORT بخوانید و روی 0.0.0.0 گوش بدهید.
"start": "next start -H 0.0.0.0 -p ${PORT:-3000}"
متغیر NEXT_PUBLIC_ در مرورگر خالی است
علتمتغیرهای NEXT_PUBLIC_ در زمان بیلد داخل باندل قرار میگیرند، نه در زمان اجرا.
راهحلمتغیر را با --build-time تعریف کنید و دوباره مستقر کنید.
sakoocloud env set NEXT_PUBLIC_API_URL=https://api.example.com --build-time
sakoocloud deploy
تصویرها یا فایلهای public در standalone لود نمیشوند
علتخروجی standalone پوشههای public و .next/static را خودش ندارد.
راهحلبیلدپک سکو کلود این دو پوشه را کنار server.js کپی میکند؛ اگر Dockerfile خودتان را دارید، همین کار را در آن انجام دهید.
نصب وابستگیها در بیلد شکست میخورد
علتلاکفایل در مخزن نیست یا با package.json همخوان نیست. محیط بیلد به اینترنت عمومی وصل نیست و بستهها را از میرور داخلی سکو کلود میگیرد، پس نصب فقط با نسخههای قفلشده قابل تکرار است.
راهحللاکفایل را کامیت کنید و دوباره مستقر کنید.
پاد با OOMKilled متوقف میشود
علتمصرف حافظه از سقف منابع اپ بیشتر شده است.
راهحلحافظه را بیشتر کنید یا مصرف برنامه را پایین بیاورید.
sakoocloud apps scale --memory 1Gi
پرسشهای متداول
Server Action و Middleware کار میکنند؟
بله. برنامه روی سرور Node.js اجرا میشود و همهی قابلیتهای سمت سرور Next.js در دسترس است.
ISR و revalidate پشتیبانی میشوند؟
بله. revalidate روی همان سرور انجام میشود. اگر چند نمونه اجرا میکنید، برای کش مشترک بین نمونهها از یک ذخیرهساز مشترک مثل Redis استفاده کنید.
output: 'standalone' لازم است؟
لازم نیست، ولی ایمیج را بسیار کوچکتر و استقرار را سریعتر میکند. بدون آن، next start اجرا میشود.
پروژهی export استاتیک را کجا مستقر کنم؟
همینجا. با output: 'export' پوشهی out ساخته و با nginx سرو میشود؛ outputDir را در sakoocloud.json روی out بگذارید.
جزئیات بیشتر در راهنمای Next.js در مستندات و مرجع CLI.