DigitalOcean Üzerinde .NET Core MVC Uygulamanızı Çalıştırın
Önceki yazımızda DotNet Core MVC hakkında gelişmeleri sizlere aktarmıştık. Yazının üzerine gelen yorumlar arasında Hakan tarafından da aşağıdaki gibi bir öneri gelmişti:
.NET Core uygulamaların diğer bulut platformlarına deploy edilmesi hakkında Türkçe bir kaynağın olmamasının yanı sıra derli toplu bir İngilizce kaynak dahi bulmak güçlük teşkil etmekte. Bu nedenle Türkçe bir yazı hazırlanması gerçekten faydalı olacağını düşündüğümüz için bu yazıyı hazırladık. Bu yazımızda .NET Core Uygulamasının self-contained bir şekilde Linux bir sunucu üzerinde nasıl çalıştırılacağına değineceğiz. Dilerseniz öncelikle DigitalOcean üzerinde Droplet’imizi oluşturalım.
DigitalOcean üzerinden Droplet’in oluşturulması
DigitalOcean üzerinde bir droplet oluşturabilmek için öncelikle bir hesap oluşturmanız gerekiyor. DigitalOcean üzerinde hesap oluşturmak için referans linkimi kullanabilirsiniz. Hesap oluşturduktan sonra Droplets sayfasına gelindiğinde bizi boş bir droplet oluşturma ekranı karşılıyor olcaktır.
Create Droplet butonuna tıkladığınızda Choose an image kısmından ilgili Ubuntu dağıtımını seçebilirsiniz. Ben bu yazıyı oluştururken Ubuntu 16.04.3 x64 sürümü seçili halde geldiği için bu sürüm üzerinden devam ettim. Siz de bu sürümü seçebilirsiniz.
Choose a size kısmında ise bizi bir fiyat listesi karşılıyor. Standard Droplets bölümündeki listede en yukarıda (en ucuz olarak) yer alan aylık 5 dolarlık sürüm yeterince işinizi görecektir.
Add block storage bölümünü atladıktan sonra Choose a datacenter region kısmına gelelim. Ağ gecikmelerinin daha az yaşanması için ülkemize en yakın olan bölgeyi seçmemiz gerekiyor. Frankfurt seçeneği diğerlerine göre ülkemize daha yakın konumda bulunduğu için bu bölgeyi seçiyoruz.
Select additional options bölümünü atladıktan sonra Add your SSH keys kısmına gelelim. Sunucuya SSH üzerinden bağlanacağımız için bu kısım önem teşkil etmektedir (Web üzerinden Console’a erişim seçeneği de var fakat ben bu yöntemi çok sağlıklı bulmuyorum. Zira copy-paste gibi özellikler Console’da çalışmayacaktır). Eğer daha önceden elinizde bulunan bir SSH anahtarınız varsa public anahtarını buraya yapıştırabilirsiniz. Aksi halde yeni bir SSH anahtarı oluşturmanız gereklidir.
Windows üzerinden SSH bağlantısı yapmak için en meşhur yöntem PuTTY kullanmaktır. Resmi sitesinden 64 bitlik versiyonunun kurulumunu yapabilirsiniz. Kurulum tamamlandıktan sonra SSH anahtarı oluşturmak için Windows Başlat menüsünü açtıktan puttygen
yazıp çıkan listeden PuTTYgen’i seçerek uygulamayı çalıştıralım.
Public/Private anahtarların oluşturulması için Generate tuşuna basmamız gerekiyor. Bastıktan sonra oluşturulacak anahtarın rastgeleliğinin olabildiğince yüksek olabilmesi için uygulama, ekran üzerinde fare imlecini hareket ettirmenizi gerektiriyor ve imleci hareket ettirdiğiniz sürece işlem çubuğu dolmaya başlıyor. İşlem tamamlandıktan sonra ekranda birçok karakterden oluşan Public key’iniz oluşuyor. Save public key ve Save private key butonlarına basarak ilgili anahtarları dosya sisteminize kaydetmeniz gerekiyor.
Devamında ise kopyaladığınız public anahtarı DigitalOcean’daki SSH key content alanına yapıştırmanız gerekiyor. Name alanına ise bulunduğunuz tarihin yyyymmdd biçimindeki formatını ve devamında uygulama adı ile birlikte Putty_public_key şeklinde giriş yapabilirsiniz (Örnek: 20180211_DevNotCore_PuTTY_public_key).
Finalize and create kısmında ise dilerseniz host adı verebilir veya Tag ekleyebilirsiniz. Ben bu bölümde hiçbir değişiklik yapmadan Create butonuna basmanızı tavsiye ederim (İsterseniz daha sonra oluşturduğunuz droplet’in adını değiştirebilirsiniz).
Dropletin oluşturulması birkaç saniyenizi alabilir. Tamamlandığında Go change the world! gibi deyim yerindeyse gaza getirici bir mesaj ile karşılaşacaksınız:
Droplet oluştuktan sonra artık ASP MVC uygulamamıza geçebiliriz.
.NET Core MVC uygulamasının oluşturulması
.NET Core uygulamalarının oluşturulabilmesi için öncelikle sisteminizde dotnet komut satırı aracının yüklü olması gerekiyor. Microsoft’un resmi sayfasından .NET SDK’ini indirip sisteminize kurabilirsiniz. Devamında C:\ dizininde DevNotCore isimli bir dizin oluşturup, içine girerek dotnet new mvc
komutu ile yeni bir .NET Core MVC uygulaması üretebilirsiniz.
Uygulama oluşturulduktan sonra dotnet run
komutunu kullanarak uygulamayı ayağa kaldırabilirsiniz.
Tarayıcıdan localhost:5000’e girdiğinizde MVC uygulamanızın çalışıyor olduğunu göreceksiniz:
- Not: Burada web uygulaması IIS’ten bağımsız olarak Console uygulaması üzerinde çalıştığı için
Ctrl + C
tuşuna bastığınızda veya konsolu kapattığınızıda uygulamaya erişim de kesilecektir. Burada sadelik teşkil etmesi açısından sadece başlangıç uygulamasını oluşturduk. Uygulamayı kendi isteğinize göre geliştirebilirsiniz.
.NET Core MVC uygulamasının yayımlanması
.NET Core MVC uygulamasının yayımlanması için öncelikle DevNotCore.csproj
dosyasına uygulamanın çalışacağı ilgili Runtime Id’yi eklemeniz gerekiyor. Droplet’in üzerinde koşan işletim sistemi Ubuntu 16.04.3 x64 olduğu için RID olarak da ubuntu.16.04-x64 eklenebilir. .NET Core RID Kataloğuna buradan ulaşabilirsiniz. Şimdi aşağıdaki satırları ekleyelim:
<PropertyGroup>
<RuntimeIdentifiers>ubuntu.16.04-x64</RuntimeIdentifiers>
</PropertyGroup>
VSCode üzerinden değişiklik yapıldığında proje dosyasının son hali aşağıdaki gibi görüntülenecektir:
.csproj dosyasını kaydedip konsol ekranına geri dönelim ve kodumuzu self-contained
halde yayımlamak için aşağıdaki kodu çalıştıralım:
dotnet publish -c Release -r ubuntu.16.04-x64 --self-contained
Uygulama --self-contained
parametresi ile yayımlandığında, oluşacak publish
dizin içerisine .NET Runtime’ı ile ilgili bütün dosyalar kopyalanır. Bu sayede uygulamanın çalıştırılacağı Linux sunucuda .NET ile ilgili herhangi bir kurulumun yapılmasına gerek kalmaz. Şimdi publish dizinini DigitalOcean’daki sunucumuza nasıl atmamız gerekiyor ona değinelim.
FileZilla kullanılarak uygulamanın sunucuya atılması
FileZilla, bir dosya iletim aracı olup, FTP, SFTP gibi protokoller vasıtasıyla uzak sunucuya dosya gönderilmesine olanak tanır. Eğer sisteminizde FileZilla kurulu değilse resmi sitesinden indirip kurulumunu yapabilirsiniz.
SFTP protokolü ile gönderim yapabilmek için öncelikle FileZilla’ya SSH private key’imizin ne olduğunu söylemek gerekiyor. Bunun için FileZilla menüsündeki Edit
-> Settings...
kısmından sonra gelen ekranda sol bölmede SFTP
‘yi seçip Add key file...
butonuna basarak PuTTY ile oluşturduğumuz private key’imizin konumunu veriyoruz. OK
dedikten sonra SFTP iletişiminin kurulumlarında FileZilla artık SSH private anahtarımızı tanıyor olacaktır.
Artık oluşturduğumuz droplet’e bağlanabiliriz. DigitalOcean sitesindeki droplet IP’mizi yazıp gerekli alanları da aşağıdaki gibi doldurduktan sonra QuickConnect butonuna basarak bağlantı işlemini gerçekleştirelim.
Bağlantı esnasında sunucu bize aşağıdaki ekrandaki gibi pencerede SSH anahtarının parolasını soracaktır. SSH anahtarının oluştururken girdiğimiz parolayı buraya girmemiz gerekiyor.
Eğer bu adımıda başarılı ile geçtiysek Status kısmında Directory listing of "/root" successful
mesajını alıyor olacağız.
FileZilla penceresindeki sol tarafta yer alan Remote Site
kısmında /usr dizinini seçerek içine girelim ve sağ click ile çıkan menüde Create directory and enter it
seçeneğini seçerek oluşturacağımız proje dizininin yolunu aşağıdaki şekilde girelim.
/usr/projects/DevNotCore
FileZilla penceresindeki sağ tarafta yer alan Local Site
kısmında local makinemizde oluşturduğumuz projenin publish dizininin yolunu girelim:
C:\DevNotCoreConsole\bin\Release\netcoreapp2.0\ubuntu.16.04-x64\publish\
publish dizini içerisindeki dosyaları Ctrl+A ile seçerek sağ click yardımıyla çıkan menüde Upload tuşuna basalım. Bu sayede publish klasörü içerisindeki dosyalar droplet’teki DevNotCore dizininin altına kopyalanacaktır. Bu işlem biraz zaman alabilir bu süre içerisinde kendinize bir çay-kahve hazırlayabilirsiniz
Dosyaların tamamı upload edildikten sonra sunucumuza PuTTY üzerinden SSH ile bağlanabiliriz.
PuTTY üzerinden SSH ile bağlanarak uygulamayı çalıştırma
SSH bağlantısını kurmadan önce aynı FileZilla adımında yaptığımız gibi PuTTY’ye SSH private anahtarımızı vermemiz gerekiyor. Bunun için uygulamayı açtıktan sonra çıkan penceredeki sol menüde Connection
-> SSH
-> Auth
yolunu izleyerek Private key file for authentication
kısmındaki Browse
butonuna basarak ilgili SSH private key dosyasını seçelim.
SSH anahtarını tanıttıktan sonra yine sol panelde Session kısmına gelerek sunucu IP’sini girip Open
‘a basmamız yeterli olacaktır.
Çıkan konsol ekranında root
girdikten sonra SSH parolasını girerek sunucuya erişim yapabiliriz:
cd komutunu kullanarak aşağıdaki şekilde proje dizinine gidelim:
cd ../usr/projects/DevNotCore/
Devamında projenin çalışabilmesi için gerekli libxxx.so
kitaplıklarını ldd
komutunu kullanarak eklememiz gerekiyor:
ldd lib*.so
Bu aşamada normalde DevNotCore
yazıp Enter’a tuşladığımızda uygulamamızın çalışması gerekiyor fakat uygulamamız $PATH içerisinde yer almadığı için öncelikle $PATH değişkenini güncellememiz gerekiyor:
export PATH=$PATH:/usr/projects/DevNotCore
Eğer şimdi DevNotCore yazıp çalıştırdığınızda localhost:5000 üzerinden uygulamanın çalıştığını ibare eden satırları göreceksiniz. Fakat uygulamayı sunucu üzerinden dışa açabilmek için bir Reverse Proxy oluşturmamız gerekiyor. Bu sayede reverse proxy ile sayfaya gelen istekler .NET Core uygulamasına iletilebilecektir.
Nginx’in kurulması
Reverse Proxy için Nginx’in kurulumuna aşağıdaki komut ile başlayabiliriz:
sudo apt-get install nginx
apt-get
aracı Nginx’in arka planda servis olarak çalışmasını sağlayacak System V init script’ini oluşturur. Bu sayede aşağıdaki komut yardımıyla Nginx servisinin ayağa kalkmasını sağlayabiliriz:
sudo service nginx start
Şimdi droplet IP’sini internet tarayıcısına girdiğinizde aşağıdaki ekranla karşılaşacaksınız:
Bu ekranı baz aldığımızda Nginx doğru bir şekilde çalışıyor demektir. Şimdi nginx’i gelen istekleri http://localhost:5000
e yönlendirmesi için yapılandıralım. Aşağıdaki komutu kullanarak vim ile dosyayı açalım:
vim /etc/nginx/sites-available/default
vim editörü açıldıktan sonra tüm satırları aşağıdaki vim komutu ile tek seferde silelim:
:1,$d
Şimdi klavyeden i
tuşuna basıp düzenleme moduna geçelim. Aşağıdaki satırları kopyalayarak mouse sağ click yapıp vim’e yapıştıralım:
server {
listen 80;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $http_host;
proxy_cache_bypass $http_upgrade;
}
}
Daha sonra Esc
tuşuna basıp :wq
komutunu girerek kaydedip vim’den çıkalım. Nginx yapılandırma dosyasını test etmek için aşağıdaki komutu çalıştıralım:
sudo nginx -t
Eğer yapılandırma doğru sonuçlandıysa Nginx’i ilgili değişiklikleri uygulaması için yeniden başlatalım:
sudo nginx -s reload
Şimdi aşağıdaki komutu çalıştırarak MVC uygulamamızı çalıştıralım:
DevNotCore
Tarayıcıdan droplet IP’sini girdiğinizde sitenizin yayında olduğunu göreceksiniz:
Sonuç olarak
IIS ve .NET Runtime bağımsız bir işletim sisteminde bir .NET projesi çalıştırmak çok verimli bir olay. Bununla beraber .NET Core MVC uygulamasının Linux üzerinde aylık $5 gibi bir ücret karşılığında çalıştırılması gerçekten katma değeri yüksek projeler üretmeyi sağlıyor.
Eğer sizin de .NET Core MVC uygulama geliştirimi hakkında sorularınız veya görüşleriniz varsa yorum kısmından bize yazabilirsiniz. Bir sonraki yazımızda görüşmek üzere.
2 Comments
Huseyin
4 Mart 2018 at 15:16Merhaba, yazı için teşekkürler.
Uygulamayı denerken iki hatayla karşılaştım. Hataları ve nasıl geçtiğimi yazayım dedim.
İlk hatayı proje path inden sonra projeyi çağırdığımda Permission denied aldım.
root@ubuntu-s-1vcpu-1gb-fra1-01:/usr/projects/DevNotCore# TestMvc
-bash: /usr/projects/DevNotCore/TestMvc: Permission denied
Bu hatayı chmod u+x TestMvc yazarak geçtim fakat bu seferde şu şekilde bir hata aldım.
Failed to load ▒▒`, error: libunwind.so.8: cannot open shared object file: No such file or directory
Failed to bind to CoreCLR at ‘/usr/projects/DevNotCore/libcoreclr.so’
Bu hatayı da sudo apt-get install -y libunwind-dev yazarak geçtim.
Zafer Ayan
6 Mayıs 2018 at 16:54Hüseyin merhaba,
Permission ile ilgili bir hata almamıştım, yapılandırma ile alakalı olabilir. Teşekkür ederim. lib.*so uzantılı dosyaları ldd lib.*so komutu ile yükleyebilirsin.
Değerli yorumun için teşekkürler.