.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
تشخیص
فایل پروژه یا solution در مخزن.
Api.csprojبازیابی
بستههای NuGet از میرور داخلی بازیابی میشوند.
dotnet restoreانتشار
خروجی Release ساخته میشود.
dotnet publish -c Releaseاجرا
DLL برنامه روی ایمیج chiseled اجرا میشود.
dotnet Api.dll
خروجی یک استقرار واقعی
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}");
sakoocloud apps create --name my-dotnet --runtime dotnet --port 8080
sakoocloud deploy
تنظیمات
نسخهی .NET
اگر نسخه از پروژه خوانده نشود، .NET 10 استفاده میشود.
| TargetFramework | ایمیج |
|---|---|
net10.0 | aspnet:10.0 chiseled |
net8.0 | aspnet:8.0 chiseled |
اتصال به دیتابیس
مقادیر اتصال از متغیرهای محیطی تزریقشده خوانده میشوند.
sakoocloud apps link-db <db-id> --app my-dotnet
var cs = $"Host={Env("DATABASE_HOST")};Port={Env("DATABASE_PORT")};" +
$"Database={Env("DATABASE_NAME")};Username={Env("DATABASE_USER")};" +
$"Password={Env("DATABASE_PASSWORD")}";
builder.Services.AddDbContext<AppDb>(o => o.UseNpgsql(cs));
static string? Env(string k) => Environment.GetEnvironmentVariable(k);
دیتابیسهایی که معمولاً کنارش میآیند
همراه هر استقرار
اینها به رانتایم بستگی ندارند و برای هر اپ روی سکو کلود فعالاند. بعضی، مثل مقیاسدهی خودکار و کرانجاب، به پلن بستگی دارند.
- دامنهی اختصاصی و SSLدامنه را اضافه کنید؛ گواهی خودکار صادر و تمدید میشود.
- متغیرهای محیطی و سکرتمقادیر رمزگذاریشده فقط در زمان اجرا به اپ میرسند.
- مرحلهی انتشارmigration بعد از بیلد و پیش از جایگزینی نسخهی قبلی اجرا میشود.
- لاگ زندهلاگ بیلد و زمان اجرا، در CLI و کنسول.
- بازگشت به نسخهی قبلهر استقرار قبلی با یک دستور برمیگردد.
- مقیاسدهیمنابع و تعداد نمونهها را تغییر دهید یا خودکارش کنید.
- دیسک ماندگاربرای فایلهایی که باید بعد از هر استقرار بمانند.
- کرانجابدستور زمانبندیشده با همان ایمیج و متغیرها.
- استقرار خودکار با گیتهر push روی شاخهی هدف بیلد و مستقر میشود.
خطاهای رایج
اپ بالا نمیآید یا مدام ریاستارت میشود
علتبرنامه روی پورت ثابت یا فقط روی 127.0.0.1 گوش میدهد؛ پلتفرم ترافیک را به پورتِ متغیر PORT میفرستد.
راهحلپورت را از PORT بخوانید و روی 0.0.0.0 گوش بدهید.
app.Run($"http://0.0.0.0:{Environment.GetEnvironmentVariable("PORT") ?? "8080"}");
پروژهی اشتباه منتشر میشود
علتچند csproj در مخزن هست و پروژهی وب بهعنوان startup پیدا نشده است.
راهحلپوشهی پروژهی وب را با --root-dir مشخص کنید.
دستور shell در ایمیج اجرا نمیشود
علتایمیج chiseled عمداً shell ندارد.
راهحلکارهای آمادهسازی را در کد یا مرحلهی انتشار انجام دهید، یا Dockerfile اختصاصی بنویسید.
پاد با OOMKilled متوقف میشود
علتمصرف حافظه از سقف منابع اپ بیشتر شده است.
راهحلحافظه را بیشتر کنید یا مصرف برنامه را پایین بیاورید.
sakoocloud apps scale --memory 1Gi
پرسشهای متداول
.NET Framework قدیمی پشتیبانی میشود؟
نه. فقط .NET مدرن (8 و 10) روی لینوکس اجرا میشود.
Entity Framework migration را کجا اجرا کنم؟
در مرحلهی انتشار، یا با یک bundle مهاجرت که در شروع برنامه اجرا میشود.
Blazor WebAssembly را چطور مستقر کنم؟
خروجی wwwroot را بهعنوان سایت استاتیک مستقر کنید؛ Blazor Server با همین رانتایم اجرا میشود.
جزئیات بیشتر در راهنمای .NET در مستندات و مرجع CLI.