Python Django — Lokal Django projemizi yayına alalım

Mr.GoodKat
Kodcular
Published in
6 min readDec 29, 2017

Kullandığım server digitalocean olduğu için anlatacağım kısımlar digitalocean’a göre olacak fakat aşağı yukarı işlemlerin hepsi her server da aynıdır.

Kullandığım Digitalocean droplet’i 5$ lık paket ve swap işlemi ile birlikte server’ın ram kapasitesini 4 gb olarak ayarlıyorum ve 20 gb lık hdd üzerinden ram takviyesi yapıyoruz deyim yerindeyse;

Centos 7 güvenlik ayarları işlemi :

Centos 7 firewall işlemleri:

Centos 7 de swap işlemi :

  • Centos 7 işletim sistemini kurduğumuzda üstünde Python 2.7 kurulu bir biçimde geliyor fakat bize Python 3.5 lazım (ya da hangi versiyon kullanmaktaysanız.)
  • Önce paketlerimizi update etmeliyiz ve development tool’larımızı kurmalyız.

sudo yum -y update
sudo yum -y install yum-utils
sudo yum -y groupinstall development

  • Python 3 kurulumu yapıyoruz

sudo yum -y install https://centos7.iuscommunity.org/ius-release.rpm
sudo yum -y install python35u

  • Bu kurulumu başarılı bir şekilde gerçekleştirdiğimizi anlamak için;

python3.5 -V

komutunu terminalimize yazdığımızda bize dönen değer python versiyonumuzu verecektir.

Python 3.5

  • Şimdi python versiyonumuzun paket yöneticisini kurmamız lazım.

sudo yum -y install python36u-pip

  • İndirdiğimiz python versiyonunun development paketini indirmeliyiz.

sudo yum -y install python36u-devel

  • Kullancığımız veritabanı Postgresql olacak ve bu yüzden server’ımıza postgresql indiriyoruz.

sudo yum install epel-release
sudo yum install gcc postgresql-server postgresql-devel postgresql- contrib

  • Postgresql’i indirdikten sonra gerekli ayarları yapıp aktif hale getirmeliyiz.

sudo postgresql-setup initdb

sudo systemctl start postgresql

  • Postgresql’in config dosyasında bazı ayarları değiştirmemiz gerekiyor ve bunun için bir editöre ihtiyacımız var. Vim,nano vs. fakat ben nano kullanmaktayım.Nano kurmak için;

sudo yum install nano

  • Şimdi postgresql config dosyamızın ayarlarını yapmalıyız. Bu ayarlama işlemini yapma sebebimiz veritabanımızdan dışardan erişimleri kapatmak. #(diyez işaretli olanlar yorum satırına aldıklarımız ve alttaki kısım değişiklik yaptığımız kısım.)

sudo nano /var/lib/pgsql/data/pg_hba.conf

  • Değişiklik işlemimiz bittikten sonra dosyamızı ctrl+x ile kapatıp kaydediyoruz. Ve daha sonrasında postgresql servisimizi yeniden başlatıp aktif hale getiriyoruz.

sudo systemctl restart postgresql
sudo systemctl enable postgresql

  • Django projemizi Nginx web serverı üzerinde kullanmalıyız eğer iyi bir performans elde etmek istiyorsak. Bu yüzden nginx kurulumu yapıyoruz.

sudo yum -y install nginx

  • Supervisor isimli ufak bir paketimiz var bu paket’in çok güzel bir olayı var o da; eğer server’ınız yeniden başlatılırsa ve ya elde olmayan sebeplerde ötürü kapanıp tekrar açılırsa supervisor django aplikasyonumuzu tekrardan otomatik olarak çalışır duruma getiriyor. Mühim olay. Şimdi onu kaydetmeliyiz.

sudo yum -y install supervisor
sudo systemctl enable supervisor
sudo systemctl start supervisor

  • Şimdi django projemizi aynı local’imizde virtualenv modunda çalıştırabilmemiz için virtualenv kurulumu yapmamız lazım.

sudo yum -y install python-virtualenv

  • Bu işlemleri yaptıktan aslında pek Bir şey kalmadı. İlk başta uzun görünse de işlemler; benim gibi öğrenmek için 15–20 defa tekrar ve tekrar kurduğunuzda bu işlemler otomatikleşiyor. Virtualenv kurulumu yapıldıktan sonra size önerim server’ınız bir snapshot’ını almanız. Digitalocean da bu durum tek tuşla oluyor fakat önce server’ınızın gücünü kapatmalısınız ve daha sonrasında snapshot işlemini yapmalısınız. Bu işlemleri tekrar tekrar yapmanız gerekmez böylelikle.
  • Şimdi projemiz için veritabanı oluşturmalıyız. (Eğer var ise). Önce postgres kullanıcısına geçiş yapmalıyız.

su — postgres
createuser u_urban createdb
– yeni bir postgres kullanıcısı oluşturuyoruz

urban_prod — owner u_urban
– yeni bir veritabanı oluşturup oluşturduğumuz kullanıcımızı veritabanımıza owner olarak yani yönetici olarak ekliyoruz.

psql -c “ALTER USER u_urban WITH PASSWORD ‘123’”
- ve kullanıcımızın veritabanına erişmesi için bir şifre belirliyoruz.

  • Daha sonra işlemlerimizi bitirdikten sonra çıkış işlemi yapıyoruz.

exit

  • Bu zamana kadar bu işlemleri “root” kullanıcısı adı altında gerçekleştirdik fakat şimdiki işlemleri yeni bir kullanıcı oluşturarak yapmamız lazım güvenliği arttırmamız sebebiyle.

adduser urban
passwd urban
gpasswd -a urban wheel
(kullanıcımızı grup olarak ekleme işlemi)

  • Oluşturduğumuz kullanıcımız ile işlemlerimizi gerçekleştirmemiz lazım. Bu yüzden kullanıcımıza geçiş yapmalıyız.

su — urban

  • Kullanıcımıza geçiş yaptıktan sonra django’yu kuracağımız dizin otomatik olarak” /home/urban” dizinleri olacak.

Öncelikle direk home klasöründe virtualenv ortamını aktif etmeliyiz.

virtualenv . -> işlemin sonunda nokta işaretini unutmuyoruz

Şimdi ortamımızı aktif etmeliyiz.

source bin/activate

  • Şimdi burada isterseniz yeni sıfırdan bir django indirin ya da bilgisayarınızda çalıştırdığınız django’yu yayına almak isteyin. Eğer yeni bir indirme yapacak isek;

pip install django
pip install psycopg2

  • Eğer bizim local bilgisayarımızdaki django projesiniz yayına alacak isek kendimize bir gitlab’ta veya github’da repository oluşturup projemizi oraya çekmeliyiz. Ben özel repository kullandığım için gitlab’ı kullanıyorum.
    Projemizi gitlab’a atmalıyız fakat atmadan önce; local bilgisayarımızdaki projemizde bazı ayarlar yapmalıyız.
    Local bilgisayarımızda virtualenv ortamında projemize ait “requirements.txt” dosyası oluşturmalıyız. Bu işlem;
    pip freeze > requiremets.txt
    komutu ile olmaktadır.
  • “Requirements.txt” işleminden sonra “.gitignore” dosyasından gerekli ayarlamaları yaparak projemize gitlab’a veya github da oluşturduğumuz repository’e atmalıyız. Bu işlemler hakkında bilgi bolca web’de buunmaktadır.
  • Daha sonrasında server’ımıza local bilgisayarımızdaki kullandığımız django projesini yayınlamak istiyorsak git üzerinden dosyalarımızı çekmeliyiz. Bu işlemi oluşturduğumuz kullanıcı ile login ile yapmalıyız.

sudo git clone https://github.com/sibtc/urban-train.git

  • git üzerinden aldığımız proje klasörüne giriyoruz ve “requirements.txt” dosyasında yer alan projemizde kullandığımız paketleri ve proje versiyonumuzu,vs. İşlemleri otomatik olarak kurmamızı komutunu veriyoruz.

cd urban-train
pip install -r requirements.txt

  • Daha sonrasında projemizin “settings.py” dosyasından veritabanı ayarlarını ve “staticfile” dosya ayarlarını yapmalıyız.

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

  • bu işlmelerden sonra veritabanımıza “migrate” işlemi ile tablolarımızı kopyalamalıyız.

python manage.py migrate

  • Eğer kullandığımız dosyaları staticfiles olarak ayarlamadıysak (ki bu işlemi server’da yapmak en mantıklısı) dosya işlemlerini ayarlamalıyız.

python manage.py collectstatic

  • Gunicorn servisimizi yüklemeliyiz.

pip install gunicorn

  • virtualenv dosyamızda yer alan bin dizininin içine “gunicorn_start” adında bir dosya oluşturmalıyız.

nano /home/urban/bin/gunicorn_start

  • oluşturduğumuz “gunicorn_start” dosyasını “executable” yapmalıyız.

chmod u+x bin/gunicorn_start

  • projemizin ana klasörü ile aynı yerde olacak olan bir “run” adında bir klasör oluşturmalıyız ki bu klasör “unix socket” dosyası olarak işlem görecek. “gunicorn_start” dosyamız için gerekli bir dosyadır.

mkdir run

  • “supervisor” ayarlarımızı yapmamız lazım. Virtualenv içinde gunicorn hata kayıtlarını tutan bir log dosyası oluşturmalıyız ki hatalarımız olduğunda nerede olduğunu tespit edelim.

mkdir logs
touch logs/gunicorn-error.log

  • projemiz için “supervisor configuration” dosyası oluşturalım.

sudo nano /etc/supervisor/conf.d/urban-train.conf

  • Dosyamızı oluşturduktan sonra “supervisor” servisimizi yeniden başlatalım ve “config” dosyamızı okumasını söyleyelim.

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl status urban-train

Ekran görüntüsü bu şekilde olmalı:

urban-train RUNNING pid 23381, uptime 0:00:15

Eğer errorlük bir durum varsa gunicorn-error.log dosyasına gidip hatanın ne olduğunu görebiliriz.

İşlem başarılı olduysa artık dosyalarımızda değişiklik yaptığımızda supervisor servisini yeniden başlatmamız yetecektir.

sudo supervisorctl restart urban-train

  • Şimdi nginx web server ayarlarını yapmaya geldi sıra. Web sitemizin yer alacağı bir config dosyası oluşturmalıyız. Benim sistemde sites-available klasörü yoktu ve o klasörü elle oluşturmam gerekti.

sudo vim /etc/nginx/sites-available/urban-train

  • nginx te yer alan standart site dosyasını kaldırıyoruz.

sudo rm /etc/nginx/sites-enabled/default

  • nginx server’ını tekrardan başlatıyoruz.

sudo service nginx restart

  • Son olarak makinemizi reboot komutuyla yeniden başlatıyoruz ve herşey istediğimiz gibi mi diye bakıyoruz. Makineyi yeniden başlattığımızda sistemimiz kendi kendine çalışmalı.

sudo reboot

  • Ben bu kısımda socket dosyasına “Permission Denied“ hatası aldığımdan dolayı django projem yayına alınmadı bir türlü ve klasör erişim haklarını her şekilde doğru ayarlamama rağmen hep “Permission Hatası” aldım.
    Bu hatadan kurtulmak için;

sudo nano /etc/sysconfig/selinux dosyasından

SELINUX=permissive

işlemini yapmalıyız. Bunun için sanırım 1 hafta mı harcamıştım. Ve herkesin bu şekilde çözdüğünü gördüm.

Ve mutlu son…

Artık django dosyalarımızı update edeceğimiz zaman şu işlemleri yapmalıyız.

source bin/activate

cd urban-train

git pull origin master

python manage.py collectstatic

python manage.py migrate

sudo supervisorctl restart urban-train

Bu işlemlerden sonra sistemimiz kullanıcılarınız anlamadığı bir anda yeniden yüklenecektir.

Python — django ile şüphesiz yazılım projelerinizi çok daha hızlı çıkartmaktasınız. Eğer benim gibi uzun yıllar .net ortamında yetiştiyseniz ilk başta zorlukları oluyor fakat inanın bana daha zevkli. Python django ya kesinlikle geçmenizi öneririm…

Yeni girişim projem olan leapcrowd.co yu bu şekilde yayına aldım. Siz de teknik kişi veya girişimci olarak sistemime kayıt olabilirsiniz.

Teşekkürler,

--

--

Mr.GoodKat
Kodcular

I am a software developer. I’ve been working on my own projects lately! — http://www.leapcrowd.co