Django Uygulamanızı Azure Sanal Makine Üzerinde Dağıtın
Merhaba Django severler!
Bu yazıda, kendi Django uygulamanızı geliştirdiniz ve şimdi bu harika projenizi internet üzerinde paylaşma vakti geldi. Azure Cloud üzerindeki bir sanal makineye nasıl dağıtılacağınızı öğrenmek istiyor musunuz? İşte adım adım bir rehber!
İlk olarak, Django projemizdeki, statik dosyaları düzenleyecek ve GitHub’da paylaşacak ve paylaşılan projeyi Azure sanal makineye çekeceğiz. Ardından, Azure’da hesap oluşturacağız. Öğrenciler için harika bir avantaj olarak, Azure, öğrencilere özel olarak 100 dolar değerinde ücretsiz kredi sunmaktadır. Bu ücretsiz kredi, projenizi Azure’da geliştirmek ve test etmek için ideal bir fırsat sunuyor. Bir sanal makine oluşturup ayarlarını yapacağız. Domain adresimizi alıp server kurulum aşamalarında izin verilen hostlara ekleyeceğiz. Sanal makine üzerinden bağlantı sağlayacak ve gerekli ayarlamaları yapacak, ardından Gunicorn ve Nginx ile web sunucusunu kurarak sistemi ayağa kaldırmış olacağız. Django uygulamanızı hızla ve güvenle Azure’da yayınlamaya hazır olacaksınız! Şimdi, her bir adımı detaylı bir şekilde inceleyelim.
Bu yazıda bize eşlik edecek olan projemiz ApexChart.js ile oluşturduğum bir Dashboard ekranı projesi olacak.
Django Projesindeki Statik Dosyaları Düzenleme
Django dosya hiyerarşisini anlamak, statik dosyaların düzenlenmesinde kritik bir adımdır. Şekil 1.1'de görüldüğü üzere, Django projesinin dosya yapısını görebilirsiniz. Bu hiyerarşi içinde static
klasörü, genellikle ana uygulama dizini içinde bulunur. Bu klasör, CSS, JavaScript, resimler gibi statik dosyalarınızı içermek için kullanılır.
static
klasörü içinde her uygulama için ayrı alt klasörler bulunabilir. Bu, projenizi daha organize etmenize ve statik dosyalarınızı belirli bir yapı içinde tutmanıza yardımcı olur. Bu dosya hiyerarşisini kullanarak, projenizdeki statik dosyaları kolayca yönetebilir ve düzenleyebilirsiniz.
Projemizi lokal ortamda geliştirirken, Django geliştirme sunucusu (development server) statik dosyaları işlemek ve HTTP taleplerine cevap vermekle görevlidir. Ancak, uygulamamızı bir sunucuya (örneğin Azure) yayınladığımızda, durum biraz değişir.
Sunucuda çalışan bir Django uygulamasında, genellikle statik dosyaların Django tarafından işlenip servis edilmesi önerilmez. Çünkü sunucu genellikle daha hafif bir web sunucu (Nginx veya Apache gibi) ve/veya bir içerik dağıtım ağı (CDN) kullanır. Bu nedenle, statik dosyaların bu sunucular veya CDN üzerinden servis edilmesi daha etkilidir.
Bu durumu göz önünde bulundurarak, uygulamamızın sunucuda sorunsuz çalışması için statik dosyaları dışarı açmamız gerekmektedir.
Uygulamamızda kullanılan tüm statik dosyalarını (uygulama atlında oluşturulan projeler de dahil ) tek bir static
klasörü altında toplayacağız.
Öncelikle projemizin settings.py
dosyasında STATIC_ROOT
belirlemeliyiz.
STATIC_DIRS
değişkenini yorum haline getirelim.
Projemizin bulunduğu dizinde kod bloğunu çalıştırarak, tüm statik dosyalarımızın, proje bazlı kırılımlarıyla birlikte, static
içinde derlenmesini sağlayalım.
$ python manage.py collectstatic
Son olarak projemizde kullandığımız kütüphane gerekliliklerini aktaralım requirements.txt
dosyasına aktaralım.
$ python -m pip freeze > requirements.txt
İşlem bu kadar. Projemizi sunucuya atmaya hazırız. Projemizi sanal makineye kolayca aktarabilmek için Git protokolü ile projemizi GitHub reposuna aktaralım.
Domain Adresimizi Belirleyelim
Web sitemizi tanıtabilmek ve erişilebilir kılmak için bir domain adresi seçmemiz gerekiyor. Ücretsiz bir domain alabileceğimiz site.ac websitesine giderek işe başlayalım.
Adım 1: Site.ac’ye Kayıt Olma
- site.ac adresine gidin.
- “Kayıt Ol” seçeneğini tıklayarak bir hesap oluşturun.
- Gerekli bilgileri doldurun ve “Devam Et” seçeneğiyle kaydınızı tamamlayın.
Adım 2: Domain Seçimi ve Kayıt
- Giriş yaptıktan sonra, “New domain name” tıklayın
- İlgili adımları takip ederek, kullanmak istediğiniz ücretsiz domain adını seçin.
- Domain kaydınızı tamamlayın ve site.ac üzerinden bu yeni domaini yönetebileceğiniz bir kontrol paneli oluşturun.
Not: Websitemizi kurulum aşamasını tamamladıktan sonra, DNS ayarlamalarını yapacağız. Bu adımları şu anda gerçekleştirmemize gerek yok. Domain adresimizi belirlemiş olduk.
Azure Hesabı Oluşturma
Adım 1: Azure Portal’a Giriş Yapın Azure portalına buradan erişin ve var olan bir Microsoft hesabıyla giriş yapın veya yeni bir hesap oluşturun.
Adım 2: Yeni Bir Azure Hesabı Oluşturun Portal’a giriş yaptıktan sonra, size uygun paketi seçin ve satın alın. Öğrenciler için buradan 100$ değerindeki kredinizi alabilirsiniz.
Adım 3: Kimlik Bilgilerinizi Girin Gerekli bilgileri (e-posta, ülke/alan, dil vb.) doldurun ve bir kullanıcı adı ve şifre belirleyerek devam edin.
Adım 4: Doğrulama İşlemlerini Tamamlayın Güvenlik amacıyla, belirli doğrulama adımlarını tamamlayarak hesabınızı onaylayın.
Bu adımları tamamladığınızda, artık Azure hesabınızı kullanmaya ve Django projenizi Azure’da yayınlamaya hazırsınız!
Sanal Makine Oluşturma
Azure portal üzerinden Kaynak oluşturmadan Sanal Makineyi seçelim.
Adım 1: Sanal Makine Adı Belirleme Sanal makinenize bir ad verin. Bu ad, otomatik olarak bir kaynak grubu oluşturulmasını sağlayacaktır.
Adım 2: Bölge ve Trafik Yoğunluğu Düzenleme Sanal makinenizin bölgesini, yayınlayacağınız websitenin trafik yoğunluğuna göre belirleyin. Bu, kullanıcılarınıza daha hızlı erişim sağlamak için önemlidir.
Adım 3: Disk ve RAM Boyutlarını Belirleme Websitenizin yoğunluğuna göre disk ve RAM boyutlarınızı ayarlayın. Daha büyük ve yoğun siteler için daha fazla kaynak seçmek performansınızı artırabilir.
Adım 4: İşletim Sistemi Seçimi — Linux Güvenlik ve performans açısından, Linux işletim sistemi tercih edilir. Bu projede Ubuntu 20.04 LTS altyapısını kullanmayı tercih edeceğiz. Linux, açık kaynak olması ve güvenlik konularında sağladığı avantajlar nedeniyle tercih edilmektedir.
SSH (Secure Shell): SSH, güvenli bir şekilde uzaktan erişim sağlayan bir ağ protokolüdür. Bu protokol, bilgisayarlar arasında güvenli veri iletimini ve iletişimini sağlamak için kullanılır. SSH, şifreleme ve kimlik doğrulama yöntemleriyle bilinen bir protokoldür ve genellikle uzak sunuculara güvenli bağlantılar kurmak için kullanılır.
Şimdi, Windows kullanıcıları için SSH anahtarı nasıl oluşturulur ve alınır detaylarına geçelim:
- Git Bash’i İndirin ve Kurun:
- Git Bash’i Açın ve sırayla komutları girin:
$ ssh-keygen ## SSH anahtarınız belirtilen dizine oluşturulacaktır
$ cat .ssh/id_rsa.pub ## SSH anahtarımızı görüntüleyelim ve kopyalayalım.
Sanal makinemizin kullanıcı adını belirleyelim ve kopyaladığımız SSH anahtarını ilgili alana yapıştıralım.
Azure’da sanal makine oluştururken karşımıza çıkan Gelen Bağlantı Noktaları ayarı, sanal makinemizin hangi ağ bağlantı noktalarından genel internet üzerinden erişilebileceğini belirlememize olanak tanır. Bu ayarı özelleştirirken, işlevselliğinizi ve güvenliğinizi ihtiyacınıza uygun şekilde yapılandırabilirsiniz.
HTTP genellikle web siteleri tarafından kullanılan standart bir protokoldür ve genellikle 80. bağlantı noktasında çalışır. HTTPS ise güvenli iletişim sağlar ve genellikle 443. bağlantı noktasında çalışır. Bu nedenle, bir web sunucu barındıran bir sanal makine, genellikle HTTP (80) ve HTTPS (443) bağlantı noktalarını kullanır.
Bu noktada gözden geçir ve oluşturma işlemi tamalayalım. Diğer adımlardaki işlemler default olarak belirlenmekte olup projenizin yeterliliklerini karşılayabilmesi için değişiklikler yapabilirsiniz.
Bağlantı Sağlama:
Git Bash uygulamasını açın:
$ ssh azureuser@<sanal_makine_ip_adresi>
- Burada
azureuser
, sanal makinenize bağlanmak için kullandığınız kullanıcı adıdır. Belirlediğiniz kullanıcı adı ile değiştiriniz. <sanal_makine_ip_adresi>
kısmını, Azure portalındaki sanal makinenizin IP adresiyle değiştirin.
SSH anahtarımızı Sanal makineyi oluşturken girdiğimiz için bağlantıyı sağlamış olacağız.
- Ubuntu paket arşivini güncelleyelim, Python ve diğer gereksinimlerinin kurulumunu yapalım
$ sudo apt-get update
$ sudo apt-get install python3-pip python3-dev libpq-dev nginx
$ sudo -H pip3 install --upgrade pip
$ sudo -H pip3 install virtualenv
sudo -H pip3 install — upgrade pip
hata almanız durumunda:export LC_ALL="en_US.UTF-8"
çalıştırın ve sonra tekrar deneyin.
2. Django projesini GitHub’dan kopyalayalım.
$ git clone https://github.com/serkanyasr/Django-DashBoard.git
3. Proje dizinine geçme ve venv
adlı Sanal Python Ortamının oluşturulması
$ cd Django-DashBoard
$ virtualenv venv
4. Sanal Ortamın aktif edilmesi
$ source venv/bin/activate
5. Proje bağımlılıklarının yüklenmesi
$ pip install -r requirements.txt
6. Gunicorn yüklenmesi
$ pip install gunicorn
Django Yayın Ortamı Ayarları
jango’nun DEBUG
modu, hata sayfalarını ve hata ayrıntılarını web tarayıcılarına gösterir. Bu bilgiler, geliştirme sırasında hata ayıklamayı kolaylaştırır ancak yayın ortamında bu bilgilerin genel internete sızmasını önlemek önemlidir. DEBUG
modu False
yapıldığında, hata sayfaları daha sınırlı bir şekilde ve güvenli bir biçimde sunulur. Nano operetörü ile Settings.py
dosyasını açalım ve DEBUG = False
olarak ayarlayalım.
Websitemiz sadece izin verilen alan adlarında ya da IP adreslerinde çalışır. Bu yüzden ALLOWED_HOSTS
listesinin içine yönlendireceğimiz alan adları ve sanal makinemizin IP adresini yazalım. Domain adresi olarak belirlediğimiz alan adlarını da ekleyelim. Bu sayede sunucumuz bu adreslerlerden gelecek olan isteklere cevap verecektir.
$ sudo nano DashBoard/settings.py
Dosyayı kaydetmek için CTRL + X
yaptıktan sonra y
harfine basıp, enter
tuşuna basalım.
Django sunucusu ile sitemizi 80 portu üzerinden test edelim. Öncelikle 80 portunu aktif edelim
$ sudo ufw allow 8000
- Ardından, Django uygulamanızı 80 portunda çalıştırabilirsiniz:
$ python manage.py runserver 0.0.0.0:8000
Sanal makine adresimize 8000 portu üzerinden tarayıcımızdan istek gönderelim. http://20.68.173.10:8000/
Web sitemiz başarıyla yüklendi, ancak statik dosyalarımız (CSS, JavaScript, resimler, vb.) Django tarafından servis edilmediği için sitemiz sadece temel HTML yapısında görüntülendi. Bu sorun, genellikle geliştirme aşamasında karşılaşılan yaygın bir durumdur.
Neden Statik Dosyalar Servis Edilmiyor?
Django geliştirme sunucusu (python manage.py runserver
) genellikle statik dosyaları servis etmez. Bu, geliştirme aşamasında sunucunun performansını artırmaya yönelik bir tercihtir. Ancak, yayın ortamında statik dosyalar genellikle bir web sunucusu (örneğin Nginx veya Apache) veya bir CDN (İçerik Dağıtım Ağı) tarafından servis edilir.
Gunicorn ve Nginx ile Web Sunucusunu Kurma
Gunicorn (Green Unicorn): Gunicorn, Python web uygulamalarını çalıştırmak için tasarlanmış bir WSGI (Web Server Gateway Interface) sunucusudur. Gunicorn, özellikle performansı, güvenilirliği ve hızlı dağıtımıyla bilinir. Adını, Python’un maskotu olan “unicorn”dan alır ve “green” kelimesi, Python dilinde gelişmiş bir çoklu iş parçacıklı (multi-threaded) yaklaşım kullanmasından gelir. Gunicorn uygulama ve web sunucusu arasında bir arayüz görevi görür, bu da web uygulamasının hızlı ve etkili bir şekilde çalışmasını sağlar.
Gunicorn ile websitemizi ayağa kaldıralım
Sanal Makinemiz de Python ortam değişkenin aktif olduğunu ve manage.py
dosyasının bulunuduğu dizinde olduğumuzdan emin olalım.
$ gunicorn --bind 0.0.0.0:8000 DashBoard.wsgi
### DashBoard.wsgi => kendi_proje_isminiz.wsgi ###
Web sitemize tekrar istek gönderdiğimizde başarılı bir şekilde yüklendiğini göreceğiz. Ancak, Gunicorn servisini arka plan servisi olarak sürekli çalışacak şekilde ayarlamamız gerekiyor. Bu sayede sanal makinemiz kapatıldığında veya baştan başlatıldığında sitemiz aktif olarak çalışacaktır.
Sanal ortamı deactivate
edelim ve nano editörü ile servis dosyamızı oluşturalım.
$ deactivate # Sanal ortamı deactive edelim
$ sudo nano /etc/systemd/system/gunicorn.service # Servis dosyası oluşturma
Dosya içeriğini kendi projemize göre düzenleyelim.
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=serkan
Group=www-data
WorkingDirectory=/home/serkan/Django-DashBoard
ExecStart=/home/serkan/Django-DashBoard/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/serkan/Django-DashBoard/DashBoard.sock DashBoard.wsgi:application
[Install]
WantedBy=multi-user.target
Dosyayı kaydetmek için CTRL + X
yaptıktan sonra y
harfine basıp, enter
tuşuna basalım.
Gunicorn servisini aktif etme:
$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
Gunicorn servisinin çalışıp çalışmadığını test edelim:
$ sudo systemctl status gunicorn
Active (running)
. Muhteşem aktif olarak çalışmaktadır.
NGX YAPILANDIRMASI
- Nginx sunucu bloğu açma:
$ sudo nano /etc/nginx/sites-available/DashBoard
Dosya içeriğini kendi projemize göre düzenleyelim. Server name kısmına Sanal makinemizin IP adresi, domain adreslerimizi aralarından bir boşluk bırakacak şekilde ekleyelim.
server {
listen 80;
server_name 20.68.173.10 www.django-dashboard.app.tc django-dashboard.app.tc; # server_name alan_adi_veya_IP
root /home/serkan/Django-DashBoard; # Projenin kök dizini
location /static/ {
}
location /media/ {
}
location / {
include proxy_params;
proxy_pass http://unix:/home/serkan/Django-DashBoard/DashBoard.sock; # Projenin kök dizinindeki 'proje_adı.sock' dosyası
}
}
Dosyayı kaydetmek için CTRL + X
yaptıktan sonra y
harfine basıp, enter
tuşuna basalım.
Nginx dosyasını aktif etmek için dosyayı sites-enabled
dizinine link olarak verme
sudo ln -s /etc/nginx/sites-available/DashBoard /etc/nginx/sites-enabled
Nginx yapılandırma dosyalarında syntax hatası olup olmadığını kontrol etme
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Başarılı bir şekilde oluşturduk.
Değişiklilerin aktife olabilmesi içn Nginx sunucusunu yeniden başlatalım
sudo systemctl restart nginx
Kullanılmayacak olan 8000 portunu kapatalım ve Nginx kurallarını aktif edelim
$ sudo ufw delete allow 8000
$ sudo ufw allow 'Nginx Full'
Web sitemiz başarı bir şekilde yüklendi.
Web Sitemizi Alan Adına Yönlendirme
Azure portal üzerinde DNS bölgeleri ayarlarını yaparak, web sitemizi belirlediğimiz alan adına yönlendirebiliriz.
- Azure portalına giriş yapın ve sol üst köşede bulunan “Azure Hizmetleri” sekmesine gidin.
- Arama çubuğuna “DNS bölgeleri” yazın ve ilgili seçeneği seçin.
- “Yeni DNS bölgesi ekle” seçeneğini tıklayarak yeni bir DNS bölgesi oluşturun.
- Karşınıza çıkan pencerede, gerekli bilgileri doldurun:
- DNS adı: Yönlendirmek istediğiniz alan adı.
- Kaynak grubu: DNS bölgesini oluşturmak istediğiniz kaynak grubu.
- DNS tipi: Genellikle “Public” olarak seçilir.
5. “Gözden geçir ve oluştur” seçeneğine tıklayın ve ardından “Oluştur” butonuyla işlemi tamamlayın.
Bu adımları takip ederek, Azure portal üzerinde yeni bir DNS bölgesi oluşturmuş olacaksınız. Bu DNS bölgesi, web sitenizin belirlediğiniz alan adına yönlendirilmesini sağlayacak.
Dağıtım işlemi başarıyla tamamlandıktan sonra, web sitenizi belirlediğiniz alan adına yönlendirmek için aşağıdaki adımları izleyebilirsiniz:
- “Kaynaklara Git” seçeneğine tıklayın.
- Sol üst köşede bulunan “Yeni Kayıt Kümesi Ekle” seçeneğine tıklayın.
- Ad bölümüne “www” yazın.
- IP adresi kısmına sanal makinenizin IP adresini ekleyin.
- Yaptığınız değişiklikleri kaydedin.
Bu işlem, belirlediğiniz alan adına gelen www alt alanının, sanal makinenizin IP adresine yönlendirilmesini sağlar. Artık web siteniz, belirlediğiniz alan adı üzerinden erişilebilir durumda olacaktır.
DNS adreslerimizi tamamladık. Azure portal üzerinde işlemlerimiz tamamlandı.
site.ac websitesine gidelim ve domain paneline ulaşalım. Belirlediğimiz alan adının DNS ayarlarını düzenleyelim.
DNS tanımlamayı seçelim ve devam edelim.
NS-1 ve NS-2 adlarında servis sağlayacımızın bizlere vermiş olduğu adresleri girmemiz gerekmektedir. Kayıt kümesi eklediğimiz alandan ilgili değerleri alalım ve kayıt edelim.
Websitemizi Kontrol Edelim
Şimdi, belirlediğimiz alan adı üzerinden sitemize istek gönderelim. Web sitemiz başarılı bir şekilde yüklendi! Tebrikler! 🚀😊
Bu rehberi takip ederek Django uygulamanızı Azure Cloud üzerinde başarıyla dağıttınız. Tebrikler! Artık web siteniz, belirlediğiniz alan adı üzerinden erişilebilir durumda.
GitHub Repo: Django-DashBoard
Başarılar… 🚀💻