Oddiy usulda joylangan Next.js loyihasi serverda butun node_modules papkasini talab qiladi. Bu papkada build uchun kerak bo'lgan, lekin ishlash vaqtida hech qachon ishlatilmaydigan yuzlab paketlar bor: TypeScript, linterlar, test kutubxonalari va boshqalar. Kichik VPS'da bu disk joyini egallaydi, deploy vaqtini uzaytiradi va Docker image'larini og'irlashtiradi. Next.js'ning standalone rejimi aynan shu muammoni hal qiladi: build vaqtida u ilova haqiqatan ishlatadigan fayllarni kuzatib, ularni alohida papkaga yig'adi.
Standalone rejim qanday ishlaydi
Build paytida Next.js har bir sahifa va API route qaysi modullarni import qilishini tahlil qiladi. Standalone yoqilgan bo'lsa, natijada .next/standalone papkasi paydo bo'ladi. Uning ichida minimal server.js fayli va faqat zarur paketlardan iborat qisqartirilgan node_modules bo'ladi. Bu papka next start buyrug'iga muhtoj emas, u oddiy node server.js bilan ishga tushadi. Shu sababli serverga butun loyihani emas, faqat shu papkani ko'chirish kifoya.
Standalone'ni yoqish
Sozlash bitta qatordan iborat. Loyihaning next.config.js yoki next.config.mjs fayliga output parametrini qo'shing va build'ni qayta bajaring.
// next.config.mjs
const nextConfig = {
output: "standalone",
};
export default nextConfig;
npm ci
npm run build
ls .next/standalone
Build tugagach, .next/standalone papkasida server.js, package.json, node_modules va .next ichki papkasini ko'rasiz. Hajmni solishtirish uchun du -sh node_modules .next/standalone buyrug'ini bajarib ko'ring, farq loyihaga qarab har xil bo'ladi, lekin odatda sezilarli.
Eng ko'p unutiladigan qadam: public va static
Standalone papkasiga ikki narsa avtomatik qo'shilmaydi: public papkasi va .next/static ichidagi CSS, JavaScript bo'laklari. Next.js bu fayllarni ataylab tashlab ketadi, chunki ularni Nginx yoki CDN orqali to'g'ridan-to'g'ri berish samaraliroq deb hisoblaydi. Agar ularni ko'chirmasangiz, sayt ochiladi, lekin dizaynsiz, rasmlarsiz va tugmalar ishlamaydigan holda bo'ladi. Ko'pchilik birinchi marta aynan shu yerda adashadi.
cp -r public .next/standalone/
cp -r .next/static .next/standalone/.next/
Bu ikki buyruqni build skriptiga qo'shib qo'yish yaxshi odat, shunda keyingi deploy'larda ular unutilmaydi. package.json da shunday yozish mumkin.
"scripts": {
"build": "next build",
"postbuild": "cp -r public .next/standalone/ && cp -r .next/static .next/standalone/.next/"
}
Serverda ishga tushirish
Standalone server port va manzilni muhit o'zgaruvchilari orqali oladi. PORT qaysi portda tinglashni, HOSTNAME esa qaysi manzilda tinglashni belgilaydi. Nginx orqasida ishlatilganda 127.0.0.1 ni ko'rsatish xavfsizroq, Docker ichida esa 0.0.0.0 kerak bo'ladi.
cd /var/www/misol-next/.next/standalone
PORT=3000 HOSTNAME=127.0.0.1 NODE_ENV=production node server.js
Doimiy ishlashi uchun PM2 ecosystem fayli qulay. U ilovani fonda ushlaydi, yiqilsa qayta ko'taradi va xotira chegarasidan oshsa qayta ishga tushiradi.
// ecosystem.config.js
module.exports = {
apps: [{
name: "misol-next",
cwd: "/var/www/misol-next/.next/standalone",
script: "server.js",
max_memory_restart: "400M",
env: { NODE_ENV: "production", PORT: 3000, HOSTNAME: "127.0.0.1" }
}]
};
Build'ni serverdan tashqarida qilish
Standalone rejimning eng katta afzalligi shundaki, build'ni kuchli kompyuterda yoki CI'da bajarib, serverga tayyor papkani yuborish mumkin. Kichik VPS build paytida xotira yetishmasligidan qiynalmaydi, server faqat tayyor ilovani ishlatadi. Muhim shart bitta: build qilinadigan mashinaning operatsion tizimi va protsessor arxitekturasi server bilan mos bo'lishi kerak, chunki ba'zi paketlarda, masalan rasmlarni qayta ishlovchi sharp'da, platformaga bog'liq binar fayllar bor.
npm run build
tar -czf release.tar.gz -C .next/standalone .
scp release.tar.gz deploy@example.uz:/var/www/misol-next/releases/
Docker bilan ishlatish
Docker'da standalone ayniqsa foydali, chunki yakuniy image'da faqat ishlash uchun kerakli fayllar qoladi. Quyida ko'p bosqichli Dockerfile'ning soddalashtirilgan varianti keltirilgan. Birinchi bosqichda build bajariladi, ikkinchisida esa faqat natija ko'chiriladi.
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine
WORKDIR /app
ENV NODE_ENV=production PORT=3000 HOSTNAME=0.0.0.0
COPY --from=build /app/.next/standalone ./
COPY --from=build /app/.next/static ./.next/static
COPY --from=build /app/public ./public
EXPOSE 3000
CMD ["node", "server.js"]
Amaliy misol: Namangandagi mebel do'koni
Namangandagi mebel do'koni katalog saytini Next.js'da ishlatadi va uni 1 GB xotirali kichik VPS'da ushlaydi. Avval build to'g'ridan-to'g'ri serverda bajarilardi va har safar xotira tugab, sayt bir necha daqiqa ishlamay qolardi. Standalone rejimga o'tgandan keyin build dasturchining kompyuterida bajariladi, serverga faqat tayyor arxiv yuboriladi va PM2 ilovani qayta yuklaydi. Serverda endi butun node_modules o'rniga faqat kerakli paketlar turadi, deploy esa bir daqiqadan kamroq vaqt oladi.
Tez-tez uchraydigan muammolar
- Sayt dizaynsiz ochiladi:
.next/staticko'chirilmagan. - Rasmlar va favicon 404 beradi:
publicpapkasi ko'chirilmagan. - Docker'da sayt tashqaridan ochilmaydi:
HOSTNAME=0.0.0.0berilmagan. - Muhit o'zgaruvchilari ishlamaydi:
.envfayllari standalone papkasiga avtomatik tushmaydi, ularni serverda alohida bering.
Kam resursli serverda Next.js ishlatmoqchi bo'lsangiz, sayt.uz kabinetidan kichik VPS olib, standalone rejim bilan boshlash yaxshi variant. Resurs yetmay qolsa, tarifni keyinchalik kattalashtirish mumkin.