برنامهها
سایت استاتیک و برنامهٔ کامل: فایلهای استاتیک با یک فانکشن اختیاری برای مسیرهایی که فایل ندارند. Next.js و Astro خودکار شناخته و بیلد میشوند.
سایت استاتیک#
cloudhost apps deploy my-site ./dist
# deployed app my-site v1 (48 files, 48 uploaded, 1.9 s)
# https://my-site.app.trustpage.irفایلها با محتوایشان شناخته میشوند: CLI هش هر فایل را میفرستد و فقط آنهایی را آپلود میکند که هنوز نداریم. تعداد فایلها، اندازهٔ هر فایل و حجم کل آنها به پلن بستگی دارد: محدودیتها. /404.html اگر باشد برای مسیرهای ناشناخته برگردانده میشود.
آپلود از مرورگر#
در داشبورد، «پروژهٔ جدید» یک پوشه، فایل .zip یا .tar.gz را با کشیدن و رها کردن میگیرد. پوشهای با index.html در بالا همان لحظه بهشکل سایت استاتیک مستقر میشود (_headers و _redirects هم اعمال میشوند). پروژهای که package.json با فریمورک یا اسکریپت build دارد روی سرور بیلد میشود و گزارش بیلد را همانجا زنده میبینید. پوشههای node_modules، .git و خروجی بیلد فرستاده نمیشوند.
هر آپلود پیش از ذخیره یا بیلد بررسی میشود: مسیرهایی که از پروژه بیرون میروند (../)، لینکها و فایلهای خاص، و اندازه و تعداد فایلها. سقف آپلود در پلن رایگان ۲۵ مگابایت و ۲٬۰۰۰ فایل است و در پلن حرفهای ۱۰۰ مگابایت و ۲۰٬۰۰۰ فایل.
cloudhost apps upload my-site ./dist # a static site
cloudhost apps upload my-shop site.zip # a framework project: built, log followedمحدودیتها#
آنچه یک استقرار برنامه میتواند داشته باشد، بسته به پلن. کد فانکشن برنامه همانطور سنجیده میشود که ذخیره میشود: همهٔ ماژولها با هم، فشرده با gzip.
| محدودیت | رایگان | حرفهای | سازمانی |
|---|---|---|---|
| فایل استاتیک در هر استقرار | ۲۰٬۰۰۰ | ۱۰۰٬۰۰۰ | طبق قرارداد |
| اندازهٔ یک فایل | ۲۵ MB | ۲۵ MB | طبق قرارداد |
| حجم کل فایلهای استاتیک هر استقرار | ۵۰۰ MB | ۵ GB | طبق قرارداد |
| کد فانکشن، فشرده | ۳ MB | ۱۰ MB | طبق قرارداد |
| کد فانکشن پیش از فشردهسازی | ۶۴ MB | ۶۴ MB | طبق قرارداد |
cloudhost deploy پیش از آپلود، استقرار را با محدودیتهای پلن شما میسنجد و بیلد روی سرور هم پیش از آپلود خروجی همین کار را میکند؛ API هم دوباره بررسی میکند. استقرار بیش از محدودیت با کد limit_exceeded (HTTP 413) رد میشود و پیام میگوید کدام محدودیت، اندازهٔ استقرار شما، سقف پلنتان و سقف پلن حرفهای چیست؛ برای نمونه: «فایل استاتیک در هر استقرار: این استقرار ۲۵٬۰۰۰ فایل دارد؛ پلن رایگان ۲۰٬۰۰۰ فایل اجازه میدهد و پلن حرفهای ۱۰۰٬۰۰۰ فایل.» سقفهای پلن سازمانی در قرارداد تعیین میشوند. همین سقفها در قیمتها آمدهاند و GET /v1/limits آنها را برای پلن شما و همهٔ پلنها برمیگرداند.
قاعدههای _headers و _redirects#
/*
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
/assets/*
Cache-Control: public, max-age=31536000, immutableاین دو فایل را در ریشهٔ پوشهٔ فایلها بگذارید. _headers تا ۱۰۰ قاعده دارد و _redirects تا ۲۰۰۰ قاعده با کدهای 200 (بازنویسی)، 301، 302، 303، 307 یا 308.
برنامهٔ تکصفحهای#
برنامهای که فقط فایل استاتیک دارد، /index.html دارد و /404.html ندارد، خودکار تکصفحهای فرض میشود: هر مسیر ناشناخته /index.html را میگیرد تا مسیریاب سمت مرورگر کارش را بکند. برنامهای که فانکشن هم دارد با --spa (یا spa = true) همین رفتار را میگیرد.
cloudhost apps deploy my-spa ./dist --function api.ts --spaبرنامه با فانکشن#
// runs only when no static file matches the path (here, /api/*)
export default {
async fetch(request: Request): Promise<Response> {
const url = new URL(request.url);
if (url.pathname.startsWith("/api/")) return Response.json({ api: url.pathname, ok: true });
return new Response("not found", { status: 404 });
},
};فانکشن برنامه فقط برای مسیرهایی اجرا میشود که فایل ندارند؛ فایلهای استاتیک مستقیم سرو میشوند و هزینهٔ اجرای فانکشن ندارند. هر چیزی که فانکشنها دارند (متغیرهای محیطی برای هر محیط، cron، اتصال، لاگ) برای فانکشن برنامه هم هست، با cloudhost apps …. خود فایلها هم در env.ASSETS در دسترس فانکشناند.
Next.js و Astro#
cd my-shop
cloudhost init
cloudhost deploy
# Next.js: building on our builder
# build 1a2b3c4d queued (412 KB of source)
# ── install (npm ci)
# ── prepare Next.js for the edge runtime
# ── build (Next.js)
# ── deploy
# deployed app my-shop v1 (…)
# https://my-shop.app.trustpage.ircloudhost deploy فریمورک را از package.json تشخیص میدهد و پروژه را روی بیلدر ما بیلد میکند، همانطور که git push بیلد میکند: بیلدر آداپتور اجرا را در نسخهٔ خودش از کد اضافه و تنظیم میکند، پس چیزی نصب نمیکنید و هیچ فایلی به پروژهتان اضافه نمیشود. خروجی به شکل فایل استاتیک و فانکشن مستقر میشود: صفحههای از پیش ساخته، صفحههایی که با هر درخواست بیلد میشوند، route handlerها و endpointها. در این پروژهها [build] command اجرا نمیشود؛ بیلد فریمورک جای آن است. با framework = "none" در cloudhost.toml تشخیص خاموش میشود.
| فریمورک | کار میکند | هنوز نه |
|---|---|---|
| Next.js 16 | صفحههای استاتیک و سروری، route handlerها، صفحهٔ ۴۰۴ | ISR و بهینهسازی تصویر؛ در next.config.ts مقدار cacheComponents: false بگذارید |
| Astro 7 | صفحههای استاتیک و درخواستی، endpointها، صفحهٔ ۴۰۴ | نشستها (Astro.session) و تبدیل تصویر؛ تصویرها همانطور که هستند فرستاده میشوند |
پیشنمایش، بیلد و git#
git remote add cloudhost https://git.ibel.ai/my-shop.git
git push cloudhost main # production
git push cloudhost new-menu # https://new-menu--my-shop.app.trustpage.irبرنامهها همان پیشنمایش، بیلد روی سرور و git push فانکشنها را دارند؛ فانکشنها را ببینید. پیشنمایش جای خوبی برای بازبینی تغییر محتوا پیش از ادغام در main است.