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:
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.
Digital Ocean üzerinde server sahibi olmayanlar aşağıdaki rehberleri takip ederek yeni bir server kurup, güvenli bir şekilde bağlanabilirler.
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.
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.
İ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
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
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 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.
Ş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.
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.com, ns2.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.
Uzun bir yazı oldu ve ben de yazarken yoruldum. Ama mutlu sona sadece birkaç tık kaldı 🙂
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.
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 🙂
Celery ile alakalı "best practice"leri ve faydalı araçları bir araya getiren güzel bir checklist'e denk…
Diziler en temel ve sık kullandığımız araçlardan... Kod yazarken işimizi kolaylaştıracak, daha temiz kod yazmamızı…
listve tuple bilginizi test etmek ister misiniz? realpython.com da keşfettiğim ve Türkçe'ye çevirdiğim mini teste…
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…
Angular componentlerine console üzerinden hızlıca erişmek için kullanılan bir teknik. Unutmamak için kendime not düşüyorum.Devamını…
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…