İçeriğe geç

Ubuntu Server 20.04 LTS İşletim Sisteminde DotNet Uygulamasının Kurulumu ve Linux Dotnet Servis Ayarı

Merhabalar. Değerli okuyucu bugün Linux altyapısına sahip olan Ubuntu Server 20.04 LTS İşletim Sisteminde DotNet uygulamasını yükleyerek ve sürekli çalışmasını sağlayacak DotNet servis dosyasını oluşturacağız.

Neden DotNet Servis Oluşturalım Ki?

DotNet uygulaması tamam da neden bir servise ihtiyacımız olsun ki? diyebiliriz. Hadi servisi oluşturduk da nasıl yeni dosyalar gelecek nasıl güncellemesini nasıl yapacağız? Tabii ki bu soruları sizden önce ben sordum ve birkaç 100 internet sitesini kurcaladıktan sonra sistemi oturttum diyebilirim. DotNet servis dosyalarını ayağa kaldırmak için “dll” dosyalarını kullanıyoruz. Tabii bu servisler sürekli çalışan servisler diyebilirsiniz. Peki arkadaşım bu servis dosyalarını nasıl yeniden başlatacağız? Bunun da çözümü “.sh” dosyasında gizli. Bash komut dosyaları genellikle Linux İşletim Sisteminde yer alan ve sistemdeki birçok işlemi dosyalara komut satırı yazarak çalıştırıp arka planda sürekli çalışmasını sağlayabilirsiniz. Tabii bu “bash” dosyalarını arka planda çalıştıracak bir servis gereklidir. Gelin Birlikte bu sistemi nasıl kuruyoruz öğrenelim.

Dotnet Uygulamasının Kurulumu

Proxmox’ta VM’in Kurulması ve Linux Ubuntu Server 20.04 LTS İşletim Sisteminin kurulması

Burada yine önceki yazılarımda yaptığım gibi Proxmox fiziksel sunucusunda yeni bir VM açacağız. Sonrasında o VM’in içine Linux altyapısını kullanan Ubuntu Server 20.04 LTS işletim sistemini entegre edeceğiz. Bu adımı hızlıca geçeceğim çünkü bunu daha önce bir blog yazısında yazmıştım. İncelemek isterseniz buradan yazıya ulaşabilirsiniz.

VM’e Uzaktan Giriş ve Gerekli İlk Komut Satırları

Neredeyse her blogta bahsettiğim gibi ben bu tarz örnek uygulamaları yeni bir Sanal Makine kurarak gerçekleştiriyorum. Eğer yeni bir Sanal Makine kurmak istiyorsanız bir önceki maddenin bağlantısına tıklayarak Ubuntu Server 20.04 LTS İşletimini nasıl kurduğumu görebilirsiniz. Tekrardan PuTTy uygulamasıyla Sanal Makineye uzaktan bağlanıp gerekli komut satırını yazmaya başlayalım

wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update; \
sudo apt-get install -y apt-transport-https && \
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-6.0
sudo apt-get update \
sudo apt-get install -y apt-transport-https && \
sudo apt-get update && \
sudo apt-get install -y aspnetcore-runtime-6.0

Yukarıdaki komut satırlarını Microsoft Şirketinin resmi internet sitesinden aldım. Buraya tıklayarak detaylı olarak ulaşabilirsiniz.

Yeni bir Web Api oluşturmak için iki tür yöntem var. 1. olarak Visual Studio veya Visual Studio Code uygulamalarından kolaylıkla oluşturup bu tür projeleri uygulama üzerinden yayınlayabilirsiniz.

2. olarak ise Linux üzerinden nasıl yayınlayabiliriz sorusuna gelelim. Burada “dotnet” komut satırı çok işimize yarayacaktır. Öncelikle bir Web Api Linux ortamında nasıl oluşturuluyor görelim.

sudo dotnet new webapi -o ornekWeb1

buradaki “ornekWeb1” bölümü yazılan yazı mevcut konuma “ornekWeb1” ismindeki dosyaya Web Api dosyalarını kur demektir. bunu örneğin “/var/www/ornekWeb1” şeklinde değiştirebilirsiniz. Peki biz bunu nasıl yayınlarız (yani publish) sorusuna gelelim. Aşağıda komut satırı vardır.

sudo dotnet publish -c release -o /var/www/ornekWeb1

Burada ise iki önemli durum var. 1. durum “-c release” durumu burada son sürüme göre publish yapmaktadır. “-c release” bölümünü kaldırırsanız Debug olarak publish edecektir. Farkı siz araştırırsınız. Daha detaylı bilgi için bu linke tıklayabilirsiniz.

Tüm bu işlemleri bitirdikten sonra örnekteki “/var/www” konuma giderek “ornekWeb1.dll” dosyasını aşağıdaki komut satırıyla birlikte dış ortama açabilirsiniz. Tabii ki bu direkt olarak “https://VM_IP_Address:Port_Number” olarak açılmayacaktır. Aşağıdaki komut satırını uyguladıktan sonra gerekli port numarasını ve “http” ve “https” protokollerine göre port numarasını vermiş olacaktır. Diğer blog yazılarımda bahsettiğim port sayısını dış dünyaya açmayı “ufw” komut satırıyla birlikte açıyoruz.

sudo dotnet ornekWeb1.dll
# Port numarasını öğrendikten sonra “ctrl+c” veya “ctrl+z” ile çıkış yapıp port numaralarını dış dünyaya açıyoruz.
sudo ufw enable
sudo ufw allow Https_Port_Number/tcp
sudo ufw allow Http_Port_Number/tcp

Bu işlemleri yaptıktan sonra “http/https://VM_IP_Address: Port_Number/swagger/index.html” adresine erişebiliyorsanız işleminiz başarılı bir şekilde yapılmıştır.

Linux Dotnet Service Kurulumu

Dotnet Uygulamasının kurulumunu öğrendikten sonra sistemin arka planda çalışabilmesi için yani ne diyorum “dotnet ornekWeb1.dll” komutunu arka planda çalıştırabilmek için bir adet Web Servisini oluşturmalı ve gerekli komut satırlarını kullanarak “.service” dosyasının içeriğini doldurmalıyız. Gelin birlikte nasıl yapacağız öğrenelim.

cd /etc/systemd/system/

Yukarıdaki komut satırı Linux içerisindeki tüm servislerin dosya konumları bulunmaktadır. Öncelikle örnek bir Web Api dosyalarını oluşturduktan sonra (yani ben öyle yapıyorum) aynı isimle örnek bir servis oluşturalım.

sudo nano ornekweb1.service

Sistemin çalışabilmesi için öncelikle “dotnet” komut satırının konumunu öğrenmeliyiz. Bu uygulama her sistemde farklı bölümlerde yer almaktadır. Ubuntu İşletim sisteminde “/usr/share/dotnet/” konumunun içinde “dotnet” ismindeki uygulamadır. Uygulamanın sisteminizde nerede bulunduğunu öğrenmek için şu komut satırı uygulanmaktadır.

sudo dotnet –info

Dotnet Servisinin Oluşturulması

Dotnet Servisinin oluşturulması için aşağıda örnek olarak komut satırları verilmiştir.

[Unit]
Description=BuggyAmb is a really buggy application

[Service]
WorkingDirectory=/var/www/UserAPI/
ExecStart=/usr/share/dotnet/dotnet /var/www/UserAPI/UserAPI.dll
# Restart service after 10 seconds if the dotnet service crashes:
KillSignal=SIGINT
SyslogIdentifier=buggyamb-identifier
User=backend
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
Environment=ASPNETCORE_URLS=http://localhost:8013

[Install]
WantedBy=multi-user.target

Gelin birlikte yukarıdaki komut satırılarını inceleyelim.

Öncelikle 1. olarak komut satırları 3 sistemden oluşmaktadır. 1. kısım “Unit” kısmıdır. Bu kısım Tanımlama kısmıdır. Buraya istediğiniz yazıyı “Description” karşısına yazabilirsiniz.

2. kısım ise “Service” kısmıdır. Teker teker inceleyelim. “WorkingDirectory” kısmı “dotnet” Web Api uygulamamızın dosyalarının publish edildiği kısımdır. Lütfen dikkat edelim. Eğer ki dosyamızı Linux bölümünde kuracaksak publish edildiği kısım ile kodların oluşturulduğu kısım tamamen farklıdır. Buna dikkat edelim.

“ExecStart” kısmı iki kısımdan oluşuyor. İlk kısım “sudo dotnet –info” komut satırıyla elde ettiğimiz dotnet komut satırının konumunun bulunduğu yerdir. bu kısmın ikinci kısmı ise publish edilen dosya konumunda bulunan çalıştırılacak “dll” dosyasının konumudur.

“User” kısmı ise sistemimize girdiğimiz ve root yetkisine sahip olan kullanıcımızın ismidir. Genellikle kurulumda kurdumuz kullanıcı ismi ile aynı olmaktadır.

“Environment” kısmındaki “ASPNETCORE_URLS” bölümü burada aslında bu örnek servisteki ikinci en önemli kısımdır. Çünkü biz ne demiştik “dotnet” komut satırını “dll” dosyasıyla birlikte kullandıktan sonra bize kodun örnek olarak oluşturduğu Port numarasını öğrenmemiz gerekiyordu. Artık bunu öğrenmemize gerek yok çünkü bu bölümde “http://localhost:8013” örnek port numarası ile birlikte “dotnet” komut satırını çalıştırırken artık bu port adresiyle giriş yapabileceğiz. Aşağıda ufak bir port numarasını dış dünyaya açalım.

sudo ufw enable
sudo ufw allow 8013/tcp

3. kısım ise “Install” kısmıdır. Bu kısım default olarak kalması normaldir.

Evet örnek dosyamızı incelediğimize göre gelelim bunu sistemimize nasıl entegre edeceğimizi görelim.

sudo systemctl enable ornekweb1.service
sudo systemctl daemon-reload
sudo systemctl start ornekweb1.service
sudo systemctl status ornekweb1.service

Evet sevgili okuyucu eğer bu noktaya geldiyseniz ve servisiniz çalışıyorsa sistemin %50’lik kısmını bitirmişsiniz demektir. Gelelim bu servisin otomatik olarak dosyalara bağlı olarak değiştirelim.

Linux Dotnet Yardımcı Servisinin kurulması ve Bash Dosyanın Yapılanması

İlk başta verdiğim resmin soldaki iki kısmını hallettik. Gelelim sağ bölümüne. Şimdi sevgili okuyucu sistemi oluştururken 3 uygulamayı kullanıyoruz. Bunlar Dotnet Uygulaması, NGINX Uygulaması ve Bash komut satırıdır. NGINX Uygulamasını başka bir blog yazısında yazacağım.

Bash Dosyasının Kurulumu ve Yapılandırılması

Biz Bash dosyasının neden kurulmasına ve yapılandırılmasından bahsedelim. Yukarıda bahsettim ancak ayrıntılı anlatmam gerekirse, biz bu dosyayı oluştururken şunu amaçlıyoruz. Amacımız, mühendislerimizin projelerinde sistemin güncellenmesi için bu dosyaya ihtiyacımız var. Peki sorabilirsiniz ben bu dosyanın içinde neyi takip edeceğim de ona göre Dotnet servisini nasıl reload yapacağım gibi sorular aklınıza geliyor olabilir. Biz burada VSFTPD uygulamasının loglarına izleyerek Dotnet servisini tabiri caizse kapatıp açıyoruz. Gelin birlikte Bash dosyanın içeriğine bakalım.

Bash Dosyasının İçeriği

Aşağıda örnek Bash dosya içeriği aşağıda verilmiştir.

#!/usr/bin/bash

sudo tail -F /var/log/vsftpd.log | while read line;
do
if echo “$line” | grep -q ‘OK UPLOAD:’; then
filename=$(echo “$line” | cut -d, -f2)
if [[ $filename == *”ornekWeb2/UserAPI.dll”* ]]; then
# Stop servic
sudo systemctl daemon-reload
sudo service ornek3 restart
echo ‘userapi.service has been restarted’
fi
fi
done

Buradaki komut satırlarını teker teker inceleyelim. 1. olarak “!/usr/bin/bash” bölümü. Buradaki komut satırı bash komut satırının konumunu belirtiyor. Bu konumu sisteminize göre değişiklik gösterebilir dikkatli olalım. 2. olarak “sudo tail -F /var/log/vsftpd.log” bölümü. Buradaki komut satırı VSFTPD Uygulamasınında son 10 log satırında bir değişiklik olursa log bölümünde gösteriyor. Biz de buna güvenerek değişiklik yapacağız. 3. olarak “filename=$(echo “$line” | cut -d, -f2)” bölümü. burada “filename” bölümüne VSFTPD Uygulamasında belirli bölgede bir dosya değişiklik olursa o dosyanın konumunu aktarılmıştır. 4. olarak “if [[ $filename == “ornekWeb2/UserAPI.dll” ]];” bölümü. Biz burada eşliyoruz. “filename” değişkenindeki konum ile örnek olarak gösterilen “ornekWeb2/UserAPI.dll” ile eşleniyorsa if koşulunun içine girmektedir.

4. Maddeye ait Not: Ben burada özellikle şunu öneriyorum projenin bir dosyası olmasa iyi olmaktadır. Çünkü projenin bir dosyası olursa dosya aktarılırken ortada başta veya sonra bu dosya aktarılabilir. Bu yüzden benim tavsiyem boş bir “txt” dosyası oluşturup ve If koşuluna bağlarsak ve tüm dosyaları aktardıktan sonra aktarırsak sistemin yenilenmesi daha çok sağlıklı olur.

If koşulunun içindeki komut satırları şu şekildedir. 1. olarak “sudo systemctl daemon-reload” komut satırı “systemctl” komut satırındaki tüm servislerindeki tüm servisleri tekrardan başlatır. 2. olarak ise “sudo service ornek3 restart” burada ise gerekli servisin “service” komut satırıyla tekrardan başlatmasını sağlanmaktadır.

Bash Dosyasının Servisinin Oluşturulması

Dotnet dosyalarının çalıştırılması için Servisini oluşturuyorsak aynı şekilde Bash dosyasının da arka planda çalışabilmesi için bir servis (yani ben yardımcı servis söylüyorum) kurmamız gerekmektedir. Gelin bakalım yardımcı servisin içeriğine bakalım.

[Unit]
Description=Watches vsftp log for successful uploads
[Service]
ExecStart=/usr/bin/bash /var/www/sh-files/pm2ftp.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target

Burada Önemli olan “Service” bölümüdür. “ExecStart” bölümünde yer alan “/usr/bin/bash /var/www/sh-files/pm2ftp.sh” bölümüdür. burada “/usr/bin/bash” konum Bash komut satırının konumudur ve “/var/www/sh-files/pm2ftp.sh” bölümü “.sh” dosyasının konumunu belirtir. Diğerleri default olarak kalabilir.

Test olarak aşağıdaki linki girip çalışıp çalışmadığna bakalım.

http://VM_IP_Address:Port_Number/swagger/index.html

buraya kadar geldiyseniz sistem başarılı bir şekilde sistemi ayağa kaldırmışsınız demektir.

Sonuç olarak..

Değerli okuyucu, biz burada bir dotnet Web Api oluşturduk ve “publish” yani yayınlama ile dosyaların kodlardan çıkarak “dll” dosyasına dönüştürdük. Linux tabanında yer alan Ubuntu Server 20.04 LTS İşletim Sisteminde yer alan “dotnet” komut satırıyla birlikte başarılı bir şekilde “dll” dosyasını ayağa kaldırdık. Sonra yetmedi biz çalıştırılacak “dll” dosyasını arka planda nasıl çalışır diye düşündük ve Dotnet Servisini oluşturduk. Bu servis ilk planda 10 saniyede bir yeniden başlatılıyordu ve onu değiştirdik. Sonra tekrar düşündük biz dosyaları VSFTPD Uygulaması üzerinden atarken neden ona göre projenin servisini tekrar başlatmayalım. Bu düşünceye göre Bash dosyasını oluşturduk. İçerine göre koşullar koyduk ve ayağa kaldırdık. Tabii bu Bash dosyasının arka planda çalıştırılması gerekmektedir. Çünkü aynı “dotnet” komut satırı gibi “bash” komut satırını arka planda çalıştırmamız gerekiyor. Bunun için bir servis oluşturduk. Ve son olarak sistemi ayağa kaldırmış olduk. Youtube kanalımdan diğer uygulamalardan haberdar olmak istiyorsanız linke tıklayarak takip edebilirsiniz.

Kategori:.Net CoreBackendBackend ServiceDevOpsDotnetDotnet ServiceLinuxLinux ServiceNGINXProxmoxUbuntuUbuntu Service

Tek Yorum

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir