Nasıl Yapılır?

Windows VPS’te ASP.NET Core Yayını: IIS ve Hosting Bundle

Hızlı özet

Windows VPS, yani sanal özel sunucunuz üzerinde ASP.NET Core uygulamanızı yayınlamak için Windows’un web sunucusu IIS’i ve uygulamanızın .NET sürümüne uygun Hosting Bundle paketini kurmanız gerekir. Ardından yayın dosyalarını IIS sitesine bağlayıp klasör izinlerini ve HTTPS ile şifreli erişimi ayarlarsınız.

  • Hosting Bundle, uygulamanın çalışması için gereken .NET çalışma zamanını ve IIS bağlantı modülünü sağlar.
  • Sunucuya kaynak kod yerine Release, yani yayına uygun derleme ayarıyla alınmış yayın çıktısını taşırsınız.
  • Uygulamayı çalıştıran IIS uygulama havuzuna ayrı kimlik ve yalnızca gereken klasör izinlerini verirsiniz.
  • Yayını sunucu dışından HTTPS ile kontrol eder, güncelleme öncesinde geri dönüş kopyası alırsınız.

Uygulamanız kendi bilgisayarınızda açılıyor ama VPS’ye taşıdığınızda hata veriyorsa sorun yalnızca kodda olmayabilir. Eksik çalışma zamanı, yanlış yayın klasörü yolu veya yetersiz dosya izinleri de uygulamanın başlamasını engelleyebilir. Önce sunucunun gerekli bileşenlerini, ardından yayın dosyalarını ve erişim ayarlarını kontrol ederek sorunun hangi aşamada olduğunu ayırt edebilirsiniz.

Örnek senaryoda Windows Server 2022 üzerinde IIS 10 ve .NET 10 kullanan, veritabanı gerektirmeyen bir uygulamayla ilerleyeceksiniz. Kurulumun sonunda uygulamanızı alan adınız üzerinden HTTPS ile açabilecek, başlangıç hatalarını ayırt edebilecek ve gerektiğinde önceki sürüme dönebileceğiniz bir güncelleme yolu oluşturabileceksiniz.

Örnek ortamı hazırlayın: IIS ve Hosting Bundle

Uygulamanızın IIS üzerinden açılabilmesi için önce web sunucusunu, ardından uygulamayı çalıştıracak bileşenleri kuracaksınız. IIS, Windows’un web sunucusudur. Hosting Bundle paketi ise .NET çalışma zamanlarını ve ASP.NET Core uygulamasını IIS’e bağlayan modülü sağlar.

Örnek senaryo

Temiz Windows Server 2022 x64 VPS üzerinde IIS 10 ve .NET 10 LTS kullanacağız. x64, 64 bit mimariyi; LTS, uzun süreli destek sürümünü belirtir. Daha sonra veritabanı gerektirmeyen OrnekWeb uygulamasını C:\Sites\OrnekWeb klasöründen yayınlayacağız.

Erişim ve geri dönüş hazırlığı

VPS’ye RDP, yani Uzak Masaüstü bağlantısıyla yönetici hesabınız üzerinden bağlanın. Sunucuda mevcut veri varsa güncelleme ve rol kurulumundan önce sunucu yedeği alın. Sağlayıcınızın yedekleme hizmetini kullanıyorsanız panelde yedeğin tamamlandığını kontrol edin ve geri yüklemenin nereden başlatılacağını öğrenin. Mevcut IIS ayarları varsa bunların da ayrı bir yedeğini saklayın.

Ardından Windows Update (Windows güncellemeleri) bölümünde güncellemeleri yükleyip bekleyen yeniden başlatmayı tamamlayın. Mevcut sitelerin çalıştığı bir sunucuda bu işlemler hizmeti durdurabileceğinden bakım aralığı kullanın.

Alan adınızın DNS yönetim paneline erişebildiğinizi kontrol edin ve VPS’nin genel IPv4 adresini not alın. DNS, alan adını sunucunun IP adresine yönlendiren kayıtları tutar. Örnekteki uygulama.example.com temsilîdir; kendi alt alan adınızı kullanacaksınız. Mevcut bir siteyi taşıyorsanız DNS kaydını henüz değiştirmeyin; yönlendirmeyi site hazır olduğunda yapacağız.

IIS rolünü ve yönetim araçlarını kurun

  1. Server Manager – Manage – Add Roles and Features yolundan rol ve özellik ekleme sihirbazını açın. Role-based or feature-based installation, yani rol tabanlı kurulumu seçin. Sunucu seçim ekranında bağlı olduğunuz VPS’yi seçerek ilerleyin.
  2. Server Roles – Web Server (IIS) seçeneğini işaretleyin. Açılan pencerede Add Features (özellik ekle) ile gerekli yönetim bileşenlerini ekleyin.
  3. Role Services (rol hizmetleri) ekranında varsayılan seçimleri koruyun; Management Tools – IIS Management Console seçili olsun. Bu bileşen, siteleri yöneteceğiniz IIS arayüzünü kurar. ASP.NET Core için eski ASP.NET 4.x rol hizmetini eklemeniz gerekmez. Install (yükle) ile kurulumu tamamlayın.

VPS’de tarayıcıdan http://localhost adresini açın. Temiz kurulumda IIS karşılama sayfası görünmelidir. Bu, web sunucusunun sunucu içinden gelen HTTP isteğine yanıt verdiğini gösterir; dışarıdan erişimi sonraki adımlarda kontrol edeceksiniz.

Hosting Bundle kurulumunu doğrulayın

VPS’de Microsoft’un resmî .NET indirme sayfasını açın. .NET 10 sürümünün güncel bakım sürümü altında, ASP.NET Core Runtime bölümündeki Hosting Bundle Windows yükleyicisini indirin. Bakım sürümü, aynı ana sürüm için yayımlanan düzeltmeleri içerir.

IIS kurulumundan sonra yükleyiciyi yönetici olarak çalıştırıp varsayılan bileşenlerle kurulumu bitirin. Paket, uygulamanın ihtiyaç duyduğu .NET ve ASP.NET Core çalışma zamanlarıyla IIS bağlantısını sağlayan ASP.NET Core Module bileşenini kurar. Hosting Bundle’ı IIS’ten önce yüklediyseniz IIS kurulumu tamamlandıktan sonra yükleyiciyi yeniden açıp Repair (onar) seçin; böylece IIS modülünün kurulumu da tamamlanır.

Kurulumdan sonra VPS’yi yeniden başlatın; mevcut siteler varsa bunu bakım aralığında yapın. Yeniden bağlandığınızda VPS’de yeni bir PowerShell penceresi açıp kurulu çalışma zamanlarını listeleyin:

dotnet --list-runtimes

Çıktıda Microsoft.NETCore.App 10.0.x ve Microsoft.AspNetCore.App 10.0.x satırlarını görmelisiniz; x kurulu bakım sürümünün numarasını temsil eder. Bu satırlar, örnek uygulamanın kullanacağı çalışma zamanlarının bulunduğunu gösterir.

IIS bağlantısını da kontrol etmek için Server Manager – Tools – Internet Information Services (IIS) Manager yolundan IIS yönetim arayüzünü açın. Soldaki bağlantı ağacında sunucuyu seçip Modules (modüller) listesini açın. AspNetCoreModuleV2 kaydı da varsa yayın dosyalarını hazırlamaya geçebilirsiniz. Çalışma zamanları listelendiği hâlde modül görünmüyorsa Hosting Bundle yükleyicisinde onarım yapın; yeniden başlattıktan sonra aynı listeyi tekrar kontrol edin.

Yayın çıktısını alın, uygulama havuzunu ve yetkileri ayarlayın

Projeyi oluşturup Release çıktısını alın

Örnek uygulamanın yayın dosyalarını geliştirici bilgisayarınızda hazırlayacaksınız; VPS’de derleme yapmanız gerekmez. Windows bilgisayarınıza Microsoft’un resmî .NET indirme sayfasından .NET 10 SDK Windows x64 paketini indirip kurun. SDK, projeyi oluşturma ve derleme araçlarını sağlar. Yeni bir PowerShell penceresinde dotnet --list-sdks komutunu çalıştırın. Çıktıda 10.0.x ile başlayan bir sürüm gördükten sonra aşağıdaki komutları aynı pencerede çalıştırın. Örnekte proje ve yayın klasörlerinin henüz kullanılmadığını varsayıyoruz:

OrnekWeb projesinin yayın çıktısı alınarak VPS’ye taşınmasını, uygulama havuzunun ve klasör yetkilerinin ayarlanmasını gösteren akış.
Akış şeması: Akış, kaynak koddan yayın dosyalarına geçişi ve IIS’in bu dosyaları sınırlı yetkili uygulama havuzu kimliğiyle kullanması için gereken hazırlığı gösterir.
New-Item -ItemType Directory -Force C:\src | Out-Null
Set-Location C:\src
dotnet new webapp -n OrnekWeb -f net10.0
Set-Location C:\src\OrnekWeb
dotnet publish -c Release -r win-x64 --self-contained false -p:AspNetCoreHostingModel=InProcess -o C:\publish\OrnekWeb

Bu komutlar, sayfa tabanlı ASP.NET Core yapısı olan Razor Pages ile veritabanı gerektirmeyen bir web projesi oluşturur ve yayın çıktısını alır. Release, yayına uygun derleme ayarıdır. Framework-dependent, uygulamanın sunucudaki .NET çalışma zamanını kullanması demektir; --self-contained false bunu seçer. win-x64 64 bit Windows hedefini, in-process ise uygulamanın IIS’in istekleri işleyen süreci içinde çalışacağını belirtir.

Yayın tamamlandığında C:\publish\OrnekWeb içinde OrnekWeb.dll, OrnekWeb.runtimeconfig.json, wwwroot ve web.config bulunmalıdır. Otomatik üretilen web.config, IIS’in ASP.NET Core Module üzerinden uygulamayı başlatmasını ve istekleri ona iletmesini sağlar. Dosyayı bir metin düzenleyicide açıp AspNetCoreModuleV2 ve hostingModel="inprocess" değerlerini kontrol edin; eski ASP.NET uygulamalarına ait bir ayar dosyasıyla değiştirmeyin.

Yayın dosyalarını VPS’ye taşıyın

Geliştirici bilgisayarında Uzak Masaüstü Bağlantısı’nı açın. Show Options – Local Resources – More – Drives (seçenekleri göster – yerel kaynaklar – diğer – sürücüler) yolundan yerel C sürücüsünü işaretleyerek VPS’ye yeniden bağlanın. Bu seçim, yerel dosyalarınıza uzak oturumdan erişmenizi sağlar.

VPS’de Dosya Gezgini’nin This PC (bu bilgisayar) bölümündeki yönlendirilmiş C sürücüsünü açın. Buradaki C:\publish\OrnekWeb klasörünün içeriğini, VPS üzerinde oluşturacağınız C:\Sites\OrnekWeb klasörüne kopyalayın. Kaynak projeyi değil, yayın çıktısını taşıyorsunuz; kopyalama bitince web.config doğrudan hedef klasörde görünmelidir.

Bu örnekte hedef klasör boştur. Mevcut yayın dosyaları varsa üzerine yazmak yerine ilerideki güvenli güncelleme adımlarını kullanın. Örnek uygulamada ortamı belirleyen bir değişken tanımlanmadığında varsayılan ortam Production, yani üretim ortamıdır. Geliştirme bilgisayarındaki launchSettings.json IIS ayarı olarak kullanılmaz.

Havuzu ve klasör yetkilerini ayarlayın

Uygulama havuzu, sitenizin çalışacağı süreci ve Windows kimliğini belirler. VPS’de IIS Manager – Application Pools (uygulama havuzları) – Add Application Pool (uygulama havuzu ekle) yolunu açın. Name (ad) alanına OrnekWeb yazın. .NET CLR version (eski .NET Framework çalışma zamanı sürümü) listesinden No Managed Code seçin; Managed pipeline mode (istek işleme modu) değerini Integrated bırakın. ASP.NET Core kendi çalışma zamanını kullandığından eski .NET Framework çalışma zamanını seçmeniz gerekmez. OK ile kaydedince havuz listede görünmelidir.

Oluşan havuzu seçip Advanced Settings (gelişmiş ayarlar) ekranını açın. Enable 32-Bit Applications (32 bit uygulamaları etkinleştir) değerini False, Identity (çalıştırma kimliği) değerini ApplicationPoolIdentity yapıp kaydedin. Böylece bir sonraki bölümde siteyi bu havuza bağladığınızda 64 bit yayınınız, havuza özel IIS AppPool\OrnekWeb Windows kimliğiyle çalışır.

Havuzun uygulama dosyalarını okuyabilmesi için bu kimliğe Windows’un NTFS dosya sistemi üzerinde okuma ve çalıştırma izni verin. VPS’de PowerShell’i yönetici olarak açıp aşağıdaki komutu çalıştırın:

icacls "C:\Sites\OrnekWeb" /grant "IIS AppPool\OrnekWeb:(OI)(CI)RX"

RX okuma ve çalıştırma iznidir; (OI)(CI) izni alt dosya ve klasörlere aktarır. Komutun hata vermeden tamamlanmasının ardından Dosya Gezgini’nde yayın klasörüne sağ tıklayın. Properties – Security (özellikler – güvenlik) ekranında havuz kimliğini seçtiğinizde Read & execute (okuma ve çalıştırma) izni görünmelidir.

Uygulamanın kendi yayın dosyalarını değiştirmesi gerekmediğinden kök klasöre yazma veya tam denetim izni vermeyin. Bu komut mevcut izinleri kaldırmaz; aynı ekranda başka gruplardan gelen geniş yazma izinleri bulunup bulunmadığını da inceleyin. Tanılama gerektiğinde yalnız logs alt klasörüne yazma izni ekleyeceğiz; örnek uygulamanın normal çalışması için buna gerek yoktur.

IIS sitesini açın, alan adını bağlayın ve HTTPS’i doğrulayın

Siteyi oluşturun ve yerel isteği kontrol edin

Yayın klasörünü hazırladınız; şimdi IIS’in bu klasörü hangi alan adı ve uygulama havuzuyla kullanacağını belirleyeceksiniz. VPS’de IIS Manager – Sites – Add Website (site ekle) yolunu açın. Site name (site adı) alanına OrnekWeb yazın; Application pool – Select üzerinden mevcut OrnekWeb havuzunu seçin. Physical path, yani yayın klasörünün yolu için C:\Sites\OrnekWeb girin.

Binding (istekleri siteyle eşleştiren bağlama) bölümünde Type (tür) değerini http, IP address (IP adresi) değerini All Unassigned, Port değerini 80 yapın. Host name (alan adı) alanına kendi alt alan adınızı yazın; burada uygulama.example.com kullanıyoruz. Bu bağlama, belirtilen alan adına gelen HTTP isteklerini OrnekWeb sitesine yönlendirir. OK sonrasında site başlamalıdır. Aynı IP, alan adı ve port birleşimini kullanan başka bir bağlama olmamalıdır.

DNS’i değiştirmeden doğru siteye ulaşabildiğinizi görmek için VPS’de PowerShell üzerinden aşağıdaki komutu çalıştırın; temsilî alan adını kendi alan adınızla değiştirin. Komut, isteği doğrudan yerel IIS’e gönderirken hangi siteyi istediğinizi de belirtir:

curl.exe -i -H "Host: uygulama.example.com" http://127.0.0.1/

Beklenen yanıt 200 OK ve OrnekWeb sayfasının HTML içeriğidir. IIS karşılama sayfası geliyorsa dosyaları değiştirmeden önce sitenin Bindings (bağlamalar) listesindeki alan adını komutta kullandığınız adla karşılaştırın. HTTPS yönlendirmesi varsa Location başlığı yönlendirilen adresi gösterir; şifreli bağlantıyı aşağıdaki adımlarla tamamlayın.

DNS’i ve gelen bağlantıları açın

Yerel kontrol başarılıysa alan adını sunucuya yönlendirebilirsiniz. DNS, alan adını IP adresine çeviren sistemdir. Alan adınızın DNS panelinde bir A kaydı ekleyin: bölgeniz example.com ise ad alanı genellikle uygulama, değer ise VPS’nin genel IPv4 adresidir. Mevcut kaydı değiştiriyorsanız önce eski değerini kaydedin; geri dönüşte bunu kullanabilirsiniz. IPv6 adresini belirten AAAA kaydını da kontrol edin; IPv6 yayını kurmadıysanız aynı ad altında yanlış sunucuya giden bir kayıt bırakmayın.

DNS yönlendirmesi tek başına erişim izni vermez; HTTP ve HTTPS bağlantılarının güvenlik duvarından da geçmesi gerekir. VPS’de Windows Defender Firewall with Advanced Security – Inbound Rules – New Rule yolunu açarak yeni bir gelen bağlantı kuralı oluşturun. Port – TCP – Specific local ports seçip belirli yerel portlar alanına 80,443 girin. Allow the connection (bağlantıya izin ver) seçeneğiyle sunucunun etkin ağ profilinde izin verin; kuralı OrnekWeb HTTP HTTPS adıyla kaydedin. Sağlayıcı panelinde ayrıca ağ güvenlik duvarı varsa aynı gelen TCP portlarını orada da açın; Windows güvenlik duvarını kapatmayın.

Geliştirici bilgisayarında PowerShell’i açın. Temsilî alan adını değiştirerek Resolve-DnsName uygulama.example.com ile adresi, ardından Test-NetConnection uygulama.example.com -Port 80 ile erişimi kontrol edin. İlk komutta VPS’nin genel IP adresini, ikinci komutta TcpTestSucceeded: True sonucunu görmelisiniz. Yanlış IP görünüyorsa DNS kaydını ve önbellekte eski yanıt kalıp kalmadığını inceleyin. IP doğru ama bağlantı başarısızsa önce güvenlik duvarı kurallarına ve IIS sitesinin çalışıp çalışmadığına bakın.

Sertifikayı edinin ve HTTPS bağlamasını doğrulayın

HTTPS, tarayıcıyla sunucu arasındaki bağlantıyı şifreler; bunun için alan adınıza ait güvenilir bir sertifikayı IIS’e bağlayacaksınız. Yeni sertifika için VPS’de IIS Manager’ın sunucu düğümünden Server Certificates – Create Certificate Request (sunucu sertifikaları – sertifika isteği oluştur) yolunu açın. Common name alanına gerçek alt alan adınızı, diğer alanlara istenen kurum ve konum bilgilerini girin. Sağlayıcı olarak Microsoft RSA SChannel Cryptographic Provider, anahtar uzunluğu olarak 2048 seçin. Klasör yoksa Dosya Gezgini’nde oluşturup isteği C:\DeployBackups\OrnekWeb.req dosyasına kaydedin. Bu dosya CSR, yani sertifika imzalama isteğidir.

Oluşan dosyayı Not Defteri ile açıp içeriğinin tamamını güvenilir sertifika sağlayıcınızın sipariş ekranındaki CSR alanına yapıştırın. Siparişte sertifikanın kapsayacağı alan adının gerçek alt alan adınız olduğunu kontrol edin. DNS doğrulamasını seçip sağlayıcının verdiği kayıt türünü, adını ve değerini DNS paneline aynen ekleyin. Sağlayıcının ekranında alan adı doğrulaması tamamlandığında IIS için verilen sertifika dosyasını indirin.

VPS’de Server Certificates – Complete Certificate Request (sertifika isteğini tamamla) ile indirdiğiniz dosyayı seçin; görünen adı OrnekWeb TLS, sertifika deposunu Personal yapın. Sağlayıcının ara sertifikalarını da talimatına göre kurun; bunlar sertifikanızın güvenilir bir kök sertifikaya bağlanmasını sağlar. İsteği bu VPS’de oluşturduğunuz için sertifika buradaki özel anahtarla eşleşir. İşlem bitince sertifikayı Server Certificates listesinde görmelisiniz.

Elinizde özel anahtarı da içeren bir PFX sertifika paketi varsa CSR oluşturma ve tamamlama adımlarına gerek yoktur. Aynı ekranda Import (içe aktar) üzerinden PFX dosyasını ve parolasını girip Personal deposuna aktarın. PFX’i yayın klasörüne koymayın; kurulumdan sonra aktarım kopyasını kaldırıp güvenli yedeğini koruyun.

Sertifika listede göründüğünde Sites – OrnekWeb – Bindings – Add ekranını açın. Type değerini https, Port değerini 443, Host name değerini kendi alt alan adınız yapın. Require Server Name Indication seçeneğini işaretleyin; SNI, aynı IP’de sertifikanın alan adına göre seçilmesini sağlar. SSL certificate (SSL sertifikası) listesinden sertifikanızı seçip kaydedin. Bağlamalar listesinde alan adınızı taşıyan HTTPS kaydı görünmelidir.

Geliştirici bilgisayarınızın tarayıcısında alan adınızı HTTPS ile açın. Sertifika uyarısı olmadan OrnekWeb sayfası görünmeli; tarayıcının sertifika ayrıntılarında alan adı eşleşmesi, geçerlilik tarihleri ve güven zinciri doğru olmalıdır. Uyarı görürseniz IIS bağlamasında seçtiğiniz sertifikayı, kapsadığı alan adını ve ara sertifikaları kontrol edip aynı adresi yeniden açın. Sertifika uyarısını atlayarak yapılan kontrolü başarılı yayın saymayın.

Başlangıç hatalarını ayırt edin ve güvenli güncelleme yapın

Hata koduyla sorunun yerini daraltın

Uygulama açılmıyorsa önce VPS’de Event Viewer – Windows Logs – Application (Olay Görüntüleyicisi – Windows Günlükleri – Uygulama) ekranını açın. İsteği yeniden gönderip o saatle eşleşen IIS AspNetCore Module V2 kayıtlarını inceleyin. IIS günlüklerindeki sc-status ve sc-substatus alanları da ana HTTP kodunu ve alt kodunu gösterir. Günlük klasörünü bulmak için IIS Manager’da OrnekWeb sitesini seçip Logging (günlük kaydı) ekranındaki Directory (klasör) alanına bakın.

Yedek alma, app_offline.htm ile durdurma, dosyaları güncelleme, HTTPS kontrolü ve gerekirse önceki yayına dönme sırası.
Akış şeması: Akış, dosyaları değiştirmeden önce geri dönüş kopyası almayı, uygulamayı bakım sayfasıyla durdurmayı ve kontrol başarısızsa önceki yayına dönmeyi açıklar.
BelirtiAyırt edici kontrol ve dar düzeltme
500.19VPS’den yaptığınız isteğin hata ayrıntısındaki hata koduna ve yapılandırma satırına bakın. Bozuk XML varsa dosyanın kopyasını yayın klasörü dışında saklayıp yalnız hatalı satırı düzeltin; modül tanınmıyorsa Hosting Bundle kurulumunu onarın. Erişim reddinde dosya izinlerini kontrol edin.
500.30Uygulama başlatılamamıştır. Application günlüğündeki istisnayı, yani uygulamanın bildirdiği hatayı inceleyin. Kayıtta belirtilen eksik ayarı veya başlangıç kodundaki hatayı düzeltin; yalnız bu koda bakarak farklı çalışma zamanları kurmayın.
500.31VPS’de dotnet --list-runtimes çıktısını OrnekWeb.runtimeconfig.json ile karşılaştırın. Bu örnekte x64 Microsoft.NETCore.App ve Microsoft.AspNetCore.App 10.0.x gerekir; eksikse uygun Hosting Bundle’ı kurun.
503IIS Manager – Application Pools altında OrnekWeb durumuna bakın. Durmuşsa Event Viewer – Windows Logs – System ekranındaki WAS, yani Windows İşlem Etkinleştirme Hizmeti olaylarını inceleyin. Çökme veya kimlik sorununu giderip havuzu başlatın. Tekrarlı çökmelerde havuzu durduran Rapid-Fail Protection korumasını kapatmayın.
401.3 veya 403.14401.3 için icacls C:\Sites\OrnekWeb ile izinleri inceleyin; gereken kimliğe yalnız okuma/çalıştırma verin. 403.14 için sitenin fiziksel yolunu ve yayın çıktısındaki web.config dosyasını kontrol edin. Dizin listelemeyi açmak uygulamanın başlamasını sağlamaz ve dosya adlarını açığa çıkarabilir.

Her düzeltmeden sonra aynı adresi yeniden açın ve yeni isteğin saatiyle eşleşen hata kaydı oluşup oluşmadığına bakın. Sayfanın yüklenmesiyle birlikte ilgili hatanın tekrarlanmadığını görmek, düzeltmenin işe yaradığını gösterir. Ayarları tek tek değiştirmek asıl nedeni takip etmenizi kolaylaştırır.

Başlangıç günlüğünü geçici açın

Olay kaydı nedenini göstermiyorsa uygulamanın başlangıç çıktısını geçici olarak dosyaya yazdırabilirsiniz. Önce web.config dosyasının kopyasını yayın klasörü dışında saklayın; düzenleme sorun çıkarırsa bu kopyayı geri koyabilirsiniz. Günlük klasörünü oluşturmak ve yalnız bu klasöre yazma yetkisi vermek için VPS’de yönetici PowerShell penceresinde şu komutları çalıştırın:

New-Item -ItemType Directory -Force C:\Sites\OrnekWeb\logs | Out-Null
icacls "C:\Sites\OrnekWeb\logs" /grant "IIS AppPool\OrnekWeb:(OI)(CI)M"

Yayın klasöründeki web.config dosyasını yönetici olarak açtığınız bir metin düzenleyicide açın. Mevcut aspNetCore öğesinde stdoutLogEnabled="true" ve stdoutLogFile=".\logs\stdout" değerlerini ayarlayın; diğer öznitelikleri koruyun. Dosyayı kaydedip isteği tekrarlayın, ardından logs klasöründeki yeni dosyayı okuyun. Bu kayıt, başlangıçta oluşan hatanın ayrıntısını gösterebilir. stdout standart çıktı anlamına gelir; bu günlükleme uygulamanın standart çıktı ve hata akışlarını dosyaya yönlendirir. Dosyalar için otomatik boyut sınırı yoktur.

Tanılama bitince günlükleme değerini false yapıp dosyayı kaydedin. Uygulama bu klasöre yazmıyorsa logs klasörünün Properties – Security – Advanced (Özellikler – Güvenlik – Gelişmiş) ekranından OrnekWeb havuz kimliği için eklediğiniz doğrudan Modify iznini kaldırın; üst klasörden gelen okuma/çalıştırma iznini koruyun. Yeni bir istekten sonra başlangıç günlüğünün büyümediğini kontrol edin.

Günlüklerde parola veya bağlantı bilgisi bulunabileceğinden dosyaları açık paylaşmayın. Ayarların güvenli saklanması için VPS'te gizli anahtar yönetimi yaklaşımını izleyin. Hata ayrıntılarını ziyaretçilere açmamak için Production ortamını Development’a çevirmeyin.

Güncellemeyi geri dönüş kopyasıyla yapın

  1. Yedek alın: VPS’de Dosya Gezgini ile mevcut yayın klasörünün içeriğini, örneğin C:\DeployBackups\OrnekWeb\surum-001 altına kopyalayın. Yedek klasörünü açıp web.config dahil yayın dosyalarının doğrudan bu klasörde bulunduğunu kontrol edin. Bu örnek uygulama kalıcı veri yazmadığından dosya kopyası yeterlidir; veritabanı geçişleri bu işlemin kapsamında değildir.
  2. Uygulamayı durdurun: C:\Sites\OrnekWeb\app_offline.htm dosyasına kısa bir bakım mesajı yazın. Not Defteri kullanıyorsanız kaydederken dosya türünü All Files (tüm dosyalar) seçin; dosya adına .txt eklenmemeli. ASP.NET Core Module uygulamayı kapatır; tarayıcıda sayfayı yenileyip bakım mesajını gördüğünüzü kontrol edin. Dosya kilidi sürerse IIS Manager – Application Pools ekranından yalnız OrnekWeb havuzunu seçip Stop (durdur) kullanın.
  3. Dosyaları değiştirin: app_offline.htm dosyasını koruyarak eski yayın dosyalarını kaldırın ve geliştirici bilgisayarındaki yeni Release çıktısının tamamını aynı yayın klasörüne kopyalayın. Sunucuya özel ayarları yedekle karşılaştırıp gereken değerleri koruyun. Klasörün Properties – Security ekranında havuz kimliğinin kökten gelen okuma/çalıştırma izinlerinin yeni dosyalarda da bulunduğunu kontrol edin.
  4. Kontrol edin veya geri dönün: Havuzu durdurduysanız aynı ekranda Start (başlat) ile başlatın, ardından app_offline.htm dosyasını kaldırın. VPS dışındaki bilgisayarınızdan HTTPS üzerinden ana sayfayı ve Privacy sayfasını açın. Başarısızsa bakım dosyasını yeniden koyun; uygulama durduktan sonra bakım dosyasını koruyarak yeni yayın dosyalarını kaldırıp surum-001 içeriğini geri kopyalayın. Havuzu durdurmanız gerektiyse yeniden başlatın. Bakım dosyasını kaldırarak aynı sayfa kontrollerini tekrarlayın.

Bu yöntem kısa bir bakım kesintisi oluşturur. Kesintiyi azaltmanız gerektiğinde ayrı yayın klasörleri arasında geçiş tasarlanabilir; ancak dosya yolunu değiştirmek tek başına yeterli değildir. Çalışan süreçlerin ve uygulama durumunun da bu geçişe uygun yönetilmesi gerekir.

Sık Sorulan Sorular

Windows VPS’ye .NET SDK kurmam gerekiyor mu?

Hayır. SDK, uygulamayı geliştirmek ve derlemek için kullanılan araç paketidir; bu senaryoda geliştirici bilgisayarınızda bulunması yeterlidir. VPS’ye kaynak kod yerine yayın çıktısını taşırsınız. Sunucuda ise Hosting Bundle’ın sağladığı uygun .NET çalışma zamanı ve uygulamayı IIS’e bağlayan modül gerekir. Sunucuda derleme yapmayı planlamıyorsanız SDK kurmanıza gerek yoktur; SDK’nın kurulu olması da Hosting Bundle’ın yerini tutmaz.

Aynı sunucuda farklı .NET sürümleri çalışabilir mi?

Evet, farklı ana sürümlerin çalışma zamanları yan yana bulunabilir. Örneğin .NET 8 ve .NET 10 hedefleyen iki uygulama, ihtiyaç duydukları çalışma zamanları kuruluysa aynı IIS sunucusunda çalışabilir. Her uygulamaya ayrı uygulama havuzu ayırın. Örnekteki in-process, yani uygulamanın IIS işçi işlemi içinde çalıştığı modelde, birden fazla uygulamayı aynı havuzda çalıştırmak desteklenmez.

Bir çalışma zamanını kaldırmadan önce uygulamaların runtimeconfig.json dosyalarındaki gereksinimleri kontrol edin. Yeni ana sürümü kurmak, eski sürümü hedefleyen uygulamayı kendiliğinden yükseltmez; eski çalışma zamanına hâlâ ihtiyaç olabilir.

Sunucu yeniden başlayınca kullanıcıların oturumu kapanır mı?

Her zaman değil. Kimlik doğrulama çerezlerinin yeniden okunabilmesi, Data Protection adlı veri koruma sisteminin anahtarlarının korunmasına ve uygulamanın bunlara erişebilmesine bağlıdır. Anahtarlar yalnız bellekte tutuluyorsa yeniden başlatma sonrasında kullanıcıların tekrar giriş yapması gerekebilir.

Giriş özelliği eklediğinizde anahtarların nerede saklandığını kontrol edin. Dosya tabanlı kalıcı bir depo seçerseniz bunu yayın klasörünün dışında tutun; böylece güncellemede yayın dosyalarını değiştirirken anahtarları silmezsiniz. Erişimi uygulama kimliği ve gerekli yönetici hesaplarıyla sınırlandırın. Anahtarları diskte şifrelemek için Windows’un veri koruma mekanizması olan DPAPI gibi bir yöntem kullanın.

Anahtarları yedekleme planına dahil edin; şifreli yedeğin geri yüklenen ortamda açılabilmesi gerektiğini de hesaba katın. Bakım aralığında uygulamaya giriş yapıp havuzu yeniden başlatın, ardından aynı tarayıcıda oturumun sürdüğünü kontrol edin. Bellekte saklanan Session, yani sunucu tarafındaki oturum verisi ise kimlik doğrulama çerezi geçerli kalsa bile yeniden başlatmada kaybolabilir.

Sürekli arka plan işlerini IIS uygulamasında çalıştırabilir miyim?

Çalıştırabilirsiniz; ancak IIS uygulamasının sürekli çalışacağına güvenemezsiniz. Havuzun yeniden başlatılması, boşta kalması nedeniyle durdurulması veya yayın güncellemesi, BackgroundService ile başlattığınız işi durdurabilir. AlwaysRunning (havuzun otomatik başlatılmasını sağlayan çalışma modu) ayarı da bu kesintileri tamamen engellemez.

Kuyruktaki işleri sürekli işleyen veya uzun süren görevler için ayrı bir .NET Worker Service, yani arka plan uygulaması oluşturup Windows hizmeti olarak çalıştırmanız daha uygundur. Belirli saatlerde başlayıp biten işler için Windows Görev Zamanlayıcı kullanılabilir. Her iki yöntemde de işin ilerlemesini kalıcı olarak kaydedin ve yeniden denemenin aynı işlemi yanlışlıkla iki kez yapmasını önleyecek şekilde tasarlayın.

Yayına çıkmadan önce son kontrol listesi

Ana sayfanın açılması, uygulamanın çalıştığını gösterir; tek başına yayının hazır olduğu anlamına gelmez. Aşağıdaki listeyle uygulamanın doğru kimlikle çalıştığını, dışarıdan güvenli erişildiğini ve güncelleme sorununda önceki sürüme dönebileceğinizi kontrol edin.

  • Çalışma zamanı mevcut: VPS’de PowerShell üzerinden dotnet --list-runtimes çalıştırın. Bu örnek için Microsoft.NETCore.App ve Microsoft.AspNetCore.App satırlarında 10.0.x sürümlerini görmelisiniz; x, kurulu bakım sürümünü belirtir. IIS Manager’ın sunucu düzeyindeki Modules (modüller) ekranında AspNetCoreModuleV2 de bulunmalı.
  • Havuz doğru kimlikle çalışıyor: IIS Manager – Application Pools – OrnekWeb – Advanced Settings ekranını açın. Identity (çalıştırma kimliği) değeri ApplicationPoolIdentity, .NET CLR Version değeri No Managed Code ve Enable 32-Bit Applications (32 bit uygulamalara izin ver) değeri False olmalı. Ardından Sites – OrnekWeb – Basic Settings (temel ayarlar) altında sitenin OrnekWeb havuzuna bağlı olduğunu kontrol edin.
  • Klasör yetkileri sınırlı: PowerShell’de icacls C:\Sites\OrnekWeb çıktısını inceleyin. IIS AppPool\OrnekWeb kimliği yayın klasörünün kökünde okuma ve çalıştırma yetkisine sahip olmalı; başka gruplar üzerinden yazma izni almamalı. Geçici tanılama için logs klasörüne eklediğiniz yazma izninin, artık gerekmiyorsa kaldırıldığını da kontrol edin.
  • HTTPS dışarıdan çalışıyor: VPS dışındaki bilgisayarınızdan kendi alan adınızı HTTPS ile açın. Ana sayfa ve Privacy sayfası sertifika uyarısı olmadan yüklenmeli. Tarayıcıdaki sertifika bilgilerinde alan adı eşleşmesini ve geçerlilik tarihlerini kontrol edin. Bu deneme, sunucu içindeki kontrolden farklı olarak dış erişimi de sınar.
  • Geçici tanılama kapalı: Yayındaki web.config dosyasında stdoutLogEnabled="false" olduğunu kontrol edin. Uygulamanın Production (üretim) ortamında çalıştığından da emin olun; geçici hata incelemesinden kalmış bir Development ortam ayarı bulunmamalı. Başlangıç tanılamasını kapatırken normal IIS erişim günlüklerini ve uygulamanın hata kayıtlarını açık bırakın.
  • Geri dönüş kopyası hazır: Dosya Gezgini’nde C:\DeployBackups\OrnekWeb altındaki önceki sürüm klasörünü açın; yayın dosyalarıyla sunucuya özel ayarların bulunduğunu kontrol edin. Canlı yayın klasöründe app_offline.htm kalmamalı. Gerektiğinde hızla ulaşabilmek için geri dönüş adımlarını ve kullanılacak sürümün klasör yolunu kaydedin.

Bir sonraki adımınız izleme ve sertifika yenilemesi olsun. Dışarıdan HTTPS erişimini ve beklenen sayfa içeriğini izleyen bir kontrol kurun; deneme bildirimi göndererek uyarıların size ulaştığını kontrol edin. Sertifikanın yenilenmesinden kimin sorumlu olduğunu ve yenileme takvimini belirleyin. Otomatik yenileme kullanıyorsanız yeni sertifikanın IIS bağlamasına da uygulandığını kontrol edin. Böylece ilk yayından sonra erişim sorunlarını ve sertifika bakımını da takip edebilirsiniz.

↑