Deno با مدل امنیتی خودش
فایل deno.json یا deno.jsonc در ریشه یعنی پروژه Deno است. وابستگیها در بیلد کش میشوند تا اجرای برنامه به دانلود وابسته نباشد، و برنامه با deno task start اجرا میشود.
Deno بهطور پیشفرض به شبکه و متغیرهای محیطی دسترسی ندارد. مجوزهای لازم را در همان task استارت بنویسید؛ معمولاً --allow-net و --allow-env کافی است.
مناسب برای
- API با Deno.serve یا Oak
- Hono روی Deno
- سرویس TypeScript با مجوزهای محدود
- ابزارهای وب و پروکسی سبک
مسیر بیلد Deno
تشخیص
deno.jsonیاdeno.jsoncدر ریشه.deno.jsonکش وابستگیها
ماژولها در زمان بیلد دانلود و کش میشوند.
deno cache main.tsاجرا
task استارت با همان مجوزهای اعلامشده اجرا میشود.
deno task start
خروجی یک استقرار واقعی
sakoocloud deploy ✔ Packed 0.4MB ✔ Source uploaded ℹ Build started · dep_7k2m9q #4 [1/4] FROM denoland/deno:alpine-2.1.4 #6 [2/4] COPY . . #8 [3/4] RUN deno cache main.ts #10 exporting to image ✔ Deployed — app is running. → https://my-deno-api.sakooapps.ir
کمترین چیزی که لازم دارید
پورت را از PORT بخوانید و task استارت را با مجوزهای لازم تعریف کنید.
const port = Number(Deno.env.get("PORT")) || 8000;
Deno.serve({ port, hostname: "0.0.0.0" }, () =>
Response.json({ ok: true }),
);
{
"tasks": {
"start": "deno run --allow-net --allow-env main.ts"
}
}
sakoocloud apps create --name my-deno-api --runtime deno --port 8000
sakoocloud deploy
تنظیمات
مجوزهای رایج
| فلگ | برای چه |
|---|---|
--allow-net | گوش دادن روی پورت و درخواستهای شبکه |
--allow-env | خواندن PORT و متغیرهای دیتابیس |
--allow-read | خواندن فایلهای پروژه، مثلاً قالبها |
فلگهای کاربردی هنگام ساخت اپ
| فلگ | کاربرد |
|---|---|
--runtime-version | قفل کردن نسخهی toolchain، مثلاً 22 یا 3.12 |
--root-dir | استقرار یک پوشه از مونوریپو |
--env-file | بارگذاری متغیرهای محیطی از فایل .env بعد از ساخت اپ |
--endpoint | یک endpoint دیگر روی پورت جدا، مثلاً 8000:/ws:websocket |
اتصال به دیتابیس
متغیرهای دیتابیس لینکشده با Deno.env.get خوانده میشوند؛ --allow-env را فراموش نکنید.
sakoocloud apps link-db <db-id> --app my-deno-api
import postgres from "npm:postgres";
export const sql = postgres(Deno.env.get("DATABASE_URL")!);
دیتابیسهایی که معمولاً کنارش میآیند
همراه هر استقرار
اینها به رانتایم بستگی ندارند و برای هر اپ روی سکو کلود فعالاند. بعضی، مثل مقیاسدهی خودکار و کرانجاب، به پلن بستگی دارند.
- دامنهی اختصاصی و SSLدامنه را اضافه کنید؛ گواهی خودکار صادر و تمدید میشود.
- متغیرهای محیطی و سکرتمقادیر رمزگذاریشده فقط در زمان اجرا به اپ میرسند.
- مرحلهی انتشارmigration بعد از بیلد و پیش از جایگزینی نسخهی قبلی اجرا میشود.
- لاگ زندهلاگ بیلد و زمان اجرا، در CLI و کنسول.
- بازگشت به نسخهی قبلهر استقرار قبلی با یک دستور برمیگردد.
- مقیاسدهیمنابع و تعداد نمونهها را تغییر دهید یا خودکارش کنید.
- دیسک ماندگاربرای فایلهایی که باید بعد از هر استقرار بمانند.
- کرانجابدستور زمانبندیشده با همان ایمیج و متغیرها.
- استقرار خودکار با گیتهر push روی شاخهی هدف بیلد و مستقر میشود.
خطاهای رایج
اپ بالا نمیآید یا مدام ریاستارت میشود
علتبرنامه روی پورت ثابت یا فقط روی 127.0.0.1 گوش میدهد؛ پلتفرم ترافیک را به پورتِ متغیر PORT میفرستد.
راهحلپورت را از PORT بخوانید و روی 0.0.0.0 گوش بدهید.
Deno.serve({ port: Number(Deno.env.get("PORT")) || 8000, hostname: "0.0.0.0" }, handler);
خطای PermissionDenied در زمان اجرا
علتtask استارت مجوز لازم، مثلاً --allow-env یا --allow-net، را ندارد.
راهحلمجوز را به task استارت در deno.json اضافه کنید.
task استارت پیدا نشد
علتdeno.json بخش tasks.start ندارد.
راهحلtask استارت را تعریف کنید.
پاد با OOMKilled متوقف میشود
علتمصرف حافظه از سقف منابع اپ بیشتر شده است.
راهحلحافظه را بیشتر کنید یا مصرف برنامه را پایین بیاورید.
sakoocloud apps scale --memory 1Gi
پرسشهای متداول
کدام نسخهی Deno پشتیبانی میشود؟
Deno 2. نسخهی دقیق را میتوانید با --runtime-version هنگام ساخت اپ تعیین کنید.
بستههای npm در Deno کار میکنند؟
بله. ایمپورتهای npm: در زمان بیلد کش میشوند و از میرور داخلی دریافت میشوند.
Fresh یا Oak را میشود اجرا کرد؟
بله. هر چارچوبی که با deno task start بالا بیاید و روی PORT گوش بدهد اجرا میشود.
جزئیات بیشتر در راهنمای Deno در مستندات و مرجع CLI.