رانتایم .NET

هاست ASP.NET Core روی .NET 8 و .NET 10

پروژه‌ی ASP.NET Core از روی csproj شناخته می‌شود، با dotnet publish بیلد می‌شود و روی ایمیج chiseled مایکروسافت بدون کاربر root اجرا می‌شود.

تشخیص
*.csproj، *.sln یا global.json
نسخه‌ها
.NET 10 و .NET 8 (LTS)
ایمیج اجرا
aspnet chiseled
پورت پیش‌فرض
8080
لوگوی .NET

.NET با کمترین سطح حمله

پروژه‌ی startup از میان فایل‌های csproj پیدا می‌شود و نسخه‌ی .NET از TargetFramework آن خوانده می‌شود. بسته‌های NuGet از میرور داخلی بازیابی و برنامه با dotnet publish -c Release منتشر می‌شود.

خروجی روی ایمیج chiseled مایکروسافت اجرا می‌شود که shell و مدیر بسته ندارد و برنامه را با کاربر غیر root اجرا می‌کند. ASP.NET Core از .NET 8 به بعد روی پورت 8080 گوش می‌دهد.

مناسب برای

  • Web API با ASP.NET Core
  • Minimal API و میکروسرویس
  • Blazor Server
  • سرویس پس‌زمینه با Worker Service

مسیر بیلد .NET

  1. تشخیص

    فایل پروژه یا solution در مخزن.

    Api.csproj
  2. بازیابی

    بسته‌های NuGet از میرور داخلی بازیابی می‌شوند.

    dotnet restore
  3. انتشار

    خروجی Release ساخته می‌شود.

    dotnet publish -c Release
  4. اجرا

    DLL برنامه روی ایمیج chiseled اجرا می‌شود.

    dotnet Api.dll

خروجی یک استقرار واقعی

sakoocloud deploy
sakoocloud deploy
✔ Packed 0.7MB
✔ Source uploaded
ℹ Build started · dep_7k2m9q
#4 [build 1/5] FROM mcr.microsoft.com/dotnet/sdk:10.0-noble
#6 [build 3/5] RUN dotnet restore
#8 [build 4/5] RUN dotnet publish -c Release -o /app
#10 [stage-1 1/2] FROM mcr.microsoft.com/dotnet/aspnet:10.0-noble-chiseled
#12 exporting to image
✔ Deployed — app is running.
→ https://my-dotnet.sakooapps.ir

Minimal API

روی پورت PORT و همه‌ی رابط‌ها گوش بدهید.

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/health", () => new { ok = true });

var port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
app.Run($"http://0.0.0.0:{port}");

تنظیمات

نسخه‌ی .NET

اگر نسخه از پروژه خوانده نشود، .NET 10 استفاده می‌شود.

TargetFrameworkایمیج
net10.0aspnet:10.0 chiseled
net8.0aspnet:8.0 chiseled

اتصال به دیتابیس

مقادیر اتصال از متغیرهای محیطی تزریق‌شده خوانده می‌شوند.

sakoocloud apps link-db <db-id> --app my-dotnet

دیتابیس‌هایی که معمولاً کنارش می‌آیند

همراه هر استقرار

این‌ها به رانتایم بستگی ندارند و برای هر اپ روی سکو کلود فعال‌اند. بعضی، مثل مقیاس‌دهی خودکار و کران‌جاب، به پلن بستگی دارند.

خطاهای رایج

اپ بالا نمی‌آید یا مدام ری‌استارت می‌شود

علتبرنامه روی پورت ثابت یا فقط روی 127.0.0.1 گوش می‌دهد؛ پلتفرم ترافیک را به پورتِ متغیر PORT می‌فرستد.

راه‌حلپورت را از PORT بخوانید و روی 0.0.0.0 گوش بدهید.

Program.cs
app.Run($"http://0.0.0.0:{Environment.GetEnvironmentVariable("PORT") ?? "8080"}");

پروژه‌ی اشتباه منتشر می‌شود

علتچند csproj در مخزن هست و پروژه‌ی وب به‌عنوان startup پیدا نشده است.

راه‌حلپوشه‌ی پروژه‌ی وب را با --root-dir مشخص کنید.

دستور shell در ایمیج اجرا نمی‌شود

علتایمیج chiseled عمداً shell ندارد.

راه‌حلکارهای آماده‌سازی را در کد یا مرحله‌ی انتشار انجام دهید، یا Dockerfile اختصاصی بنویسید.

پاد با OOMKilled متوقف می‌شود

علتمصرف حافظه از سقف منابع اپ بیشتر شده است.

راه‌حلحافظه را بیشتر کنید یا مصرف برنامه را پایین بیاورید.

terminal
sakoocloud apps scale --memory 1Gi

پرسش‌های متداول

.NET Framework قدیمی پشتیبانی می‌شود؟

نه. فقط .NET مدرن (8 و 10) روی لینوکس اجرا می‌شود.

Entity Framework migration را کجا اجرا کنم؟

در مرحله‌ی انتشار، یا با یک bundle مهاجرت که در شروع برنامه اجرا می‌شود.

Blazor WebAssembly را چطور مستقر کنم؟

خروجی wwwroot را به‌عنوان سایت استاتیک مستقر کنید؛ Blazor Server با همین رانتایم اجرا می‌شود.

جزئیات بیشتر در راهنمای .NET در مستندات و مرجع CLI.

سریع‌ترین مسیر از کد تا انتشار.

ابتدا ابزار خط فرمان را نصب کنید، سپس همین‌جا امتحان کنید. (بنویسید، یا یکی از پیشنهادهای پایین ترمینال را بزنید)

~/projects/my-app
امتحان کنید