Categories: Python

Digital Ocean’da Django Projeleri Oluşturmak (Ajenti + Nginx + Gunicorn + Postgres)

Güncelleme: Eğer Django öğrenmeye yeni başladıysanız ve, benim yazıyı yazdığım zamanki gibi, uygulamayı sunucuya yükleme, sunucuyu hazırlama gibi konularda hiç bilginiz yoksa okumaya devam edebilirsiniz. Yinede ısrarla başka kaynaklardan da araştırma yapmanızı tavsiye ederim.

Eğer sizde benim gibi bir proje üzerinde çalışırken localhost yerine gerçek bir server üzerinde projenizi test etmeyi seviyorsanız mutlaka Digital Ocean‘ı denemelisiniz. Eğer akademik bir eposta hesabınız varsa (edu.tr) Digital Ocean‘ın $100’lık hediyesini kaçırmamanızı tavsiye ederim.

Yukarıda verdiğim Digital Ocean linkleri ile ya da buraya tıklayarak üye olursanız, $10 daha hediye alarak kendinize ait serverler kurmaya başlayabilirsiniz.

Bu yazıda anlatacaklarım:

  • Nginx ve Gunicorn kurulumu
  • Django projemizi kurup, yayına almak
  • Ajenti + Ajenti V kurulumu

Bu işlemlerin çoğunu Digital Ocean‘ın sunduğu dokümantasyonlardaki adımları izleyerek ve googlelayarak öğrendim ve paylaşmak istedim. Şu anda Ubuntu 14.04 serverım üzerinde Django uygulamalarım mevcut ve sorunsuz şekilde çalışıyor.

Başlayalım

Digital Ocean üzerinde server sahibi olmayanlar aşağıdaki rehberleri takip ederek yeni bir server kurup, güvenli bir şekilde bağlanabilirler.

  1. Digital Ocean üzerinde server kurulumu
  2. SSH key ile servera bağlanma
  3. Server kurulumu sonrası temel ayarlar

Eğer daha önce Digital Ocean üzerinde server kurup, yukarıdaki rehberde yer alan işlemleri gerçekleştirmediyseniz daha güvenli bir server oluşturmak için siz de bir an önce uygulayın.

Kullandığım işletim sistemi Linux Mint ve terminalimi açıp servera bağlandıktan sonra aşağıdaki komutları yazmam yeterli olacaktır. Linux ya da Mac kullanıcıları da terminalden servera bağlanıp komutları çalıştırabilir.

Windows kullanıcıları yukarıdaki verdiğim rehberlerde servera bağlanmayı ve komutları çalıştırmayı bulabilir.

Yeni Kullanıcı Eklemek

Serverınızda root harici bir kullanıcınız yoksa önce yeni bir kullanıcı oluşturup, bu yeni kullanıcımıza root ayrıcalıkları vererek başlayalım. Bunun için,

adduser yenikullanici

komutunu çalıştıralım. Gelen soruların hepsini doldurmak zorunda değiliz. Enter’a basarak geçebiliriz.

Yeni kullanıcımız için güçlü bir şifre oluşturduktan sonra aşağıdaki komutu çalıştırıp, root ayrıcalıklarını verebiliriz.

gpasswd -a yenikullanici sudo

Şimdi serverı exit komutu ile kapatıp ssh yenikullanici@SERVER_IP_ADDRESS komutuyla yeni oluşturduğumuz kullanıcı ile tekrar servera bağlanabiliriz.

Gerekli Araçları Yükleyelim

İlk yapmamız gereken bize lazım olacak araçları yüklemek. Bunun için aşağıdaki komutları çalıştırmalıyız:

sudo apt-get update
sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx

PostgreSQL Veritabanı Kurulumu ve Kullanıcı Eklenmesi

Eğer projelerinizde PostgreSQL kullanmayı planlıyorsanız aşağıdaki komutlar ile PostgreSQL veritabanı oluşturup, kullanıcı ekleyebilirsiniz. Bu işlemi gerçekleştirmezseniz, Django varsayılan olarak SQLite 3 veritabanı oluşturup kullanacaktır.

sudo su - postgres

psql

Böylece postgres kullanıcısı ile POstgreSQL komut arayüzüne girip, veritabanı ve kullanıcı oluşturmak için gerekli komutları verebiliriz. Veritabanını oluşturarak başlayalım:

CREATE DATABASE myproject;

Sıradaki işlememiz veritabanı için kullanıcı oluşturup, şifresini belirlemek:

CREATE USER myprojectuser WITH PASSWORD 'sifre123';

Veritabanı ve kullanıcımız hazır olduğuna göre, kullanıcımızı veritabanına atayabiliriz:

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

Projemizde kullanmak üzere PostgreSQL veritabanımız hazır. Şimdi postgres arayüzünden çıkıp Django projemizi oluşturmaya geçebiliriz. Sırasıyla aşağıdaki komutları verelim:

\q

exit

Django Projeleri için Sanal Ortam Kurulumu

virtualenv kurarak, sistemden ve birbirinden bağımsız ortamlar oluşturup, Django projelerimizi bu ortamlar üzerinde çalıştıracağız. virtualenv‘i yükleyerek başlayalım:

sudo pip install virtualenv

virtualenv hazır olduğuna göre artık projelerimizi hayata geçirmeye başlayabiliriz.

pwd komutu ile o anda bulunduğunuz dizini görebilirsiniz. Eğer farklı bir dizine geçmediyseniz büyük ihtimalle komutu çalıştırdıktan sonra bulunduğunuz dizin /home/kullaniciadiniz olacaktır.

Projemizi saklamak için yeni bir dizin oluşturarak başlayalım.

mkdir projem

cd projem

projem isimli bir klasör oluşturduk ve bu klasör içine girdik. Django projemizi burada saklayacağız. Sanal ortamımızı oluşturalım:

virtualenv sanalortam

Yukarıdaki komut ile sanal ortamımız oluştu ve pip ile python diğer ortamlardan bağımsız olarak yüklendi.

Şimdi yapmamız gereken sanal ortamımızı aktif etmek. Böylece gerçekleştireceğimiz işlemler diğer projelerimizi etkilemeden, yerel olarak bulunduğumuz proje içinde gerçekleşecek.

source sanalortam/bin/activate

Şu anda sanal ortamımız aktif olmuş olmalı ve terminalde şuna benzer bir ifade yer almalı(sanalortam)kullanici@host:~/projem$

Sanal ortamımız da aktif olduğuna göre Django projemizi oluşturmaya başlayabiliriz:

pip install django gunicorn psycopg2

Django Projesi Oluşturma ve Temel Ayarlamalar

Django projemiz için klasör oluşturduk, sanal ortamımızı yükleyip aktif ettik ve nihayet Django projemizi hayata geçirebiliriz. İlk yapmamız gereken Django projesi oluşturarak başlamak:

django-admin.py startproject djangoprojem .

En sondaki “.“ya dikkat edelim. Böylece o anda bulunduğumuz dizinde Django projemizi oluşturmuş olduk. Hemen temel birkaç ayarı yapmaya başlayalım. Bunun için Django projelerinin temel ayarlarının saklandığı settings.py üzerinde birkaç değişiklik yapacağız.

nano djangoprojem/settings.py

Şu anda settings.py dosyasını düzenleyebiliriz. Eğer veritabanı olarak PostgreSQL kullanmak istiyorsanız, DATABASES kısmını bulun ve daha önce kurulumunu gerçekleştirdiğimiz PostgreSQL’e göre ayarları girin:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'sifre123',
        'HOST': 'localhost',
        'PORT': '',
    }
}

Yukarıdaki adımı atlayabilirsiniz. Böylece veritabanınız SQLite  olarak proje ana dizininde otomatik olarak oluşturulacaktır.

settings.py dosyasını kapatmadan önce dosyanın en altına inip aşağıdaki kodu ekleyin:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

Şimdi CTRL+X ve Y basarak ayarlarımızı kaydedip çıkalım.

Neredeyse bitti. Son olarak Django admin paneli için komutlarımızı girip projemizi çalıştırabiliriz:

python manage.py makemigrations

python manage.py migrate

python manage.py createsuperuser

python manage.py collectstatic

Her şey hazır ve sitemizi canlı bir şekilde görebiliriz!

python manage.py runserver 0.0.0.0:8000

Şimdi http://SERVER_IP_ADDRESS:8000 adresini ziyaret edin.

It worked!
Congratulations on your first Django-powered page.

Her şey yolunda gittiyse yukarıdaki mesajla karşılaşmış olmanız gerek. http://SERVER_IP_ADDRESS:8000/admin adresinden oluşturduğunuz super user ile Django admin paneline giriş yapabilirsiniz.

CTRL+C ile sanal serverı kapatıp, Django projemizi gerçek bir domaine atayıp, web kontrol paneli üzerinden yönetecek hale getirelim. Bunun için Ajenti kullanacağız. Böylece Gunicorn ve Nginx ayarlarını da otomatik olarak yapması için Ajenti‘ye bırakacağız.

Ajenti ve Ajenti-V Kurulumu

Şu anda Django projemiz ile işimiz kalmadı. deactive komutu ile sanal ortamımızı kapatabiliriz.

cd ~ ile ana dizine dönüp Ajenti kurulumuna geçelim:

wget -O- https://raw.github.com/ajenti/ajenti/1.x/scripts/install-ubuntu.sh | sudo sh

Ajenti’nin kurulumu yapması için gerekli izinleri verelim ve yüklemeler bittikten sonra:

sudo service ajenti restart

komutu ile Ajenti’yi tekrar başlatalım. Eğer UFW güvenlik duvarı kullanıyorsanız Ajenti için ufw allow 8000 komutuyla izinleri ayarlamanız gerek.

Şu anda https://SERVER_IP_ADDRESS:8000 adresinden Ajenti admin paneline ulaşabilirsiniz. Tarayıcınız güvenli olmadığına dair bir uyarı verebilir. Endişelenmeyin ve devam edin 🙂

Varsayılan olarak kullanıcı adınız root, şifreniz admin olacaktır.

Ajenti ile web sitelerimizi yönetmek için Ajenti-V eklentisini yüklememiz gerek. Ajenti-V ile gelen paketler yardımıyla birkaç tıklamayla web siteleri oluşturup yayınlayabiliriz.

Eğer sistemde Apache yüklüyse ve hiç kullanmadıysanız öncelikle Apache’yi kaldırmanız gerekecek:

sudo apt-get remove apache2

Şimdi Django projemiz için Ajenti-V paketlerini yükleyebiliriz:

sudo apt-get install ajenti-v ajenti-v-nginx ajenti-v-python-gunicorn ajenti-v-ftp-pureftpd

sudo service ajenti restart

Ve işlem tamam! Şimdi Ajenti admin panelinde websites bölümünün gelmiş olması lazım. Buraya tıklayınca Ajenti paketleri aktifleştirmek için onay isteyecektir. Onaylayın ve Django projemizi Ajenti’ye tanıtmaya başlayalım.

Ajenti-V ile Django Web Uygulamasını Yayınlamak

Gerçek Domain İle Çalışmak İster Misiniz? Üstelik Bedava!

Web sitemize ip adresinden ulaşmak yerine gerçek bir domain üzerinden erişmek daha hoş ve kolay olmaz mıydı? Hem de bedava bir domain ile! Biraz reklam gibi oldu ama amacım reklam değildi 🙂

Freenom ile 1 yıla kadar ücretsiz domain alabilirsiniz. Tabii ki uzantısı popüler olan com, net vb… gibi olmayacaktır ama django projeleriniz için bedava domainler alabileceksiniz. Ben .tk uzantısını tercih ediyorum ve şu ana kadar bir sorun çıkmadı.

Freenom üzerinde domain kaydınızı yaparken nameservers ayarlarınızı custom olarak seçin ve ns1.digitalocean.comns2.digitalocean.com olarak belirtin. IP adresine ise serverınızın IP adresini girin.

Daha sonra Digital Ocean hesabınız üzerinden DNS sekmesine gelin ve kayıt ettiğiniz domaini ekleyin.

Domainin aktif olması 30 dakika kadar sürebilir. Aldığınız domaini ziyaret ettiğinizde boş bir sayfa, hata sayfası ya da farklı bir adrese yönlendiriyorsa henüz aktif olmamış demektir. Şu ana kadar aldığım tüm domainler 30 dakika içinde aktif oldu. Bazen nameserver ayarlarının düzenlediğim şekilde kayıt etmediği oluyor. Bu gibi istisnai hata durumlarında ayarlarınızı tekrar gözden geçirmenizi tavsiye ederim.

Django Projesini Ajenti-V’ye Tanıtmak

Uzun bir yazı oldu ve ben de yazarken yoruldum. Ama mutlu sona sadece birkaç tık kaldı 🙂

  1. Ajenti panelinden websites alanına gelelim ve New Website alanından sitemize bir isim verip Create diyelim.
  2. Websites alanına yeni sitemiz eklenmiş olmalı. Manage diyelim General sekmesi altından ayarlarımızı yapmaya başlayalım.
  3. İlk önce Maintenance Mode‘u deaktif yapalım.
  4. WEBSITE FILES alanından projemizin ana dizini gösterelim. Bizim projemiz /home/kullanici/projem altında yer aldığı için bu yolu gösterelim ve SET‘e tıklayıp ayarların kaydedilmesini bekleyelim.
  5. DOMAINS sekmesinden Add deyip kayıt ettiğimiz domaini buraya girelim.
  6. CONTENT sekmesine gelelim ve Python WSGI‘i seçip Create diyelim. URL Pattern‘i / ve Exact olarak ayarlayıp, Application module alanına oluşturduğumuz Django projesinin adı olacak şekilde, djangoprojem.wsgi yazalım.
  7. Yine CONTENT sekmesi altında, Python WSGI altında bulunan Python sekmesine tıklayalım ve virtualenv path kısmına projemiz için oluşturduğunuz sanal ortamın yolunu girelim. Bizim için /home/kullanici/projem/sanalortam olacaktır. Apply Changes deyip ayarları kaydedin.
  8. CONTENT sekmesinden bu kez Static Files‘ı seçip Create diyelim. URL Pattern için /static/.* yazıp Regex’i seçelim.
  9. Static Files altındaki Advanced sekmesini açıp, Custom Path‘a static dosyalarımız için settings.py‘de STATIC_ROOT‘a yazdığımız yolu gösterelim. Biz STATIC_ROOT için projenin ana dizinini göstermiştik. Yani Custom Path için gösterdiğimiz yol /home/kullanici/projem olacak. Append URL pattern to path(root) kutucuğunu da işaretleyip ayarları kaydedelim.
  10. Kayıt ettiğiniz domaini yazın ve sitenizi ziyaret edin. “It worked!” mesajı ile karşılaşmanız gerek.

FTP ile Dosyalara Erişmek

FTP ile dosyalarınızı düzenlemek isterseniz web sitenizi yönetmek için girdiğiniz Manage alanından FTP sekmesine gelip kullanıcı ve şifre oluşturup FTP ile Django projenizin dosyalarına erişebilirsiniz.

Eğer dosyalara yazma konusunda hata alırsanız, General sekmesi altında Fix File Permissions butonuna tıklayın. FTP için oluşturduğunuz kullanıcıyı www-data gruplarına ekleyin.

FTP ile bağlanma konusunda sıkıntı yaşarsanız FTPS ile bağlanmayı deneyin.

Birkaç Uyarı ve Son Sözler

Artık bir Django projesi oluşturmak isterseniz yapmanız gereken yeni bir dizinde sanal ortam oluşturup, Django projesi kurmak ve Ajenti panelinden sitenizi tanıtmak.

Bazen terminal üzerinden komutlar girmeniz gerekecek. Mesela collectstatic, migrate vs… gibi. Dosya sahibi www-data olacağı için dosyalara yazma konusunda hata alabilirsiniz. Bu gibi durumlarda chown komutu ile proje dosyalarının sahibini kullanıcınız olarak değiştirin. Komutları çalıştırın ve işlemleriniz bittikten sonra Fix File Permissions ile dosya izinlerini eski haline getirin.

Özellikle migrate yaparken SQLite dosyasına yazma izniniz olmadığı için hata alabilirsiniz. Yukarıda anlattığım gibi chown ile db.sqlite dosyasının sahibini işlem yaptığım kullanıcı ile değiştirip komutu çalıştırıp işlemi gerçekleştiriyorum. Eğer dosya sahibini www-data olarak yeniden güncellemezseniz tarayıcı üzerinden veritabanı işlemlerinde(login, logout vb…) read-only hatası alabilirsiniz. Bunun için de bahsettiğim gibi admin panelinden Fix File Permissions yapmanız gerek.

En azından ben bu tarz sorunlarda böyle çözüme ulaşıyorum. Daha etkili bir yöntem bilenler ya da ben yanlış yapıyorsam, lütfen yorum olarak belirtin.

Son olarak python dosyalarınızı düzenleyip, servera geri yükledikten sonra değişikliklerin geçerli olmadığını görebilirsiniz. Hala eski kodlara göre uygulama çalışıyor olabilir. Bu gibi durumlarda Websites bölümde yer alan Restart Websites butonuna tıklayarak sistemi güncellemeniz gerek.

Benim karşılaştığım en önemli 2 sorun yukarıda bahsettiğim dosya izinleri ve python dosyalarını düzenledikten sonra Restart Websites yapmak. Bunu dışında herhangi bir sorunla karşılaşmadım ve ne zaman bir Django web uygulamasını yayına almak istesem, projeyi kurup Ajenti panel üzerinden dosya yollarını göstermek. Geriye kalan ayarları Ajenti’ye bırakıyorum 🙂

Kaynaklar

Share
Published by
yusufkaracin

Recent Posts

Celery Checklist [Python]

Celery ile alakalı "best practice"leri ve faydalı araçları bir araya getiren güzel bir checklist'e denk…

5 yıl ago

JavaScript Dizileri için 13 İpucu

Diziler en temel ve sık kullandığımız araçlardan... Kod yazarken işimizi kolaylaştıracak, daha temiz kod yazmamızı…

5 yıl ago

List & Tuple Mini Test (Python)

listve tuple bilginizi test etmek ister misiniz? realpython.com da keşfettiğim ve Türkçe'ye çevirdiğim mini teste…

5 yıl ago

Bilmeniz Gereken 11 Python Mülakat Sorusu

Rehberlik sağlaması ve bilgi tazelemesi açısından faydalı olduğunu düşündüğüm bir Toptal blog paylaşımınıTürkçe'ye çevirdim.Devamını okuyunBilmeniz…

5 yıl ago

Angular Componentlere Konsol Üzerinden Hızlı Erişim

Angular componentlerine console üzerinden hızlıca erişmek için kullanılan bir teknik. Unutmamak için kendime not düşüyorum.Devamını…

5 yıl ago

Birkaç Güzel JavaScript Sorusu İster Miydiniz?

Geçtiğimiz günlerde keşfettiğim ve oldukça da hoşuma giden repoyu paylaşmak istiyorum: lydiahallie/javascript-questions Genel olarak temel…

5 yıl ago