Projeyi Canlıya Almak
Her yazılımcı günün birinde projesini canlıya alacaktır.
Bugüne kadar hosting modellerini kullanan ben, günün birinde farklı disiplinlere geçmeye karar verdiğimde bir şey farkettim. Her projem için farklı konfigürasyonlarda hosting hizmeti almaya başladım. Aslında yazılım serüvenim .Net ile başladığından, tek bir hosting hizmeti işimi görüyodu. Ancak sonrasında biraz daha JS taraflarına kaymaya başladım ve oradaki projelerimi de canlıya alma ihtiyacı doğdu.
Tabi hazır konfigürasyonlu hosting paketlerine alışmış olan ben, kullandığım şirketteki hosting paketlerine baktım. Daha önce ASP.NET ve .Net Core projelerimi yayınladığım şirket, bilgisayarlarında Node.JS kurmadıklarını söylediklerinde biraz yıkılmıştım. “React ile projeyi yaptık o kadar. Şimdi tutup bir daha başka bir şeyle mi yazayım?” dedikten sonra birden ışık yanmaya başladı.
İnsanlar cloud falan bir muhabbetler ediyor. Neymiş bu “cloud mevzusu” diye bir sorgulama ihtiyacı geldi.
“There is no cloud. It is just someone else’s computer.”
Ufak bir araştırma sonucu cloudun tam olarak ihtiyacım olan şey olduğu kanaatine vardım. Uzaklardan bir yerlerden bir sanal makine kiralıyorum. Bu sanal makine ise bana ait bir alan oluyor. İstediğim ayarı istediğim şekilde yapabiliyorum. Hal böyle olunca bunu öğrenmem gerekti.
Server Konfigürasyonu
Öncelikle serverı kiralar kiralamaz hemen apt-get update ve upgrade’lerimi yaptım. Kim bilir ne zaman öncesinin imajını kurdular da kaçar versiyon gerideyim paketlerde. Her şeyim güncel versiyon olduktan sonra alet çantasındaki eksikleri tek tek not almaya başladım.
- Yayınlayacağım projelerim için uygun runtimelar. (JS için NodeJS, .Net için .Net Core yüklemeleri vs. vs.)
- Bu sunucuda yayınlayacağım projelerimin yönlendirilmeleri için bir tool (Burada Nginx seçtim)
- Backend projelerim için birer servis
GUI’sız yapamayan birisi olarak terminali başta biraz garipsemiş olsam da, tek satırla bir paket yüklemenin verdiği rahatlık bambaşkaydı. Mac’te Homebrew, Windows’ta da Chocolatey yüklü olmasına rağmen yine de tutup illa bir exe vs. arardım ki ona çift tıklayıp kurayım. Ancak terminalden paket kurulumunun ne kadar rahat olduğunu o ana kadar anlayamamışım. Hem terminalin verdiği bir hacker havası da hiç fena gelmiyor 🙂
Şaka bir yana, birer satırla NodeJS’i, Git’i, .Net Core’u, SQL Server’ı ve Nginx’i kurdum. Meğer ne çok uygulama sığdırmışım o küçücük satırlara. Bu serverın public keyini ise Git hesabıma yükledim. Şimdi ise projelerimi çekme vakti. Derhal /var/www lokasyonuna projelerimi farklı klasörlere tek tek çektim ve hepsini ayrı ayrı buildledim. Böyle yapılmak zorunda değildi. Eğer proje oldu ve bittiyse, güncelleme vs. gelmeyecekse, bilgisayarınızda build edip, build dosyalarını Cyberduck gibi bir tool ile sürükle bırak yaparak servera atabilirsiniz. Ancak benim projelerim devam eden projeler olduğundan, Git aracılığıyla dosyalarımı çekip orada build yapmam daha uygun oldu.
Projeler hazır, çalışabilir halde klasörlerinde duruyor. Proje domainlerinin bu servera yönlenmeleri için gerekli DNS ayarlarını da yaptım. Ancak burada da da şu soru vardı. x IP’sine deniz.com diye bir istek geldi varsayalım. Peki bu istek hangi uygulamayı çalıştıracak? İşte bunun kontrolü ise NGinx tarafından sağlanacak.
Nginx
Servera gelen isteklerin ilk karşılaştığı yer bu uygulama oluyor. Restorana girdiğinizde kapıda sizi karşılayan birisi olur ya. Şöyle söyleyeyim. Ayakkabı alma isteği ile bir mağazaya gidiyorsunuz. Ancak mağaza ayakkabı dışında bir de giyim, spor, elektronik alanlarında da ürünler satıyor. Kapıda görevli sizi karşılıyor ve görevliye ayakkabı alma isteğinizi söylüyorsunuz. Eğer mağaza müdürü bu görevliye ayakkabıların A3 koridorunda olduğunu söylemezse, bu görevli 404 hatası ile müşteriyi geri gönderir. Anlaşılmadıysa bu senaryoda biz mağaza müdürüyüz, görevli Nginx ve müşteri ise gelen client requesti temsil etmekte. /etc/nginx/sites-enabled klasörü altına her bir projemiz için birer dosya oluşturmamız gerekiyor. Nginx konfigürasyonunu anlatmayacağım uzun uzun, bunu yazan başka yazılar da var. Ancak basitçe anlatmam gerekirse, hangi istek geldiğinde hangi dosya yolundaki uygulamayı çalıştırması gerekiyor, bunu belirtmemiz gerekiyor bu dosyalarda. Eğer yayınladığnız uygulama bir frontend uygulaması ise, ayarlarınız burada bitiyor. Geriye son olarak Certbot ile Let’s Encyrpt sertifikası almak kalıyor.
Backend İçin Servis Tanımlama
Eğer projeniz bir backend projesi ise, projenizin çalışır halde kalması için bir de servis tanımlamanız gerekmekte. Ben Ubuntu’nun kendi systemctl’sini kullandım. Ancak burada anladığım kadarıyla farklı platformlarda farklı proje yönetim araçları da (pm2 gibi) bulunmakta. Servis işini de hallettikten sonra backend projem de canlıda Postman isteklerime cevap verir halde hazır ve nazır bir biçimde duruyordu.
Bonus: SSL Sertifikası
SSL sertifikası, sunucu ve kullanıcı arasındaki iletişiminizin şifrelenmesi için hayati önem taşıyor. Eğer basit bir tanıtım sitesi yapıyorsanız çok önemli değil ancak kullanıcıların hassas bilgilerinin bulunacağı bir uygulama yapıyorsanız kesinlikle ve kesinlikle bunu yapmalısınız. Kaldı ki SSL sertifikası almadığınız bir sitede çıkacak olan “Güvenli Değil” ibaresi, kullanıcınızı 5 saniye içerisinde sitenizden ayıracaktır. Ücretsiz bir şekilde alacağınız Let’s Encrypt sertifikası ise bu baş ağrısından sizi kurtaracaktır. Üstelik sertifikayı almanıza yarayan Certbot, Nginx konfigürasyonlarınıza bakarak kolay bir şekilde sertifikalarınızı imzalayacaktır ve gerekli https yönlendirmelerini otomatik olarak Nginx konfigürasyon dosyalarınıza yazacaktır. Ben tüm uygulamalarıma bu şekilde sertifika aldım. Sizin de kesinlikle sertifikanızın bulunmasını öneriyorum.
Sonuç
Bu yazının amacı aslında benim bu bulut serüveni ile ilgili yaşadıklarımı anlatmaktı. Bunları anlatırken ise benim gibi bu konuya kollarını sıvayan birisi için bir yol çizmek. Yani örnek vermek gerekirse, bu yazının amaçları arasında Nginx konfigürasyonunun nasıl yapılacağı yok, kişinin kiraladığı serverda uygulama barındırmak istiyorsa Nginx’in ne rolü olduğunu anlatmak istedim. Çünkü çok kıymetli insanlar tarafından bunların nasıl yapılacakları çeşitli örneklerle anlatılmış. Onların yazdıklarının aynısını buraya yazıp, yazıyı amacından saptırmak istemedim. Umarım bu yazı birilerine yararlı olmuştur.