গাইড

ASP.NET Core ও SQL Server

Meghly-তে SQL Server বা অন্য যেকোনো ডেটাবেসসহ ASP.NET Core অ্যাপ (Web API, MVC, Razor Pages, Blazor Server) চালানোর পূর্ণাঙ্গ গাইড — প্রজেক্ট প্রস্তুতি থেকে শুরু করে মাইগ্রেশন ও SSMS কানেকশন পর্যন্ত।

সমর্থিত প্রজেক্ট ও ভার্সন

  • Microsoft.NET.Sdk.Web প্রজেক্ট: Web API, MVC, Razor Pages এবং Blazor Server।
  • .NET 10, 9 এবং 8 — প্রজেক্টের .csproj ফাইলের <TargetFramework> ট্যাগ (যেমন net10.0) দেখে স্বয়ংক্রিয়ভাবে ভার্সন নির্বাচন করা হয়। নতুন প্রজেক্টের জন্য .NET 10 ব্যবহারের পরামর্শ দেওয়া হয়; .NET 8 বা 9 ব্যবহার করলে প্যানেলে সতর্কবার্তা দেখানো হয়, কারণ মাইক্রোসফটের অফিশিয়াল সাপোর্ট শেষ হয়ে আসছে।
  • একই সলিউশনে Microsoft.NET.Sdk.Worker (ব্যাকগ্রাউন্ড সার্ভিস) প্রজেক্ট থাকলে সেটি স্বয়ংক্রিয়ভাবে আলাদা worker প্রসেস হিসেবে রান হয়।
  • ইউনিট টেস্ট প্রজেক্টগুলো (xUnit, NUnit, MSTest) বিল্ডের সময় স্বয়ংক্রিয়ভাবে বাদ দেওয়া হয়।

পুরনো ASP.NET MVC 5 বা .NET Framework (net48, packages.config, কিংবা web.config-ভিত্তিক প্রজেক্ট) শুধুমাত্র Windows সার্ভারে চলে। তাই এ ধরনের প্রজেক্ট ডিপ্লয় করলে Meghly স্পষ্ট বার্তাসহ তা জানিয়ে দেয়। এগুলো চালাতে হলে আগে ASP.NET Core-এ রূপান্তর করে নিতে হবে।

প্রজেক্ট প্রস্তুত করার নিয়মাবলি

১. কানেকশন স্ট্রিং (Connection String)

Meghly আপনার ডেটাবেসের কানেকশন স্ট্রিংটি ConnectionStrings__Default এনভায়রনমেন্ট ভেরিয়েবলে সরবরাহ করে। তাই আপনার কোডে কানেকশন স্ট্রিংয়ের নাম Default রাখুন:

Program.cs
builder.Services.AddDbContext<AppDbContext>(o =>
    o.UseSqlServer(builder.Configuration.GetConnectionString("Default")));

PostgreSQL ব্যবহার করলে UseNpgsql এবং MySQL/MariaDB ব্যবহার করলে UseMySql ব্যবহার করুন, তবে কানেকশনের নাম Default-ই থাকবে। আপনার লোকাল পিসির কাজের সুবিধার্থে appsettings.json ফাইলে লোকাল কানেকশন স্ট্রিং থাকলেও কোনো সমস্যা নেই; সার্ভারে রান হওয়ার সময় এনভায়রনমেন্ট ভেরিয়েবলের মানই প্রাধান্য পাবে।

২. অ্যাপ চালুর সময় মাইগ্রেশন না চালানো

কোডের ভেতর থেকে context.Database.Migrate() বা EnsureCreated() অংশটুকু সরিয়ে ফেলুন। চলমান অ্যাপ্লিকেশনকে ডেটাবেসের runtime login দেওয়া হয়, যার নতুন টেবিল তৈরি বা স্কিমা পরিবর্তনের অনুমতি থাকে না। মাইগ্রেশন সবসময় ডিপ্লয়ের শুরুতে রিলিজ ধাপে স্বয়ংক্রিয়ভাবে সম্পন্ন হয় (নিচে বিস্তারিত দেখুন)।

৩. হেলথ চেক (Health Check)

ডিফল্ট অবস্থায় Meghly আপনার অ্যাপের / রাউটে 2xx বা 3xx রেসপন্স আশা করে (লগইন পেজে রিডাইরেক্ট হলেও তা গ্রহণযোগ্য)। তবে আলাদা একটি ডেডিকেটেড হেলথ চেক এন্ডপয়েন্ট রাখা সবচেয়ে ভালো:

Program.cs
builder.Services.AddHealthChecks();
app.MapHealthChecks("/healthz");

এরপর প্যানেলে অ্যাপের General → Health check ফিল্ডে /healthz সেট করে দিন।

৪. HTTPS এবং ভিজিটরের আসল IP

আপনার অ্যাপ্লিকেশনটি Meghly-র রিভার্স প্রক্সি রাউটারের মাধ্যমে চলে। Meghly নিজে থেকেই ASPNETCORE_FORWARDEDHEADERS_ENABLED=true ভেরিয়েবল সেট করে দেয়, যার ফলে অ্যাপ সহজেই বুঝতে পারে রিকোয়েস্টটি HTTPS-এ এসেছে এবং ভিজিটরের আসল IP অ্যাড্রেস কোনটি। কোডে app.UseHttpsRedirection() থাকলেও কোনো সমস্যা নেই।

৫. Data Protection Key সংরক্ষণ

লগইন কুকি এবং অ্যান্টি-ফোরজারি (antiforgery) টোকেনের এনক্রিপশন কি ডিফল্টভাবে কন্টেইনারের ভেতরে তৈরি হয়। যেহেতু কন্টেইনারের ফাইল সিস্টেম রিড-অনলি এবং প্রতি ডিপ্লয়ে নতুন কন্টেইনার তৈরি হয়, তাই এই কি সংরক্ষণ না করলে প্রতিবার ডিপ্লয়ের পর সব ইউজার লগআউট হয়ে যাবেন এবং ফর্মে "antiforgery token" সংক্রান্ত এরর দেখা দেবে। এটি সমাধানের জন্য নিচের যেকোনো একটি পদ্ধতি অনুসরণ করুন:

  • ডেটাবেসে সংরক্ষণ করা (সবচেয়ে ভালো পদ্ধতি): প্রজেক্টে Microsoft.AspNetCore.DataProtection.EntityFrameworkCore প্যাকেজটি ইনস্টল করুন, আপনার DbContext-এ DbSet<DataProtectionKey> যোগ করে একটি মাইগ্রেশন তৈরি করুন এবং Program.cs-এ নিচের কোডটি লিখুন:
    csharp
    builder.Services.AddDataProtection().PersistKeysToDbContext<AppDbContext>();
  • ভলিউমে সংরক্ষণ করা: অ্যাপের Files & backups পেজ থেকে একটি ভলিউম যুক্ত করুন (যেমন /app/keys), এরপর কোডে PersistKeysToFileSystem(new DirectoryInfo("/app/keys")) ব্যবহার করুন।

৬. ফাইল আপলোড

কন্টেইনারের wwwroot/uploads ফোল্ডারে সরাসরি ফাইল সেভ করা যায় না। ইউজারদের আপলোড করা ফাইল স্থায়ীভাবে রাখতে Files & backups পেজে গিয়ে ওই পাথে একটি ভলিউম যুক্ত করুন (যেমন /app/wwwroot/uploads)। এতে নতুন ডিপ্লয় বা রিস্টার্টের পরেও আপলোড করা ফাইলগুলো অক্ষত থাকবে।

ডেটাবেস ও অ্যাপ তৈরি করার ধাপ

  1. প্যানেলে গিয়ে Apps → New app অপশনে ক্লিক করুন এবং আপনার Git রিপোজিটরি অথবা জিপ ফাইল নির্বাচন করুন।
  2. What is it? সেকশনে ASP.NET Core, আপনার ডটনেট ভার্সন এবং ফ্রেমওয়ার্কের ধরন (ASP.NET Core API অথবা ASP.NET Core MVC) বেছে নিন।
  3. ডেটাবেস প্রয়োজন হলে It needs a database অপশনে টিক দিন। ডেটাবেস ইঞ্জিন পরিবর্তন করতে চাইলে Advanced → Database engine থেকে SQL Server (অথবা PostgreSQL, MySQL, MariaDB) নির্বাচন করুন।
  4. প্রয়োজনীয় এনভায়রনমেন্ট ভেরিয়েবলগুলো যুক্ত করুন (যেমন ASPNETCORE_ENVIRONMENT=Production বা আপনার প্রয়োজনীয় API Key)।
  5. এবার ডিপ্লয় শুরু করুন। Detect ধাপে সিস্টেম কী কী খুঁজে পেয়েছে তা দেখাবে (যেমন "ASP.NET Core 10.0 · EF Core migrations found")।

SQL Server-এর কানেকশন সবসময় এনক্রিপ্টেড থাকে। যেহেতু সার্টিফিকেটটি সার্ভারের নিজস্ব, তাই Meghly-র দেওয়া কানেকশন স্ট্রিংয়ে আগে থেকেই TrustServerCertificate=True যুক্ত থাকে—অ্যাপে সেটিই ব্যবহার করুন। ডেটাবেস সম্পর্কে বিস্তারিত জানতে দেখুন ডেটাবেস গাইড।

ডেটাবেস মাইগ্রেশন: দুটি পদ্ধতি

নিচের দুটি পদ্ধতির মধ্যে যেকোনো একটি ব্যবহার করুন (দুটো একসাথে ব্যবহার করবেন না):

(ক) EF Core মাইগ্রেশন: আপনার ওয়েব প্রজেক্টে Microsoft.EntityFrameworkCore.Design (অথবা .Tools) প্যাকেজটি যুক্ত থাকলে বিল্ডের সময় স্বয়ংক্রিয়ভাবে একটি migration bundle তৈরি হয়। প্রতিটি ডিপ্লয়ের আগে রিলিজ ধাপে এই বান্ডেলটি migration login ব্যবহার করে রান হয় এবং যে মাইগ্রেশনগুলো এখনো ডেটাবেসে প্রয়োগ করা হয়নি সেগুলো সম্পন্ন করে। আপনাকে শুধু নিজের পিসিতে মাইগ্রেশন তৈরি করে Git-এ কমিট করতে হবে:

powershell
dotnet ef migrations add AddOrders

বান্ডেলটি আপনার Program.cs থেকেই DbContext তৈরি করে এবং রিলিজ কন্টেইনারে অ্যাপের সব এনভায়রনমেন্ট ভেরিয়েবল উপস্থিত থাকে।

(খ) SQL স্ক্রিপ্ট: রিপোজিটরির রুট ফোল্ডারে db/migrations/ নামের একটি ডিরেক্টরি তৈরি করে তার ভেতর ক্রমানুসারে .sql ফাইল রাখুন (যেমন 0001_create_orders.sql, 0002_add_index.sql)। ফাইলগুলো নামের ক্রম অনুসারে রান হয় এবং প্রতিটি স্ক্রিপ্ট একবারই চলে। ব্যাচ আলাদা করার জন্য GO ব্যবহার করা যাবে। সম্পূর্ণ স্ক্রিপ্ট একটি ট্রানজ্যাকশনের ভেতর চলে—ফলে মাঝপথে কোনো ত্রুটি ঘটলে সম্পূর্ণ পরিবর্তন বাতিল (rollback) হয়ে যায় এবং ডিপ্লয় স্থগিত হয়। একবার রান হয়ে যাওয়া কোনো পুরনো স্ক্রিপ্ট পরে এডিট করলে রিলিজ ধাপটি নিরাপত্তার কারণে থেমে যাবে; তাই কোনো পরিবর্তনের প্রয়োজন হলে সবসময় নতুন একটি স্ক্রিপ্ট ফাইল যোগ করুন।

SSMS দিয়ে সরাসরি ডেটাবেসে কানেক্ট করা

নিরাপত্তার কারণে ডিফল্ট অবস্থায় SQL Server-এর পোর্ট শুধুমাত্র আপনার অ্যাপের জন্য উন্মুক্ত থাকে। আপনার পিসির SQL Server Management Studio (SSMS) বা Azure Data Studio থেকে ডেটাবেসে যুক্ত হতে চাইলে:

  1. প্যানেলে Databases মেনু থেকে আপনার ডেটাবেসটি নির্বাচন করুন → Remote Access অংশে যান → আমার IP যোগ করো বাটনে ক্লিক করুন (অথবা আপনার অফিসের পাবলিক IP/নেটওয়ার্ক দিন) → Save allowlist চাপুন। এখানে সর্বোচ্চ ২০টি পাবলিক IP যুক্ত করা যায়।
  2. এবার আপনার পিসির SSMS ওপেন করে নিচের তথ্যগুলো দিন:
    • Server name: <host>,<port> — প্যানেলে ঠিক যেভাবে কমা দিয়ে দেখানো হয়েছে।
    • Authentication: SQL Server Authentication সিলেক্ট করুন এবং স্কিমা বা টেবিল পরিবর্তনের প্রয়োজন হলে migration login-এর ইউজারনেম ও পাসওয়ার্ড দিন।
    • Encryption: Mandatory সিলেক্ট করুন এবং Trust server certificate অপশনে টিক দিন।
  3. কাজ শেষ হয়ে গেলে Remote Access থেকে আপনার IP-টি সরিয়ে দিন, যাতে পোর্টটি পুনরায় বাইরে থেকে সুরক্ষিত হয়ে যায়।

.bak ফাইল দিয়ে পুরনো ডেটাবেস ইমপোর্ট করা

  1. আপনার পূর্বের SQL Server থেকে এনক্রিপশন ছাড়া একটি ফুল ব্যাকআপ (.bak) তৈরি করুন:
    sql
    BACKUP DATABASE [MyShop] TO DISK = N'C:\backup\MyShop.bak' WITH COPY_ONLY, CHECKSUM, INIT;
  2. প্যানেলে Databases → আপনার ডেটাবেস → Import .bak file অপশনে গিয়ে ফাইলটি নির্বাচন করুন এবং Import .bak বাটনে চাপুন।
  3. ইমপোর্টের আগে Meghly স্বয়ংক্রিয়ভাবে পরীক্ষা করে দেখে যে ব্যাকআপ ফাইলটি এখানকার SQL Server (2025)-এর চেয়ে নতুন কোনো ভার্সনের কি না, এতে TDE/এনক্রিপশন বা FILESTREAM আছে কি না এবং ফাইলের আকার আপনার প্ল্যানের সীমার মধ্যে আছে কি না।

.bak ফাইল রিস্টোর করলে আপনার বর্তমান ডেটাবেসের আগের সব ডেটা মুছে গিয়ে নতুন ডেটা প্রতিস্থাপিত হবে। এছাড়া পুরনো সার্ভারের লগইন ইউজারগুলো (যেমন sa) এখানে স্থানান্তরিত হয় না; অ্যাপটি Meghly-র নিজস্ব runtime login দিয়েই চলবে।

একইভাবে, আপনি চাইলে যেকোনো সময় Download export বাটনে ক্লিক করে আপনার ডেটাবেসের একটি ভেরিফাইড .bak ব্যাকআপ ফাইল ডাউনলোড করে নিতে পারেন।

সচরাচর সমস্যা ও সমাধান

যে সমস্যা বা এরর দেখছেনকারণ ও সমাধান
Build: "ASP.NET MVC 5 / .NET Framework"এটি শুধুমাত্র Windows-নির্ভর পুরনো প্রজেক্ট। এটিকে ASP.NET Core-এ আপগ্রেড করে নিন।
Build: "targets .NET 7"প্রজেক্টের .csproj ফাইলে <TargetFramework>net10.0</TargetFramework> সেট করুন।
Release: CREATE TABLE permission deniedঅ্যাপ চালুর সময় কোডের ভেতর থেকে মাইগ্রেশন কল হচ্ছে। কোড থেকে Migrate() বা EnsureCreated() সরিয়ে ফেলুন।
হেলথ চেক ধাপে ডিপ্লয় আটকে যাচ্ছেঅ্যাপটি PORT ভেরিয়েবলে রান করছে কি না এবং / (বা আপনার হেলথ পাথ) 2xx/3xx রেসপন্স দিচ্ছে কি না তা পরীক্ষা করুন। স্টার্টআপ এরর দেখতে Logs ট্যাব চেক করুন।
প্রতিবার ডিপ্লয়ের পর ইউজার লগআউট হয়ে যাচ্ছেওপরে দেখানো নিয়ম অনুযায়ী Data Protection Key ডেটাবেসে অথবা ভলিউমে সংরক্ষণ করুন।
certificate chain সংক্রান্ত এররপ্যানেল থেকে দেওয়া কানেকশন স্ট্রিংটি হুবহু ব্যবহার করুন (যাতে TrustServerCertificate=True যুক্ত আছে)।
SSMS-এ কানেকশন টাইমআউট হচ্ছেRemote Access তালিকায় আপনার বর্তমান ইন্টারনেট সংযোগের পাবলিক IP যুক্ত আছে কি না তা মিলিয়ে দেখুন (বাসার ইন্টারনেটের IP প্রায়ই পরিবর্তিত হয়)।

আটকে গেছেন?

আমাদের ইঞ্জিনিয়ারদের সাথে সরাসরি কথা বলুন — ফোন বা ইমেইলে, বাংলায়।

01782618248shohag.meghly@gmail.com