021-88881776

آموزش استقرار و انتشار در .NET

در آموزش .NET، یکی از مهم‌ترین مهارت‌هایی که توسعه‌دهندگان باید یاد بگیرند، نحوه‌ی استقرار و انتشار در .NET است. اگر تازه شروع به یادگیری برنامه‌نویسی کرده‌اید یا یک توسعه‌دهنده‌ی با تجربه هستید، این موضوع کلیدی است که به شما کمک می‌کند برنامه‌های خود را از محیط توسعه به دست کاربران نهایی برسانید. استقرار و انتشار به فرآیند انتقال کدهای نوشته‌شده از سیستم شما به سرورها یا دستگاه‌های دیگر اشاره دارد تا کاربران بتوانند از برنامه استفاده کنند. در این مقاله، ما از مفاهیم پایه شروع می‌کنیم و به موضوعات پیشرفته‌ای مانند DevOps، Docker و سرویس‌های ابری مثل Azure می‌پردازیم. هدف این است که با زبانی ساده و مثال‌های عملی، همه چیز را قدم به قدم توضیح دهیم.

استقرار و انتشار

استقرار و انتشار در .NET به زبان ساده یعنی فرآیندی که طی آن برنامه‌ی شما از محیط توسعه (مثل لپ‌تاپ یا کامپیوتر شخصی‌تان) به محیطی منتقل می‌شود که کاربران نهایی بتوانند از آن استفاده کنند، مانند یک سرور، دستگاه مشتری یا حتی فضای ابری. این کار به شما امکان می‌دهد برنامه‌ای که با زحمت نوشته‌اید را به دست مخاطبان اصلی برسانید. این فرآیند شامل مراحل مشخص و مهمی است که هر کدام نقش خود را در تبدیل کد به یک محصول قابل اجرا دارند. در ادامه، این مراحل را با جزئیات بیشتر، مثال‌های عملی و نکات کاربردی توضیح می‌دهم تا حتی اگر تازه‌کار هستید، بتوانید به راحتی آن را درک کنید و به کار ببندید.

مراحل اصلی استقرار و انتشار در .NET

ساخت (Build):

این اولین قدم برای آماده‌سازی برنامه است. در این مرحله، کد منبع شما (مثل فایل‌های C#) به فایل‌های قابل اجرا یا باینری (مثل DLL یا EXE) تبدیل می‌شود. این فرآیند را “کامپایل کردن” هم می‌نامند.

چطور انجام می‌شود؟

اگر از Visual Studio استفاده می‌کنید، کافی است از منوی Build گزینه‌ی “Build Solution” را انتخاب کنید یا دکمه‌ی F6 را فشار دهید. برای کسانی که ترجیح می‌دهند از خط فرمان کار کنند، دستور زیر در پوشه‌ی پروژه اجرا می‌شود:

dotnet build

مثال عملی:

فرض کنید یک برنامه ساده مثل یک ماشین‌حساب با .NET Core نوشته‌اید. با اجرای dotnet build، فایل‌های خروجی (مثل MyCalculator.dll) در پوشه‌ی bin/Debug تولید می‌شوند. این فایل‌ها نسخه‌ی آزمایشی برنامه هستند که می‌توانید روی سیستم خودتان تست کنید.

نکته برای مبتدیان:

اگر خطایی در کد داشته باشید (مثلاً یک نقطه‌ویرگول جا افتاده باشد)، در این مرحله مشخص می‌شود و باید آن را برطرف کنید.

پیکربندی (Configuration):

حالا که برنامه ساخته شده، باید مشخص کنید که قرار است کجا و چطور اجرا شود. این یعنی باید تنظیمات محیطی، وابستگی‌ها و منابع مورد نیاز برنامه را آماده کنید.

چه چیزهایی نیاز است؟

سیستم‌عامل هدف (ویندوز، لینوکس یا مک).
نسخه‌ی .NET مورد استفاده (مثلاً .NET 6 یا .NET 8).
اتصال به دیتابیس، APIها یا فایل‌های خارجی (مثل تصاویر و تنظیمات).

مثال عملی:

فرض کنید برنامه شما به یک دیتابیس SQL Server متصل است. در فایل appsettings.json می‌توانید رشته اتصال (Connection String) را این‌طور مشخص کنید:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=MyAppDb;Trusted_Connection=True;"
  }
}

یا اگر برنامه روی لینوکس اجرا می‌شود، باید مطمئن شوید که نسخه‌ی .NET نصب‌شده روی سرور با پروژه شما سازگار است.

نکته پیشرفته:

می‌توانید از متغیرهای محیطی (Environment Variables) هم برای پیکربندی استفاده کنید تا تنظیمات در کد سخت (Hardcoded) نباشند و انعطاف‌پذیری بیشتری داشته باشید.

انتشار (Publish):

در این مرحله، برنامه شما برای اجرا در محیط هدف آماده می‌شود. فایل‌های لازم (مثل DLLها، فایل‌های پیکربندی و گاهی runtime) تولید و در یک پوشه یا مستقیماً روی سرور قرار می‌گیرند.

چطور انجام می‌شود؟

در Visual Studio، گزینه‌ی “Publish” را از منوی راست‌کلیک روی پروژه انتخاب کنید. در خط فرمان هم می‌توانید از دستور زیر استفاده کنید:

dotnet publish -c Release --output ./publish

اینجا -c Release یعنی نسخه‌ی نهایی (بهینه‌شده) و –output ./publish مشخص می‌کند که فایل‌ها کجا ذخیره شوند.

مثال عملی:

اگر همان برنامه ماشین‌حساب را منتشر کنید، بعد از اجرای دستور بالا، پوشه‌ی publish شامل فایل‌هایی مثل MyCalculator.dll و فایل‌های وابسته خواهد بود. حالا این پوشه را می‌توانید به یک سرور منتقل کنید و با دستور dotnet MyCalculator.dll آن را اجرا کنید.

انواع انتشار:

Framework-Dependent: برنامه به .NET نصب‌شده روی سیستم هدف وابسته است و حجم کمتری دارد.
Self-Contained: همه چیز (حتی runtime .NET) همراه برنامه منتشر می‌شود و نیازی به نصب .NET روی سیستم هدف نیست، اما حجم فایل‌ها بیشتر است.
مثال:

dotnet publish -c Release -r win-x64 --self-contained

این دستور یک نسخه‌ی مستقل برای ویندوز 64 بیتی تولید می‌کند.

تفاوت استقرار و انتشار

انتشار (Publish): آماده‌سازی فایل‌ها برای انتقال به محیط هدف.
استقرار (Deploy): انتقال و راه‌اندازی فایل‌ها در محیط هدف (مثلاً آپلود روی سرور و اجرای برنامه).
مثال: شما فایل‌ها را با dotnet publish آماده می‌کنید (انتشار) و بعد با FTP به سرور منتقل کرده و اجرا می‌کنید (استقرار).

ابزارها و روش‌ها برای مبتدیان و حرفه‌ای‌ها

برای مبتدیان:

ساده‌ترین راه استفاده از قابلیت Publish در Visual Studio است. فقط چند گزینه مثل “Folder” یا “Azure” را انتخاب می‌کنید و بقیه کار را خودش انجام می‌دهد. مثلاً:
راست‌کلیک روی پروژه > Publish.
انتخاب “Folder” و مشخص کردن مسیر (مثل C:\MyApp).
کلیک روی Publish و تمام!

برای حرفه‌ای‌ها:

در پروژه‌های بزرگ‌تر، ممکن است بخواهید از خط فرمان یا اسکریپت‌های اتوماسیون استفاده کنید. مثلاً یک اسکریپت PowerShell بنویسید که بعد از انتشار، فایل‌ها را به سرور منتقل کند:

dotnet publish -c Release
Copy-Item -Path .\publish\* -Destination \\Server\MyApp -Recurse

مشکلات رایج و راه‌حل‌ها

مشکل: برنامه روی سیستم شما کار می‌کند اما روی سرور نه.
راه‌حل: مطمئن شوید نسخه‌ی .NET روی سرور نصب است یا از گزینه‌ی Self-Contained استفاده کنید.
مشکل: تنظیمات دیتابیس کار نمی‌کند.
راه‌حل: رشته اتصال را چک کنید و مطمئن شوید سرور دیتابیس در دسترس است.

چرا استقرار و انتشار در .NET مهم است؟

بدون این فرآیند، کد شما فقط روی سیستم خودتان قابل اجراست و کاربران نمی‌توانند از آن استفاده کنند. یادگیری استقرار و انتشار در .NET به شما کمک می‌کند تا برنامه‌هایتان را به دنیای واقعی بیاورید، چه یک وب‌سایت ساده باشد چه یک سیستم پیچیده‌ی سازمانی.

مفاهیم DevOps

DevOps یک رویکرد مدرن است که توسعه‌ی نرم‌افزار (Development) و عملیات فناوری اطلاعات (Operations) را با هم ترکیب می‌کند تا فرآیند استقرار و انتشار در .NET را سریع‌تر، قابل اعتمادتر و کارآمدتر کند. اگر تازه با برنامه‌نویسی آشنا شده‌اید، ممکن است فکر کنید که بعد از نوشتن کد، کار تمام است؛ اما در دنیای واقعی، رساندن آن کد به دست کاربران و نگه‌داری از آن، چالش اصلی است. DevOps دقیقاً برای حل این چالش طراحی شده است. در این بخش، با زبانی ساده و مثال‌های عملی، مفاهیم اصلی DevOps را توضیح می‌دهم و نشان می‌دهم چگونه می‌تواند به شما در استقرار و انتشار در .NET کمک کند.

DevOps چیست و چرا مهم است؟

DevOps مثل یک پل بین تیم توسعه (که کد را می‌نویسند) و تیم عملیات (که سرورها و برنامه‌ها را مدیریت می‌کنند) عمل می‌کند. قبل از DevOps، این دو گروه اغلب جداگانه کار می‌کردند و همین باعث تأخیر، خطاها و مشکلات زیادی می‌شد. حالا با DevOps، همه چیز خودکار و هماهنگ می‌شود.

هدف اصلی: کاهش زمان بین نوشتن کد و رساندن آن به دست کاربر، بدون افت کیفیت.
مثال ساده: فرض کنید یک وب‌سایت فروشگاهی با ASP.NET Core ساخته‌اید. بدون DevOps، هر بار که یک ویژگی جدید اضافه می‌کنید (مثلاً دکمه‌ی “اضافه به سبد خرید”)، باید خودتان کد را تست کنید، فایل‌ها را بسازید و به سرور منتقل کنید. این کار شاید برای یک نفر قابل تحمل باشد، اما در تیم‌های بزرگ یا پروژه‌های پیچیده، غیرممکن می‌شود. DevOps این فرآیند را خودکار می‌کند.

مراحل کلیدی DevOps در استقرار و انتشار در .NET

DevOps چند مفهوم اصلی دارد که هر کدام به بخشی از فرآیند کمک می‌کنند. بیایید این مراحل را با جزئیات و مثال بررسی کنیم:

کنترل نسخه (Version Control):

این مرحله یعنی کد شما در یک سیستم مرکزی مثل Git ذخیره شود تا همه‌ی اعضای تیم بتوانند به آن دسترسی داشته باشند و تغییرات را مدیریت کنند.
ابزارها: Git، GitHub، GitLab یا Azure Repos.

مثال عملی:

فرض کنید با .NET یک برنامه‌ی مدیریت وظایف (To-Do List) ساخته‌اید. کد را در GitHub آپلود می‌کنید و هر بار که تغییری می‌دهید، با دستورات زیر آن را ثبت می‌کنید:

git add .
git commit -m "اضافه کردن قابلیت حذف وظایف"
git push origin main

حالا همه‌ی تیم می‌توانند کد را ببینند و روی آن کار کنند.
مزیت: اگر چیزی خراب شود، می‌توانید به نسخه‌ی قبلی برگردید.

ادغام مداوم (Continuous Integration – CI):

اینجا کد شما به صورت خودکار تست و با کدهای دیگر اعضای تیم ادغام می‌شود تا مطمئن شوید همه چیز درست کار می‌کند.
ابزارها: Azure Pipelines، GitHub Actions، Jenkins.

مثال عملی:

در همان برنامه‌ی To-Do List، یک تست ساده با NUnit نوشته‌اید که چک می‌کند آیا وظایف درست اضافه می‌شوند یا نه. حالا در GitHub Actions یک فایل تنظیمات (workflow) مثل این می‌سازید:

name: CI Pipeline
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Setup .NET
      uses: actions/setup-dotnet@v3
      with:
        dotnet-version: '6.0.x'
    - name: Build
      run: dotnet build
    - name: Test
      run: dotnet test

هر بار که کد را به GitHub push می‌کنید، این اسکریپت پروژه را می‌سازد و تست‌ها را اجرا می‌کند. اگر تست‌ها رد شوند، شما یا تیمتان سریع متوجه می‌شوید.
مزیت: مشکلات کوچک قبل از بزرگ شدن پیدا می‌شوند.

انتشار مداوم (Continuous Deployment – CD):

بعد از اینکه کد تست شد، این مرحله آن را به صورت خودکار روی سرور یا محیط هدف منتشر می‌کند. این یعنی دیگر نیازی به آپلود دستی نیست!

مثال عملی:

فرض کنید وب‌سایت شما قرار است روی یک سرور IIS یا Azure App Service اجرا شود. در Azure Pipelines، یک مرحله به فایل YAML اضافه می‌کنید:

- name: Deploy to Azure
  run: dotnet publish -c Release --output ./publish && az webapp up --name MyToDoApp --resource-group MyGroup

حالا هر بار که کد جدید push می‌کنید، بعد از ساخت و تست، مستقیماً روی سرور آپلود می‌شود و کاربران می‌توانند از آن استفاده کنند.
مزیت: سرعت بالا و حذف خطاهای انسانی.

یک سناریوی واقعی با DevOps

بیایید یک پروژه‌ی خیالی را با هم مرور کنیم:

پروژه: یک اپلیکیشن وب با .NET برای رزرو بلیط سینما.

سناریو بدون DevOps:

شما کد را در Visual Studio می‌نویسید.
دستی تست می‌کنید (مثلاً چند بار دکمه‌ی رزرو را می‌زنید).
با dotnet publish فایل‌ها را می‌سازید.
با FTP به سرور وصل می‌شوید و فایل‌ها را آپلود می‌کنید.
سرور را ری‌استارت می‌کنید و امیدوارید همه چیز درست کار کند!
زمان: شاید ۳۰ دقیقه تا ۱ ساعت برای هر تغییر کوچک.

سناریو با DevOps:

کد را به GitHub push می‌کنید.
GitHub Actions پروژه را می‌سازد، تست‌ها را اجرا می‌کند و اگر همه چیز درست بود، به Azure App Service آپلود می‌کند.
زمان: ۵ تا ۱۰ دقیقه، بدون دخالت شما!
ابزارهای محبوب DevOps برای .NET
Azure DevOps: یک پلتفرم کامل برای CI/CD که با .NET خیلی خوب کار می‌کند.
GitHub Actions: ساده و رایگان برای پروژه‌های کوچک.
Jenkins: گزینه‌ای متن‌باز برای تیم‌های حرفه‌ای‌تر.

چالش‌ها و راه‌حل‌ها

چالش: نوشتن تست‌ها وقت‌گیر است.
راه‌حل: از تست‌های ساده شروع کنید (مثلاً چک کردن خروجی یک تابع) و به مرور تست‌های پیچیده‌تر اضافه کنید.
چالش: سرور هدف آماده نیست.
راه‌حل: از محیط‌های Staging (آزمایشی) استفاده کنید تا قبل از انتشار نهایی، همه چیز را چک کنید.

چرا DevOps برای استقرار و انتشار در .NET ضروری است؟

در پروژه‌های بزرگ، تغییرات مداوم و همکاری تیمی اجتناب‌ناپذیر است. DevOps با خودکارسازی فرآیندها، نه تنها زمان را کم می‌کند، بلکه خطاها را کاهش می‌دهد و کیفیت برنامه را بالا می‌برد. برای یک مبتدی، شاید در ابتدا پیچیده به نظر بیاید، اما با یادگیری ابزارهای ساده مثل GitHub Actions، می‌توانید کم‌کم به دنیای حرفه‌ای‌ها وارد شوید.

استفاده از Docker برای کانتینرسازی

Docker ابزاری انقلابی است که به توسعه‌دهندگان اجازه می‌دهد برنامه‌هایشان را در بسته‌های مستقلی به نام “کانتینر” قرار دهند و این کانتینرها را در هر محیطی، از سیستم شخصی گرفته تا سرورهای بزرگ ابری، اجرا کنند. کانتینر مثل یک کپسول است که همه چیز را شامل کد برنامه، کتابخانه‌ها، ابزارها و تنظیمات مورد نیاز در خود نگه می‌دارد و تضمین می‌کند که برنامه شما همیشه به همان شکلی که طراحی شده، اجرا شود. این ویژگی در استقرار و انتشار در .NET بسیار مهم است، چون مشکلات رایج مثل ناسازگاری نسخه‌ها یا تفاوت‌های سیستمی را از بین می‌برد. در این بخش، با جزئیات بیشتر، مثال‌های عملی و نکات پیشرفته، همه چیز را درباره‌ی استفاده از Docker در .NET توضیح می‌دهم تا هم برای مبتدیان قابل فهم باشد و هم برای حرفه‌ای‌ها کاربردی.

چرا Docker برای استقرار و انتشار در .NET؟

وقتی یک برنامه‌ی .NET می‌نویسید، ممکن است روی سیستم شما بدون مشکل کار کند، اما وقتی آن را به سرور یا سیستم دیگری منتقل می‌کنید، با خطاهایی مثل “فایل پیدا نشد”، “نسخه‌ی .NET نصب نیست” یا “تنظیمات نادرست است” مواجه شوید. این مشکلات به خاطر تفاوت در محیط‌های اجرایی است. Docker این مشکل را با ایجاد یک محیط ثابت و قابل حمل حل می‌کند.

مثال روزمره:

فرض کنید یک برنامه‌ی ساده‌ی چت با ASP.NET Core ساخته‌اید که به .NET 7 و یک نسخه خاص از SignalR نیاز دارد. بدون Docker، باید روی هر سرور مطمئن شوید که .NET 7 نصب شده و SignalR دقیقاً همان نسخه‌ای است که شما استفاده کرده‌اید. اما با Docker، همه‌ی این‌ها را در کانتینر می‌گذارید و فقط کانتینر را اجرا می‌کنید—بدون نیاز به تنظیمات اضافی.

مزایای کلیدی:

یکسان‌سازی محیط: توسعه، تست و تولید دقیقاً مثل هم می‌شوند.
سرعت و سبکی: کانتینرها نسبت به ماشین‌های مجازی سریع‌تر راه‌اندازی می‌شوند و منابع کمتری مصرف می‌کنند.
انعطاف‌پذیری: می‌توانید چندین کانتینر را برای سرویس‌های مختلف (مثلاً وب و دیتابیس) کنار هم اجرا کنید.

مفاهیم اصلی Docker

برای شروع، بیایید چند اصطلاح مهم را با جزئیات بشناسیم:

کانتینر (Container): یک نمونه‌ی در حال اجرا از برنامه‌ی شماست که همه‌ی وابستگی‌ها را دارد. مثل یک ماشین مجازی سبک است، اما مستقیماً از هسته‌ی سیستم‌عامل میزبان استفاده می‌کند.
ایمیج (Image): فایل آماده و ثابت که کانتینر از روی آن ساخته می‌شود. مثل یک قالب یا عکس فوری از برنامه‌تان است.
Dockerfile: فایلی که مراحل ساخت ایمیج را مشخص می‌کند؛ فکر کنید به یک دستور پخت غذا که مواد و مراحل را توضیح می‌دهد.
Docker Hub: یک مخزن آنلاین (مثل GitHub برای کد) که می‌توانید ایمیج‌های آماده (مثل ایمیج‌های رسمی .NET) را از آن دانلود کنید یا ایمیج‌های خودتان را آپلود کنید.
Docker Engine: نرم‌افزاری که روی سیستم شما نصب می‌شود و کانتینرها را می‌سازد و اجرا می‌کند.

مراحل دقیق استفاده از Docker در .NET

حالا بیایید قدم به قدم ببینیم چطور یک پروژه‌ی .NET را با Docker کانتینرسازی کنیم:

نصب Docker:

قبل از هر چیز، باید Docker را روی سیستم خود داشته باشید.
ویندوز و مک: Docker Desktop را از سایت رسمی دانلود کنید. بعد از نصب، یک آیکون در نوار ابزار ظاهر می‌شود که نشان می‌دهد Docker فعال است.
لینوکس: در ترمینال دستورات زیر را اجرا کنید (مثلاً برای اوبونتو):

sudo apt update
sudo apt install docker.io
sudo systemctl start docker

تست نصب: با دستور docker –version مطمئن شوید که نصب درست انجام شده (مثلاً خروجی: Docker version 20.10.21).

ایجاد و تنظیم پروژه‌ی .NET:

فرض کنید یک وب‌سایت ساده با ASP.NET Core دارید. اگر پروژه‌ای ندارید، با دستور زیر یکی بسازید:

dotnet new webapp -o MyDockerApp
cd MyDockerApp

حالا پروژه را برای انتشار آماده کنید:

dotnet publish -c Release --output ./publish

این دستور فایل‌های نهایی (مثل MyDockerApp.dll) را در پوشه‌ی publish تولید می‌کند.

نوشتن Dockerfile:

در ریشه‌ی پروژه، فایلی به نام Dockerfile بسازید و کد زیر را وارد کنید:

# ایمیج پایه برای اجرای برنامه
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
# پوشه کاری در کانتینر
WORKDIR /app
# باز کردن پورت 80 برای وب‌سایت
EXPOSE 80
# کپی فایل‌های منتشرشده
COPY ./publish .
# تنظیم متغیر محیطی برای پورت
ENV ASPNETCORE_URLS=http://+:80
# دستور اجرای برنامه
ENTRYPOINT ["dotnet", "MyDockerApp.dll"]

توضیحات تکمیلی:

FROM: از ایمیج رسمی ASP.NET Core 6.0 استفاده می‌کند که شامل runtime است.
EXPOSE: پورت 80 را مشخص می‌کند (پورت پیش‌فرض برای HTTP).
ENV: به برنامه می‌گوید روی پورت 80 گوش کند.
ENTRYPOINT: نقطه‌ی شروع کانتینر است و برنامه‌ی شما را اجرا می‌کند.

ساخت ایمیج:

در ترمینال، به پوشه‌ی پروژه بروید و دستور زیر را بزنید:

docker build -t mydockerapp .

-t mydockerapp: نام ایمیج را تعیین می‌کند (می‌توانید هر نامی بگذارید).
.: نشان می‌دهد Dockerfile در همین پوشه است.
Docker هر خط از Dockerfile را اجرا می‌کند و ایمیج را می‌سازد. خروجی چیزی شبیه این است:

Successfully built abc123def456
Successfully tagged mydockerapp:latest

حالا کانتینر را با این دستور اجرا کنید:

docker run -d -p 8080:80 mydockerapp

-d: کانتینر را در پس‌زمینه اجرا می‌کند (Detached Mode).
-p 8080:80: پورت 80 داخل کانتینر را به پورت 8080 سیستم شما متصل می‌کند.
در مرورگر به http://localhost:8080 بروید و وب‌سایت‌تان را ببینید! برای دیدن کانتینرهای در حال اجرا:

docker ps

مثال پیشرفته‌تر: برنامه با دیتابیس

فرض کنید برنامه‌تان به یک دیتابیس SQL Server نیاز دارد. می‌توانید از Docker Compose برای اجرای چند کانتینر استفاده کنید:

فایل docker-compose.yml بسازید:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8080:80"
    depends_on:
      - db
  db:
    image: mcr.microsoft.com/mssql/server:2019-latest
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=YourStrong@Passw0rd
    ports:
      - "1433:1433"

پروژه را اجرا کنید:

docker-compose up -d

حالا وب‌سایت روی localhost:8080 و دیتابیس روی پورت 1433 در دسترس است. در برنامه‌تان، رشته اتصال را به Server=db;Database=MyDb;User=sa;Password=YourStrong@Passw0rd; تنظیم کنید.

بهینه‌سازی با Multi-Stage Builds

برای کاهش حجم ایمیج، می‌توانید از ساخت چندمرحله‌ای استفاده کنید:

# مرحله ساخت
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app

# مرحله نهایی
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "MyDockerApp.dll"]

این روش فقط فایل‌های ضروری را نگه می‌دارد و SDK سنگین را حذف می‌کند.

نکات عملی و رفع اشکال

مشکل: کانتینر اجرا می‌شود اما سایت کار نمی‌کند.
راه‌حل: با docker logs <container-id> لاگ‌ها را چک کنید (ID را از docker ps بگیرید).
مشکل: پورت در دسترس نیست.
راه‌حل: پورت دیگری را امتحان کنید (مثل -p 8081:80).
نکته: با docker stop <container-id> کانتینر را متوقف کنید.

Docker و استقرار و انتشار در .NET

Docker نه تنها فرآیند ساخت و تست را ساده می‌کند، بلکه استقرار را هم استاندارد و قابل پیش‌بینی می‌کند. می‌توانید ایمیج را به Docker Hub یا یک رجیستری خصوصی آپلود کنید و روی سرور بکشید:

docker push mydockerapp:latest
docker pull mydockerapp:latest

استقرار در سرویس‌های ابری مانند Azure

استقرار و انتشار در .NET با استفاده از سرویس‌های ابری مثل Microsoft Azure به توسعه‌دهندگان این امکان را می‌دهد که برنامه‌های خود را بدون نیاز به مدیریت پیچیده‌ی سرورهای فیزیکی، به سرعت و با اطمینان در دسترس کاربران قرار دهند. Azure یک پلتفرم ابری قدرتمند است که ابزارها و سرویس‌های متنوعی را برای میزبانی برنامه‌های .NET ارائه می‌دهد، از وب‌سایت‌های ساده گرفته تا سیستم‌های پیچیده‌ی بدون سرور. در این بخش، با زبانی ساده و جزئیات کامل، همه چیز را درباره‌ی استقرار در Azure توضیح می‌دهم، مراحل را قدم به قدم مرور می‌کنم و با مثال‌های عملی نشان می‌دهم که چطور می‌توانید برنامه‌تان را به ابر منتقل کنید—چه مبتدی باشید چه حرفه‌ای.

چرا از Azure برای استقرار و انتشار در .NET استفاده کنیم؟

وقتی برنامه‌ای با .NET می‌نویسید، معمولاً هدف نهایی این است که کاربران بتوانند از آن استفاده کنند. میزبانی روی یک سرور محلی شاید کار کند، اما مدیریت آن (مثل نصب به‌روزرسانی‌ها، تأمین امنیت و افزایش ظرفیت) وقت‌گیر و پیچیده است. Azure این مشکلات را حل می‌کند:

بدون نیاز به مدیریت سرور: Azure سخت‌افزار، سیستم‌عامل و به‌روزرسانی‌ها را خودش مدیریت می‌کند.

مثال ساده:

فرض کنید یک وب‌سایت رزرو بلیط با ASP.NET Core ساخته‌اید. به جای خرید سرور، نصب IIS و تنظیم فایروال، می‌توانید با چند کلیک آن را در Azure آپلود کنید و آنلاین شود.

مزایای کلیدی:

مقیاس‌پذیری: اگر تعداد کاربران زیاد شود، Azure به طور خودکار منابع را افزایش می‌دهد.
سرعت: استقرار در چند دقیقه انجام می‌شود.
هزینه: فقط برای منابعی که استفاده می‌کنید پول می‌پردازید (مدل Pay-as-You-Go).

سرویس‌های مختلف Azure برای .NET

Azure گزینه‌های متعددی برای میزبانی برنامه‌های .NET دارد. بیایید مهم‌ترین‌ها را بررسی کنیم:

App Service:

مناسب برای: وب‌سایت‌ها، APIها و برنامه‌های وب با .NET.
ویژگی‌ها: پشتیبانی داخلی از .NET Core و Framework، SSL رایگان، دامنه‌ی سفارشی و مقیاس‌پذیری خودکار.
مثال: یک فروشگاه آنلاین با ASP.NET Core MVC.

Azure Functions:

مناسب برای: برنامه‌های بدون سرور (Serverless) که فقط وقتی استفاده می‌شوند اجرا می‌شوند.
ویژگی‌ها: اجرای کد در پاسخ به رویدادها (مثلاً آپلود فایل یا درخواست HTTP)، هزینه بر اساس مصرف.
مثال: یک تابع که هر شب گزارش فروش را ایمیل می‌کند.

Virtual Machines (VM):

مناسب برای: وقتی نیاز به کنترل کامل روی سرور دارید (مثلاً نصب نرم‌افزار خاص).
ویژگی‌ها: مثل یک سرور واقعی است، اما در ابر میزبانی می‌شود.
مثال: یک برنامه‌ی قدیمی با .NET Framework که نیاز به تنظیمات خاص IIS دارد.

Azure Kubernetes Service (AKS):

مناسب برای: برنامه‌های کانتینری‌شده با Docker در مقیاس بزرگ.
ویژگی‌ها: مدیریت چندین کانتینر با ابزار Kubernetes.
مثال: یک سیستم پیچیده با چندین سرویس .NET که با Docker کانتینرسازی شده‌اند.

مراحل استقرار در Azure

بیایید مراحل استقرار یک برنامه‌ی .NET را در Azure با جزئیات بررسی کنیم:

ساخت و آماده‌سازی پروژه:

مثل همیشه، ابتدا پروژه را با ابزارهای .NET آماده می‌کنید:
در ترمینال یا Visual Studio، پروژه را منتشر کنید:

dotnet publish -c Release --output ./publish

این دستور فایل‌های لازم (مثل DLLها و تنظیمات) را در پوشه‌ی publish تولید می‌کند.
نکته: اگر از کانتینر استفاده می‌کنید (مثل Docker)، می‌توانید مستقیماً ایمیج را به Azure بفرستید (در ادامه توضیح می‌دهم).

انتخاب سرویس Azure:

بسته به نوع پروژه‌تان، یکی از سرویس‌ها را انتخاب کنید:
App Service (رایج‌ترین): برای وب‌سایت‌ها و APIها، ساده‌ترین و سریع‌ترین گزینه است.
مثال عملی: فرض کنید یک وب‌سایت فروشگاهی دارید. App Service را انتخاب می‌کنید چون نیاز به نصب خاصی ندارد و خودکار مقیاس می‌شود.
Azure Functions: اگر پروژه‌تان یک تابع کوچک است (مثلاً پردازش تصویر).
VM: اگر نیاز به نصب دستی دارید (کمتر توصیه می‌شود چون پیچیده‌تر است).

انتشار برنامه:

حالا وقت آپلود برنامه به Azure است. دو روش اصلی وجود دارد:

استفاده از Visual Studio (ساده برای مبتدیان):

در Solution Explorer، روی پروژه راست‌کلیک کنید و “Publish” را بزنید.
گزینه‌ی “Azure” را انتخاب کنید و وارد حساب Azure خود شوید (اگر ندارید، یک حساب رایگان بسازید).
“Azure App Service (Windows/Linux)” را انتخاب کنید.
یک نام (مثلاً MyStoreApp)، گروه منابع (Resource Group) و پلن میزبانی (مثلاً Free Tier) مشخص کنید.
روی “Create” و سپس “Publish” کلیک کنید. چند دقیقه بعد، سایت شما در آدرسی مثل https://mystoreapp.azurewebsites.net آنلاین می‌شود!

استفاده از Azure CLI (برای حرفه‌ای‌ها):

Azure CLI را نصب کنید (از سایت Azure).
با دستور az login وارد حساب شوید.
پروژه را مستقیماً آپلود کنید:

az webapp up --name MyStoreApp --resource-group MyGroup --sku F1

–sku F1: پلن رایگان برای تست.
بعد از چند لحظه، برنامه در دسترس است.
تست و بررسی:
به آدرس تولیدشده (مثل https://mystoreapp.azurewebsites.net) بروید و مطمئن شوید برنامه درست کار می‌کند.
اگر خطایی دیدید، از بخش “Log Stream” در پورتال Azure لاگ‌ها را چک کنید.

استقرار با Docker در Azure

اگر برنامه‌تان را با Docker کانتینرسازی کرده‌اید، می‌توانید آن را در Azure Container Instances (ACI) یا App Service اجرا کنید:

ایمیج را به Azure Container Registry (ACR) آپلود کنید:

az acr login --name myregistry
docker tag mydockerapp myregistry.azurecr.io/mydockerapp:latest
docker push myregistry.azurecr.io/mydockerapp:latest

در App Service، گزینه‌ی “Docker Container” را انتخاب کنید و آدرس ایمیج را بدهید.

یا با ACI اجرا کنید:

az container create --resource-group MyGroup --name mycontainer --image myregistry.azurecr.io/mydockerapp:latest --ports 80

مثال عملی: وب‌سایت فروشگاهی

پروژه: یک فروشگاه آنلاین با ASP.NET Core و Entity Framework.

مراحل:
پروژه را با dotnet publish آماده کنید.
در Visual Studio، به Azure App Service منتشر کنید.
دیتابیس را به Azure SQL Database منتقل کنید و رشته اتصال را در appsettings.json یا متغیرهای محیطی App Service تنظیم کنید:

"ConnectionStrings": {
  "DefaultConnection": "Server=tcp:myserver.database.windows.net,1433;Database=MyShopDb;User ID=admin;Password=MyPass;"
}

بعد از چند دقیقه، سایت در https://myshop.azurewebsites.net قابل دسترسی است.

مزایای Azure برای استقرار و انتشار در .NET

مقیاس‌پذیری خودکار: اگر ترافیک سایت زیاد شود، Azure CPU و RAM را خودش افزایش می‌دهد.
امنیت: SSL رایگان، فایروال و ابزارهای مانیتورینگ داخلی دارد.
ادغام با DevOps: می‌توانید با Azure Pipelines فرآیند را خودکار کنید (مثلاً بعد از هر Push به GitHub، برنامه آپلود شود).
پشتیبانی از .NET: از .NET Framework قدیمی تا .NET 8 جدید پشتیبانی می‌کند.

مشکلات رایج و راه‌حل‌ها

مشکل: برنامه بعد از آپلود کار نمی‌کند.
راه‌حل: لاگ‌ها را در پورتال Azure (بخش Diagnostics) چک کنید یا مطمئن شوید تنظیمات (مثل Connection String) درست است.
مشکل: هزینه‌ها بالا می‌رود.
راه‌حل: از پلن‌های ارزان‌تر (مثل B1 یا F1) شروع کنید و مصرف را مانیتور کنید.

چرا Azure برای .NET ایده‌آل است؟

Azure با ابزارهای ساده مثل Visual Studio و CLI، استقرار و انتشار در .NET را برای همه، از مبتدی تا حرفه‌ای، آسان می‌کند. چه بخواهید یک پروژه‌ی کوچک را تست کنید چه یک سیستم بزرگ را مدیریت کنید، Azure گزینه‌ای انعطاف‌پذیر و قدرتمند است.

نتیجه‌گیری

در این مقاله، ما به طور جامع به موضوع استقرار و انتشار در .NET پرداختیم و از مفاهیم پایه تا تکنیک‌های پیشرفته را با زبانی ساده و مثال‌های عملی بررسی کردیم. از فرآیند ساخت و انتشار اولیه در محیط‌های محلی شروع کردیم و به استفاده از DevOps برای خودکارسازی، Docker برای کانتینرسازی و در نهایت Azure برای میزبانی ابری رسیدیم. هر کدام از این روش‌ها به شما کمک می‌کند تا برنامه‌های .NET خود را با اطمینان و کارایی بیشتری به دست کاربران برسانید. برای مبتدیان، استفاده از ابزارهایی مثل Visual Studio و گزینه‌های ساده‌ی انتشار نقطه‌ی شروع عالی است، اما با پیشرفت پروژه‌ها، ترکیب استقرار و انتشار در .NET با فناوری‌هایی مثل Docker و Azure نه تنها ضروری، بلکه راهی برای بهبود کیفیت و سرعت کار می‌شود. هدف نهایی این است که برنامه‌های شما همیشه در دسترس، پایدار و آماده‌ی پاسخگویی به نیازهای کاربران باشند. با تمرین این تکنیک‌ها، می‌توانید مهارت خود را در استقرار و انتشار در .NET به سطحی حرفه‌ای برسانید و پروژه‌هایتان را با موفقیت به دنیای واقعی بیاورید.

آموزش استقرار و انتشار در .NET

دیدگاه های شما

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *