ASP.NET Core projelerinizi Docker + Ngnix + CloudFlare desteği ile kendi alan adınız altında yayınlayın 🚀

Uygulamalı anlatım ile bütün süreçleri ele aldığımız bu yazıda CloudFlare & Ngnix & Docker güçlü kombinasyonu ile projelerinizi kendi alan adınız altında yayınlayabileceksiniz

Murat Dinç
Devops Türkiye☁️ 🐧 🐳 ☸️
7 min readAug 22, 2023

--

Selamlar,

Sanallaştırma teknolojilerinin hayatımızda yer alması ile birlikte lisans maliyetinden kaçmak, daha performanslı, daha esnek bir ortam oluşturabilmek için ASP.NET Core uygularımızı docker, podman vb. gibi araçlar üzerinden Linux sunucular üzerinden yayına almaya başladık.

Uygulamanızı sadece docker ya da podman üzerinde ayaklandırmanız yayına almak için yeterli bir hazırlık sağlamayacaktır. Canlı bir ortama docker kullanarak proje nasıl yayına alınır ve ilgili ayarlamalar nasıl yapılır gibi sorulara cevap vermesi adına bu makaleyi yazmaya karar verdim.

Uygulamalı projemize başlamadan önce kullanacağımız araçlar ve platformlar ile alakalı biraz bilgi edinelim 👇🏻

Ngnix

Nginx açık kaynaklı bir web server, load balancer ve proxy rerverse sunucusudur. İlk olarak Igor Sysoev tarafından Rusya’daki Rambler.ru sitesi için yazılmıştır ve ilk sürümü 2004 yılında yayınlanmıştır. Daha sonra popülaritesi artarak dünya genelinde birçok web sitesi ve uygulama tarafından kullanılmaya başlanmıştır. Özellikle yüksek performans, düşük hafıza kullanımı, yüksek eşzamanlı kullanıcı desteği ve esnek yapılandırma seçenekleriyle bilinir.

  • Web Server: Statik ve dinamik içerikleri sunabilen hızlı ve hafif bir web sunucusudur.
  • Load Balancer: Gelen trafiği birden fazla sunucuya dağıtarak yük dengelemesi yapabilir. Bu sayede, web sitesinin yüksek trafiği daha etkili bir şekilde yönetmesine ve performansını korumasına yardımcı olur.
  • Proxy Reverse: Ters proxy sunucusu olarak kullanılarak, istemcilerin doğrudan uygulama sunucularına erişimini engeller ve trafiği bu sunuculara yönlendirir. Bu, güvenliği artırmanın yanı sıra önbellekleme ve yük dengeleme gibi ek özellikler sağlar.
  • SSL/TLS Desteği: SSL (Secure Socket Layer) ve TLS (Transport Layer Security) şifrelemesi destekler. Bu sayede, web siteleri güvenli bir şekilde şifreli veri iletişimi yapabilir.
  • Yüksek Performans: Yüksek performanslı ve düşük gecikme süreli web hizmetleri sunar. Aynı anda binlerce bağlantıyı destekleyebilir ve hafıza kullanımını optimize eder.
  • Modüler Yapı: Modüler bir yapıya sahiptir. Kullanıcılar, ihtiyaçlarına göre çeşitli modüller ekleyerek veya çıkararak Nginx’in özelliklerini kullanabilir.

Nginx, yüksek performans, düşük hafıza kullanımı ve yüksek eşzamanlı kullanıcı desteğiyle bilinir. Özellikle yoğun trafiği olan web siteleri ve uygulamalar için tercih edilen bir web sunucusudur. Açık kaynaklı olması ve modüler yapısı sayesinde, kullanıcılar ihtiyaçlarına göre özelleştirilebilir ve genişletilebilir bir sunucu hizmeti sunar.

Ngnix Proxy Manager

Nginx Proxy Manager, web uygulamalarınıza ve hizmetlerinize erişim sağlamak için kullanılan güçlü ve esnek bir ters proxy ve yük dengeleyici yönetim aracıdır. Proxy Reverse, istemci taleplerini uygun sunuculara yönlendirir ve sunucu cevaplarını istemcilere geri gönderir. Yük dengeleme, trafiği birden çok sunucu arasında otomatik olarak dağıtarak, performansı artırır ve güvenilirliği sağlar.

Nginx Proxy Manager, açık kaynaklı bir araç olup, Nginx web sunucusunu temel alır ve Nginx’in güçlü özelliklerini kullanıcı dostu bir arayüzle sunar. Bu araç, kullanıcıların proxy reverse, load balancer, SSL/TLS sertifikaları ve diğer ilgili konfigürasyonları kolayca yönetmelerini sağlar.

  • Kullanıcı Dostu Arayüz: Karmaşık konfigürasyon dosyaları olmadan ters proxy ve yük dengeleyici ayarlarını yönetmek için kullanıcı dostu bir web arayüzü sunar.
  • SSL/TLS Sertifikaları: Web uygulamalarınızın ve hizmetlerinizin güvenliği için SSL/TLS sertifikalarını kolayca yönetir. Let’s Encrypt desteği sayesinde, ücretsiz SSL/TLS sertifikaları otomatik olarak alınabilir ve yenilenebilir.
  • Ters Proxy ve Yük Dengeleme: Kullanıcıların birden fazla web uygulamasını ve hizmetini aynı sunucuda barındırmasına ve bunlara uygun şekilde yönlendirmesine olanak tanır. Ayrıca, yük dengeleme ile trafiği birden çok sunucu arasında otomatik olarak dağıtarak performansı artırır ve güvenilirliği sağlar.
  • Erişim Kontrolü: IP tabanlı erişim kısıtlamaları ve kimlik doğrulama gibi özelliklerle erişim kontrolü sağlar.
  • Gelişmiş Yapılandırma Seçenekleri: Özel yapılandırma seçenekleri ile kullanıcılar, özel ihtiyaçlarına uygun şekilde proxy ve yük dengeleyici ayarlarını özelleştirebilirler.

CloudFlare

Cloudflare, internet üzerindeki çeşitli hizmetleriyle tanınan, geniş bir yelpazede güvenlik ve performans çözümleri sunan bir web altyapısı ve güvenlik şirketidir. Web sitelerini daha hızlı, güvenli ve güvenilir hale getirmek için çeşitli ürünler ve hizmetler sunar. Cloudflare’in hizmetleri, internet trafiğini optimize eder, güvenliği artırır ve çeşitli saldırılara karşı koruma sağlar.

Cloudflare’in sunduğu temel özellikler ve hizmetler:

  • Content Delivery Network (CDN): Dünya genelindeki veri merkezlerinden oluşan geniş bir ağ üzerinden içerik dağıtım hizmeti sunar. Bu sayede kullanıcıların taleplerine daha hızlı yanıt verebilir ve web sitesi performansını artırabilir.
  • Web Güvenliği: Web sitelerini DDoS, SQL inject, Cross-Site Scripting (XSS) saldırılarına ve diğer siber güvenlik tehditlerine karşı korur. Ayrıca, güvenli web trafiği sağlamak için SSL/TLS şifrelemesi sunar.
  • WAF (Web Application Firewall): Web uygulamalarını korumak için özelleştirilebilir bir WAF sunar. Bu, özellikle hedefe yönelik saldırılara ve belirli tehdit vektörlerine karşı ek koruma sağlar.
  • Load Balancer: Trafik yükünü birden fazla sunucu arasında dengeleyerek web sitesi performansını ve güvenilirliğini artırır. Bu sayede, sunucu arızalarından ve aşırı yükten kaynaklanan kesintilerin önüne geçilir.

Uygulamalı Örneğimize Başlayalım

CloudFlare Yapılandırması

İlk olarak mevcut domainimizi CloudFlare üzerinde DNS yönlendirmesi yaparak başlayabiliriz. CloudFlare hesabınız yok ise ücretsiz olarak oluşturabilirsiniz.

Websites > Add Site yolunu izleyerek CloudFlare üzerine domainimizi tanımlamak için işlemi başlatıyoruz.
Domain bilgimizi girdikten sonra sonra Continue ile ilerliyoruz.
Ücretlendirme aşamasını Free versiyonu seçerek ilerleyebilirsiniz.
Oluşturma işlemini tamamladıktan sonra CloudFlare bize domainimize tanımlamamız gereken DNS adreslerini verecektir. Bu adresleri ilgili domain için tanımlıyoruz.
CloudFlare bizim için belirli aralıklar içinde DNS güncellemesi oldu mu diye kontrol ediyor fakat siz beklemek istemiyorsanız Check nameservers butonuna tıklayarak kontrol sürecini hızlandırabilirsiniz.

💡 CloudFlare kullanma amacımız SSL ve Cloud DNS hizmetlerinden yaralanmak içindir.

DigitalOcean Sunucu Kurulumu ve Yapılandırılması

Ben sunucuyu DigitalOcean üzerinden kullanmayı uygun gördüm. Centos 9 versiyonunda bir sunucu oluşturup kurulumları yapalım.

Menüden Droplets yolunu izleyerek Create Droplet ile sunucu yapılandırma ekranına geçiyorum.
Seçimlerden anlaşılacağı üzere CentOS 9 Stream x64 versiyonunda bir sunucu yapılandırması yaptım. Sunucu kapasitesi ile alakalı bölümündeki seçim sizin ne kadar kaynağa ihtiyacınız olduğu ile alakalı bir durum. Ben örnek proje yayınlayacağım için basit seviyede bir sunucu seçimi yaptım.
Sunucu için şifrenizi belirledikten sonra Create Droplet butonuna basarak sunucumuzu oluşturabiliriz. Bir kaç dakika içinde sunucumuz hazır duruma gelecektir.

Sunucu kurulumumuz tamamlandığına göre bağlantımızı test edebiliriz.

Bağlantı sağladıktan sonra CloudFlare tarafında sunucunun ip adresine ait bazı tanımlamalar yapmamzı gerekecektir.

💡 SSH bağlantıları için PuTTY aracını kullanmaktayım.

CloudFlare panelinde menüden DNS bölümüne girdikten sonra karşımıza DNS kayıtlarının listelendiği alan çıkacaktır. Buradan Add Record yolunu izleyerek yeni bir A kaydı oluşturmamız gerkeiyor. Ben projeyi api.xxx.com gibi adres altında yayınlayacağım için Name alanına api Ipv4 address alanına ise sunucu ip adresini girerek DNS kaydımı ekledim.

Sunucu üzerinde Docker Engine ve Git kurulumuna ihtiyacımız olacaktır.

Docker Engine Kurulumu

sudo dnf update -y
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce --nobest
sudo systemctl enable --now docker

Kurulumu tamamladıktan sonra kontrol edelim.

sudo systemctl status docker
Docker servisimiz up durumda olduğuna göre sonraki aşamalara devam edebiliriz.

Git Kurulumu

sudo yum install git

ASP.NET Core Web Api projesinin oluşturulması ve Docker yapılandırması

Basit bir api projesi geliştirdim ve bana TCMB üzerinden mevcut güne ait kurları getirmektedir.

Örnek projeye GitHub üzerinden erişebilirsiniz 👇🏻

CurrencyController

[ApiController]
[Route("api/v1/currencies")]
public class CurrencyController : ControllerBase
{
private readonly ILogger<CurrencyController> _logger;

public CurrencyController(ILogger<CurrencyController> logger)
{
_logger = logger;
}

[HttpGet]
[ProducesResponseType(typeof(GetCurrenciesResponse), 200)]
public async Task<IActionResult> Get()
{
var response = new GetCurrenciesResponse()
{
Currencies = new()
};

try
{
XmlDocument xmlData = new XmlDocument();
xmlData.Load("http://www.tcmb.gov.tr/kurlar/today.xml");

decimal usd = Convert.ToDecimal(xmlData.SelectSingleNode(string.Format("Tarih_Date/Currency[@Kod='{0}']/ForexSelling", "USD")).InnerText.Replace('.', ','));
decimal eur = Convert.ToDecimal(xmlData.SelectSingleNode(string.Format("Tarih_Date/Currency[@Kod='{0}']/ForexSelling", "EUR")).InnerText.Replace('.', ','));
decimal gbp = Convert.ToDecimal(xmlData.SelectSingleNode(string.Format("Tarih_Date/Currency[@Kod='{0}']/ForexSelling", "GBP")).InnerText.Replace('.', ','));

response.Currencies.Add(new GetCurrencyResponse
{
Code = "USD",
SalePrice = usd
});

response.Currencies.Add(new GetCurrencyResponse
{
Code = "EUR",
SalePrice = eur
});

response.Currencies.Add(new GetCurrencyResponse
{
Code = "GBP",
SalePrice = gbp
});
}
catch (XmlException xml)
{
return BadRequest();
}

return Ok(response);
}
}

Docker Compose File

version: '3.4'

services:

test.api:
container_name: test-api-container
restart: always
build:
context: .
dockerfile: src/Test.Api/Dockerfile
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://+:80
ports:
- "5000:80"
networks:
- ngnix-network

proxy-manager:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- ngnix-network

networks:
ngnix-network:
external: true

Compose dosyası üzerinde api projesi ve proxy manager imajlarını çalıştırabilmek için yapılandırmalarımı sağladım. Bu yapılandırmaya göre Api projemiz 5000 portundan, Ngnix Proxy Manager ise 80, 81, 443 portlarından ayağa kalkacaktır.

Projeyi sunucu üzerinde çalıştırma ve Ngnix Proxy Manager 🚀

Sunucumuza tekrar bağlanıp aşağıdaki komutları sırası ile çalıştırmamız gerekmektedir.

// Ngnix ve Api projesini ayni network altinda calistirmak icin ngnix-network adinda ozel bir ag olusuturuyoruz
docker network create ngnix-network

Network oluşturma işlemini tamamladıktan sonra projemizi git üzerinden clone edebilir ve ayaklandırabiliriz.

mkdir test-project
cd test-project
git clone https://github.com/MuratDincc/digitalocean-api-project-example.git
cd digitalocean-api-project-example
docker compose up -d

Komutları çalıştırdıktan sonra Ngnix Proxy Manager arayüzüne http://ip-address:81 adresinden erişebilirsiniz.

Varsayılan kullanıcı bilgileri

Email:    admin@example.com
Password: changeme

Arayüze ilk defa eriştiğinizde Proxy Manager sizden kullanıcı bilgilerini değiştirmenizi isteyecektir. Bilgileri kendi istediğiniz şekilde düzenleyebilirsiniz.

Dashboard üzerinde Proxy Manager üzerinde yapılan bütün yapılandırmalara dair istatistikleri görebilirsiniz.
Hosts -> Proxy Hosts yolu izlenerek Proxy Manage ekranına geliyoruz. Add Proxy Host ile domainimiz ile api container’ımızı artık kavuşturma vakti geldi 😊

Api projemiz 5000 portunda ayağa kalktığı için bizim dışarıdan api.domain.com üzerinden gelen istekleri sunucu-ip:5000 olarak yönlendirmemiz gerekecektir. Bu yüzden yapılandırmamızı aşağıdaki örnek gibi yapabiliriz.

  • Domain Names: api.domainiz.com
  • Forward Hostname / IP: Sunucunun IP Adresi
  • Forward Port: 5000

Artık erişimi test edebiliriz 🚀

http://api.domain.com/swagger/ ile Swagger UI tarafına erişmeye çalışınca mutlu sona ulaştık 😊

Uygulamamızın ağ akışını haritalamak istersek çıktısı aşağıdaki gibi olacaktır 👇🏻

CloudFlare isteği karşılayıp DNS kayıtlarını çözüp DigitalOcean üzerinde olan CentOS makinemize yönlendiriyor. Makine üzerinde Ngnix + Proxy Manager isteği karşılayıp Proxy Reverse kayıtlarını kontrol ediyor ve Docker üzerindeki port ile eşleştirip isteği geriye dönüyor.

Bir sonraki yazıda görüşmek üzere 😊

--

--