از package.json تا آدرس زنده
برای اجرای یک سرویس Node.js معمولاً باید سرور آماده کنید، نسخهی Node را نصب کنید، PM2 یا systemd را تنظیم کنید و گواهی SSL بگیرید. در سکو کلود همهی اینها از روی خود پروژه تعیین میشود: نسخه از .nvmrc یا engines، پکیجمنیجر از لاکفایل، و دستور اجرا از اسکریپت start.
Express، Fastify، Koa، NestJS و هر سرور HTTP دیگری که روی پورت PORT گوش بدهد بدون تغییر اجرا میشود. پروژههای TypeScript هم پشتیبانی میشوند: اسکریپت build اجرا میشود و فقط خروجی کامپایلشده و node_modules به ایمیج نهایی میرود.
مناسب برای
- API با Express، Fastify یا NestJS
- بکاند اپ موبایل و وب
- وبهوک، ربات و پردازش پسزمینه
- سرور WebSocket روی endpoint جدا
سکو کلود با پروژهی شما چه میکند
تشخیص
package.jsonو یکی از لاکفایلها در ریشه یعنی Node.js. اگر Dockerfile در ریشه باشد، همان اولویت دارد.package.json · package-lock.jsonنصب
پکیجمنیجر از روی لاکفایل انتخاب میشود و نصب از میرور داخلی سکو کلود انجام میشود.
npm ciبیلد
اگر اسکریپت build تعریف شده باشد اجرا میشود؛ مثلاً کامپایل TypeScript.
npm run buildاجرا
اسکریپت start اجرا میشود و ترافیک HTTPS به پورت
PORTمیرسد.npm start
خروجی یک استقرار واقعی
sakoocloud deploy ✔ Packed 1.4MB ✔ Source uploaded ℹ Build started · dep_7k2m9q #4 [build 1/5] FROM node:22-alpine #6 [build 3/5] RUN npm ci #8 [build 4/5] RUN npm run build #10 exporting to image ✔ Deployed — app is running. → https://my-api.sakooapps.ir
کمترین چیزی که لازم دارید
دو قانون: برنامه روی پورتی که در PORT میآید و روی 0.0.0.0 گوش بدهد، و package.json اسکریپت start داشته باشد.
import express from "express";
const app = express();
const port = process.env.PORT || 3000;
app.get("/health", (req, res) => res.json({ ok: true }));
app.listen(port, "0.0.0.0", () => {
console.log(`listening on ${port}`);
});
{
"type": "module",
"scripts": {
"start": "node index.js"
},
"engines": { "node": "22.x" }
}
sakoocloud apps create --name my-api --runtime nodejs --port 3000
sakoocloud deploy
تنظیمات
نسخهی 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 |
فلگهای کاربردی هنگام ساخت اپ
| فلگ | کاربرد |
|---|---|
--runtime-version | قفل کردن نسخهی toolchain، مثلاً 22 یا 3.12 |
--root-dir | استقرار یک پوشه از مونوریپو |
--env-file | بارگذاری متغیرهای محیطی از فایل .env بعد از ساخت اپ |
--endpoint | یک endpoint دیگر روی پورت جدا، مثلاً 8000:/ws:websocket |
اتصال به دیتابیس
دیتابیس را به اپ لینک کنید؛ متغیرهای DATABASE_URL، DATABASE_HOST و بقیه به محیط اپ تزریق میشوند و اپ دوباره مستقر میشود. رمز عبور هیچجا در کد نمیآید.
sakoocloud apps link-db <db-id> --app my-app
import pg from "pg";
export const pool = new pg.Pool({
connectionString: process.env.DATABASE_URL,
});
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
دیتابیسهایی که معمولاً کنارش میآیند
همراه هر استقرار
اینها به رانتایم بستگی ندارند و برای هر اپ روی سکو کلود فعالاند. بعضی، مثل مقیاسدهی خودکار و کرانجاب، به پلن بستگی دارند.
- دامنهی اختصاصی و SSLدامنه را اضافه کنید؛ گواهی خودکار صادر و تمدید میشود.
- متغیرهای محیطی و سکرتمقادیر رمزگذاریشده فقط در زمان اجرا به اپ میرسند.
- مرحلهی انتشارmigration بعد از بیلد و پیش از جایگزینی نسخهی قبلی اجرا میشود.
- لاگ زندهلاگ بیلد و زمان اجرا، در CLI و کنسول.
- بازگشت به نسخهی قبلهر استقرار قبلی با یک دستور برمیگردد.
- مقیاسدهیمنابع و تعداد نمونهها را تغییر دهید یا خودکارش کنید.
- دیسک ماندگاربرای فایلهایی که باید بعد از هر استقرار بمانند.
- کرانجابدستور زمانبندیشده با همان ایمیج و متغیرها.
- استقرار خودکار با گیتهر push روی شاخهی هدف بیلد و مستقر میشود.
خطاهای رایج
اپ بالا نمیآید یا مدام ریاستارت میشود
علتبرنامه روی پورت ثابت یا فقط روی 127.0.0.1 گوش میدهد؛ پلتفرم ترافیک را به پورتِ متغیر PORT میفرستد.
راهحلپورت را از PORT بخوانید و روی 0.0.0.0 گوش بدهید.
app.listen(process.env.PORT || 3000, "0.0.0.0");
خطای «start script not found»
علتpackage.json اسکریپت start ندارد و دستور اجرا معلوم نیست.
راهحلاسکریپت start را اضافه کنید، مثلاً "start": "node index.js".
خطای سینتکس یا API ناموجود در زمان اجرا
علتنسخهی Node.js اجرا با نسخهای که پروژه برایش نوشته شده فرق دارد.
راهحلنسخه را در .nvmrc یا engines.node اعلام کنید.
نصب وابستگیها در بیلد شکست میخورد
علتلاکفایل در مخزن نیست یا با package.json همخوان نیست. محیط بیلد به اینترنت عمومی وصل نیست و بستهها را از میرور داخلی سکو کلود میگیرد، پس نصب فقط با نسخههای قفلشده قابل تکرار است.
راهحللاکفایل را کامیت کنید و دوباره مستقر کنید.
پاد با OOMKilled متوقف میشود
علتمصرف حافظه از سقف منابع اپ بیشتر شده است.
راهحلحافظه را بیشتر کنید یا مصرف برنامه را پایین بیاورید.
sakoocloud apps scale --memory 1Gi
پرسشهای متداول
برای Node.js باید Dockerfile بنویسم؟
نه. بیلدپک سکو کلود از روی package.json و لاکفایل ایمیج را میسازد. اگر Dockerfile اختصاصی دارید، آن را در ریشه بگذارید تا بهجای بیلدپک استفاده شود.
پروژهی TypeScript چطور اجرا میشود؟
اسکریپت build (مثلاً tsc) در بیلد اجرا میشود و اسکریپت start باید فایل کامپایلشده را اجرا کند، مثل node dist/main.js. NestJS با همین الگو کار میکند.
نسخهی Node.js را چطور انتخاب کنم؟
در .nvmrc یا engines.node بنویسید یا هنگام ساخت اپ --runtime-version بدهید. نسخههای 20، 22 و 24 در دسترساند و پیشفرض 22 است.
مونوریپو را هم میشود مستقر کرد؟
بله. با --root-dir پوشهی بستهی قابل استقرار را مشخص کنید؛ workspaceهای pnpm هم پشتیبانی میشوند.
migration دیتابیس را کجا اجرا کنم؟
در مرحلهی انتشار (Release Phase). این مرحله بعد از بیلد و قبل از جایگزینی نسخهی قبلی اجرا میشود و اگر شکست بخورد، نسخهی جدید بالا نمیآید.
جزئیات بیشتر در راهنمای Node.js در مستندات و مرجع CLI.