CentOS 7 Üzerinde Django Uygulamalarınızla PostgreSQL Kullanımı: Detaylı Bir Kılavuz
Django, modern web geliştirmenin en popüler ve güçlü Python tabanlı framework’lerinden biridir. Sağlam yapısı, hızlı geliştirme yetenekleri ve “pil dahil” felsefesiyle öne çıkar. Veritabanı tarafında ise, Django varsayılan olarak SQLite kullanır. Ancak, üretim ortamlarında veya daha karmaşık projelerde, daha güçlü, ölçeklenebilir ve özellik açısından zengin bir veritabanı yönetim sistemi (DBMS) tercih etmek kaçınılmaz hale gelir. İşte bu noktada PostgreSQL devreye girer. PostgreSQL, açık kaynaklı, ilişkisel bir veritabanı sistemi olup, güvenilirliği, veri bütünlüğü, güçlü özellik seti ve performansı ile bilinir. CentOS 7 ise, kurumsal düzeyde istikrarı ve güvenliği ile tanınan, geniş çapta kullanılan bir Linux dağıtımıdır. Bu makalede, CentOS 7 sunucunuzda PostgreSQL’i nasıl kuracağınızı, yapılandıracağınızı ve Django uygulamanızla sorunsuz bir şekilde nasıl entegre edeceğinizi adım adım ele alacağız.
Giriş: Django, PostgreSQL ve CentOS 7 Neden Bir Arada?
Django, web uygulamaları geliştirmek için yüksek seviyeli bir Python web framework’üdür. Hızlı geliştirme, temiz ve pratik tasarım, ve geniş topluluk desteği sayesinde birçok geliştiricinin ilk tercihi olmuştur. Django’nun ORM (Object-Relational Mapper) sistemi, Python kodunuzla veritabanı arasında köprü kurarak, SQL sorguları yazma ihtiyacını büyük ölçüde azaltır.
PostgreSQL, açık kaynak dünyasının en gelişmiş ve özellikli ilişkisel veritabanı yönetim sistemlerinden biridir. Güçlü ACID (Atomicity, Consistency, Isolation, Durability) garantileri, genişletilebilirliği, JSONB gibi gelişmiş veri tipleri desteği ve karmaşık sorguları işleyebilme yeteneği ile öne çıkar. Özellikle büyük veri setleri, yüksek eşzamanlılık gerektiren uygulamalar ve veri bütünlüğünün kritik olduğu projeler için ideal bir seçimdir. Django’nun ORM’i, PostgreSQL’in sunduğu birçok gelişmiş özelliği (örneğin, tam metin arama, coğrafi veri tipleri) doğrudan kullanmanıza olanak tanır.
CentOS 7 ise, Red Hat Enterprise Linux (RHEL) tabanlı, kararlı ve güvenilir bir sunucu işletim sistemidir. Kurumsal ortamlarda yaygın olarak kullanılır ve uzun süreli destek sunar. Güvenlik, performans ve yönetim kolaylığı açısından iyi bir denge sunar. Django ve PostgreSQL gibi kritik uygulamaları barındırmak için sağlam bir temel sağlar.
Bu üç teknolojinin birleşimi, güçlü, ölçeklenebilir ve güvenli web uygulamaları geliştirmek için ideal bir ekosistem sunar. CentOS 7’nin sağlam altyapısı üzerinde PostgreSQL’in gelişmiş veritabanı yeteneklerini kullanarak, Django uygulamanızın performansını ve güvenilirliğini en üst düzeye çıkarabilirsiniz.
Ön Gereksinimler
Bu kılavuzu takip etmeden önce aşağıdaki ön gereksinimlere sahip olduğunuzdan emin olun:
* CentOS 7 Sunucusu: SSH erişimi olan, güncel bir CentOS 7 sunucusu.
* Sudo Yetkileri: Sunucuda sudo yetkilerine sahip bir kullanıcı hesabı.
* Temel Linux Bilgisi: Komut satırı kullanımı ve dosya düzenleme konularında temel bilgi.
* Python ve Pip: Python 3 ve pip’in sunucuda kurulu olması. Genellikle CentOS 7’de Python 2.7 varsayılan olarak gelir. Python 3’ü yüklemek için:
sudo yum install python3 python3-pip
veya Software Collections (SCL) kullanarak daha yeni bir Python sürümü:
sudo yum install centos-release-scl
sudo yum install rh-python38
scl enable rh-python38 bash
Bu kılavuzda Python 3’ün kurulu olduğunu varsayacağız.
CentOS 7 Üzerine PostgreSQL Kurulumu
PostgreSQL’i CentOS 7 üzerine kurmak için birkaç adım gereklidir. Varsayılan CentOS depoları genellikle eski PostgreSQL sürümlerini içerir. Daha yeni bir sürüm istiyorsanız, PostgreSQL’in kendi resmi YUM deposunu kullanmak daha iyi bir yaklaşımdır. Ancak, bu kılavuzda varsayılan depolardaki sürümü kullanarak temel kurulumu göstereceğiz, bu da birçok kullanım durumu için yeterlidir.
EPEL Deposunu Etkinleştirme (İsteğe Bağlı ama Önerilir)
Bazı paketler veya bağımlılıklar için EPEL (Extra Packages for Enterprise Linux) deposu gerekli olabilir. Bu depoyu etkinleştirmek iyi bir uygulamadır.
sudo yum install epel-release
PostgreSQL Paketlerini Yükleme
CentOS 7 depolarında bulunan PostgreSQL sunucu ve katkı paketlerini yükleyelim:
sudo yum install postgresql-server postgresql-contrib
Bu komut, PostgreSQL sunucu yazılımını ve bazı yararlı ek araçları (örneğin pg_dump, psql) yükleyecektir. Yükleme tamamlandığında, veritabanı kümesini başlatmanız gerekir.
Veritabanını Başlatma
PostgreSQL’i kullanmaya başlamadan önce, bir veri dizini oluşturup veritabanı kümesini başlatmanız gerekir. Bu işlem, PostgreSQL’in tablolarını ve diğer nesnelerini depolayacağı dosyaları oluşturur.
sudo postgresql-setup initdb
Bu komut, /var/lib/pgsql/data dizininde yeni bir PostgreSQL veri kümesi oluşturacaktır.
PostgreSQL Servisini Başlatma ve Etkinleştirme
Veritabanı başlatıldıktan sonra, PostgreSQL servisini başlatabilir ve sunucu her yeniden başlatıldığında otomatik olarak başlaması için etkinleştirebilirsiniz.
sudo systemctl start postgresql
sudo systemctl enable postgresql
PostgreSQL Durumunu Kontrol Etme
Servisin başarıyla çalışıp çalışmadığını kontrol etmek için aşağıdaki komutu kullanabilirsiniz:
sudo systemctl status postgresql
Çıktıda active (running) ibaresini görmelisiniz.
PostgreSQL Kullanıcısı ve Veritabanı Oluşturma
Güvenlik ve izolasyon açısından, Django uygulamanız için özel bir veritabanı ve bu veritabanına erişim yetkisi olan özel bir PostgreSQL kullanıcısı oluşturmak en iyi uygulamadır. Varsayılan olarak, PostgreSQL bir postgres süper kullanıcısı oluşturur.
PostgreSQL Kabuğuna Erişim
postgres kullanıcısı olarak PostgreSQL kabuğuna (psql) erişmek için aşağıdaki komutu kullanın:
sudo -i -u postgres psql
Bu komut sizi psql komut istemcisine götürecektir.
Yeni Bir Kullanıcı Oluşturma
Django uygulamanızın kullanacağı yeni bir veritabanı kullanıcısı oluşturalım. Kullanıcı adını ve şifresini kendi tercihinize göre belirleyin. Güçlü bir şifre seçtiğinizden emin olun.
CREATE USER django_user WITH PASSWORD 'cok_guclu_sifre';
cok_guclu_sifre yerine kendi şifrenizi yazmayı unutmayın.
Yeni Bir Veritabanı Oluşturma
Şimdi Django uygulamanız için yeni bir veritabanı oluşturalım ve sahibi olarak az önce oluşturduğumuz django_user kullanıcısını atayalım.
CREATE DATABASE django_db OWNER django_user;
Bu komut, django_db adında yeni bir veritabanı oluşturur ve bu veritabanının tüm yetkilerini django_user‘a verir.
Yetkileri Kontrol Etme (İsteğe Bağlı)
Eğer isterseniz, oluşturduğunuz kullanıcıya veritabanı üzerinde açıkça tüm yetkileri verebilirsiniz, ancak OWNER olarak atandığında bu genellikle zaten sağlanır.
GRANT ALL PRIVILEGES ON DATABASE django_db TO django_user;
PostgreSQL Kabuğundan Çıkış
İşlemleriniz bittiğinde, psql kabuğundan çıkmak için \q yazıp Enter tuşuna basın:
\q
PostgreSQL Uzaktan Bağlantı Ayarları (İsteğe Bağlı ama Gerekliyse)
Eğer Django uygulamanız ve PostgreSQL veritabanınız aynı sunucuda çalışıyorsa, uzaktan bağlantı ayarlarına genellikle ihtiyacınız olmaz. Ancak, Django uygulamanız farklı bir sunucuda çalışıyorsa veya veritabanınıza başka bir makineden erişmeniz gerekiyorsa, PostgreSQL’i uzaktan bağlantılara izin verecek şekilde yapılandırmanız gerekir. Güvenlik nedeniyle, bu adımları yalnızca gerçekten ihtiyacınız varsa ve gerekli güvenlik önlemlerini (güçlü şifreler, firewall kuralları) aldığınızdan emin olarak uygulayın.
postgresql.conf Dosyasını Düzenleme
Bu dosya, PostgreSQL sunucusunun genel yapılandırma ayarlarını içerir. Uzaktan bağlantılara izin vermek için listen_addresses ayarını değiştirmeniz gerekir.
sudo vi /var/lib/pgsql/data/postgresql.conf
listen_addresses satırını bulun (genellikle yorum satırı olarak #listen_addresses = 'localhost' şeklinde bulunur) ve aşağıdaki gibi değiştirin:
listen_addresses = '*'
Bu ayar, PostgreSQL’in tüm ağ arayüzlerindeki bağlantıları dinlemesini sağlar. Daha güvenli bir yaklaşım, yalnızca belirli IP adreslerinden gelen bağlantılara izin vermektir (örneğin, listen_addresses = 'localhost,192.168.1.100').
pg_hba.conf Dosyasını Düzenleme
pg_hba.conf (host-based authentication) dosyası, hangi kullanıcıların hangi veritabanlarına hangi IP adreslerinden hangi kimlik doğrulama yöntemleriyle bağlanabileceğini tanımlar.
sudo vi /var/lib/pgsql/data/pg_hba.conf
Dosyanın sonuna aşağıdaki satırı ekleyin:
# TYPE DATABASE USER ADDRESS METHOD
host django_db django_user 0.0.0.0/0 md5
* TYPE: host (TCP/IP üzerinden bağlantı)
* DATABASE: django_db (bağlanılacak veritabanı)
* USER: django_user (bağlanacak kullanıcı)
* ADDRESS: 0.0.0.0/0 (tüm IP adreslerinden gelen bağlantılara izin ver. Bu, güvenlik açısından risklidir. Gerçek bir üretim ortamında, Django uygulamanızın çalıştığı sunucunun belirli IP adresini veya IP aralığını (örneğin, 192.168.1.0/24) belirtmelisiniz.)
* METHOD: md5 (şifre tabanlı kimlik doğrulama)
Değişiklikleri kaydedip dosyayı kapatın.
PostgreSQL Servisini Yeniden Başlatma
Yapılandırma dosyalarında yaptığınız değişikliklerin etkili olması için PostgreSQL servisini yeniden başlatmanız gerekir:
sudo systemctl restart postgresql
Firewall Ayarları
CentOS 7’de varsayılan olarak firewalld etkindir. PostgreSQL’in varsayılan portu olan 5432’ye dışarıdan erişime izin vermek için firewall’da bir kural oluşturmanız gerekir.
sudo firewall-cmd --permanent --add-service=postgresql
sudo firewall-cmd --reload
Eğer postgresql servisi tanımlı değilse veya portu doğrudan belirtmek isterseniz:
sudo firewall-cmd --permanent --add-port=5432/tcp
sudo firewall-cmd --reload
Bu adımları tamamladıktan sonra, PostgreSQL sunucunuz uzaktan bağlantılara izin verecek şekilde yapılandırılmış olacaktır.
Django Uygulamanızı PostgreSQL’e Bağlama
Şimdi sıra Django uygulamanızı PostgreSQL veritabanına bağlamaya geldi.
Python Sanal Ortamı Oluşturma ve Etkinleştirme
Her zaman olduğu gibi, Django projeniz için izole bir Python sanal ortamı kullanmak en iyi uygulamadır.
# Proje dizininize gidin veya yeni bir dizin oluşturun
mkdir my_django_project
cd my_django_project
Sanal ortam oluşturma
python3 -m venv venv
Sanal ortamı etkinleştirme
source venv/bin/activate
Gerekli Python Paketlerini Yükleme
Sanal ortam etkinleştirildikten sonra, Django ve PostgreSQL ile iletişim kurmak için psycopg2-binary paketini yüklemeniz gerekir. psycopg2-binary, psycopg2‘nin önceden derlenmiş bir sürümüdür ve derleyici bağımlılıkları olmadan kolayca kurulabilir.
pip install Django psycopg2-binary
Django Projesi Oluşturma (Varsa Atla)
Eğer zaten bir Django projeniz varsa bu adımı atlayın. Yeni bir proje oluşturmak için:
django-admin startproject myproject .
Bu komut, mevcut dizinde myproject adında bir Django projesi oluşturacaktır.
settings.py Dosyasını Yapılandırma
Django projenizin settings.py dosyasını açın ve DATABASES ayarını PostgreSQL veritabanınıza bağlanacak şekilde güncelleyin.
vi myproject/settings.py
DATABASES bölümünü aşağıdaki gibi düzenleyin:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'django_db', # Oluşturduğunuz veritabanı adı
'USER': 'django_user', # Oluşturduğunuz kullanıcı adı
'PASSWORD': 'cok_guclu_sifre', # Kullanıcının şifresi
'HOST': 'localhost', # Veritabanı sunucusunun IP adresi veya hostname
# Aynı sunucudaysa 'localhost' veya '127.0.0.1'
# Uzak sunucudaysa o sunucunun IP adresi
'PORT': '5432', # PostgreSQL'in varsayılan portu
}
}
NAME, USER, PASSWORD, HOST ve PORT değerlerini kendi yapılandırmanıza göre güncellediğinizden emin olun. Özellikle HOST değeri, PostgreSQL sunucunuzun konumuna göre değişecektir.
Veritabanı Bağlantısını Test Etme
settings.py dosyasını yapılandırdıktan sonra, Django’nun veritabanına bağlanıp bağlanamadığını ve modelleri senkronize edip edemediğini test edebilirsiniz.
Önce, Django’nun veritabanı ayarlarınızı kontrol etmesini sağlayın:
python manage.py check
Herhangi bir hata görmüyorsanız, bağlantı başarılı demektir. Şimdi Django’nun başlangıçtaki veritabanı tablolarını oluşturmak için migrasyonları çalıştırın:
python manage.py makemigrations
python manage.py migrate
migrate komutu, Django’nun dahili tablolarını (kullanıcılar, oturumlar vb.) ve varsa kendi uygulamalarınızın modelleri için tabloları PostgreSQL veritabanınızda oluşturacaktır. Herhangi bir hata almazsanız, Django uygulamanız başarıyla PostgreSQL’e bağlanmış demektir.
Süper Kullanıcı Oluşturma
Django yönetim panelini kullanabilmek için bir süper kullanıcı oluşturun:
python manage.py createsuperuser
Komut istemlerini takip ederek kullanıcı adı, e-posta ve şifre belirleyin.
Django Uygulamasını Çalıştırma
Son olarak, Django geliştirme sunucusunu çalıştırarak uygulamanızın düzgün çalıştığını doğrulayın:
python manage.py runserver 0.0.0.0:8000
Eğer firewall’ınız açıksa, sunucunuzun IP adresini ve 8000 portunu kullanarak web tarayıcınızdan uygulamanıza erişebilirsiniz (örn. http://sunucu_ip_adresi:8000/admin/). Süper kullanıcı bilgilerinizle giriş yaparak Django yönetim panelini kontrol edebilirsiniz.
Gelişmiş Konular ve En İyi Uygulamalar
Django uygulamanızı PostgreSQL ile başarıyla entegre ettikten sonra, üretim ortamları için veya daha iyi performans ve güvenilirlik sağlamak adına bazı gelişmiş konuları ve en iyi uygulamaları göz önünde bulundurmanız önemlidir.
Güvenlik İpuçları
* Güçlü Şifreler: Veritabanı kullanıcılarınız için her zaman güçlü, karmaşık şifreler kullanın.
* Uzaktan Erişimi Kısıtlama: pg_hba.conf ve postgresql.conf dosyalarında 0.0.0.0/0 yerine, uygulamanızın çalıştığı sunucunun belirli IP adreslerini veya güvenli ağ aralıklarını belirtin.
* SSL/TLS Kullanımı: Veritabanı bağlantılarını şifrelemek için SSL/TLS kullanın. Django settings.py içinde OPTIONS={'sslmode': 'require'} gibi ayarlar ekleyerek bunu zorunlu kılabilirsiniz.
* Ayrıcalıkların En Azı Prensibi: Django uygulamanızın veritabanı kullanıcısına yalnızca ihtiyaç duyduğu minimum yetkileri verin. Süper kullanıcı yetkilerini asla uygulama kullanıcısına vermeyin.
* SELinux: CentOS 7’de SELinux varsayılan olarak etkindir. PostgreSQL veya Django uygulamanızın dosya erişiminde sorunlar yaşıyorsanız, SELinux politikalarını kontrol etmeniz veya uygun kuralları eklemeniz gerekebilir. Geçici olarak kapatmak yerine (ki bu güvenlik riski taşır), semanage veya audit2allow gibi araçlarla doğru politikaları oluşturun.
Performans Optimizasyonu
* İndeksleme: Sıkça sorgulanan sütunlara (özellikle WHERE ve ORDER BY clause’larında kullanılanlara) indeksler ekleyerek sorgu performansını önemli ölçüde artırabilirsiniz. Django’da db_index=True veya indexes meta seçeneğini kullanarak indeksler oluşturabilirsiniz.
* Sorgu Optimizasyonu: N+1 sorgu sorunlarından kaçınmak için select_related() ve prefetch_related() gibi Django ORM özelliklerini kullanın. Karmaşık sorguları optimize etmek için EXPLAIN ANALYZE komutuyla sorgu planlarını inceleyin.
* Bağlantı Havuzlama (Connection Pooling): Yüksek trafikli uygulamalarda, her istek için yeni bir veritabanı bağlantısı açmak yerine, PgBouncer gibi bir bağlantı havuzlama aracı kullanmak performansı artırabilir ve veritabanı üzerindeki yükü azaltabilir.
* Veritabanı Bakımı: PostgreSQL’de düzenli VACUUM ve ANALYZE işlemleri, ölü tuple’ları temizleyerek ve sorgu planlayıcısını güncelleyerek performansı artırır. Bu işlemleri otomatikleştirmek için autovacuum ayarlarını kontrol edin.
Yedekleme ve Geri Yükleme
Veri kaybını önlemek için düzenli yedeklemeler kritik öneme sahiptir.
* pg_dump: PostgreSQL’in yerleşik pg_dump aracı, veritabanınızın yedeğini almak için kullanılır.
pg_dump -U django_user -h localhost django_db > django_db_yedek.sql
* pg_restore: pg_dump ile alınan yedekleri geri yüklemek için pg_restore kullanılır.
psql -U django_user -h localhost -d django_db < django_db_yedek.sql
* Otomatik Yedekleme Çözümleri: Cron işleri veya özel betikler kullanarak düzenli ve otomatik yedeklemeler oluşturmayı planlayın. Yedekleri farklı bir depolama konumuna (uzak sunucu, bulut depolama) taşımayı unutmayın.
Dağıtım ve Ölçeklenebilirlik
* Gunicorn/Nginx ile Dağıtım: Geliştirme sunucusu (runserver) üretim için uygun değildir. Django uygulamanızı Gunicorn gibi bir WSGI sunucusu ve Nginx gibi bir ters proxy/web sunucusu ile dağıtın. Nginx, statik dosyaları sunar, trafiği yönetir ve SSL sonlandırması yapar.
* Veritabanı Replikasyonu: Yüksek kullanılabilirlik ve okuma performansı için PostgreSQL replikasyonunu (örneğin, akış replikasyonu) kullanmayı düşünebilirsiniz. Bu, birincil veritabanı sunucusunun başarısız olması durumunda ikincil bir sunucunun devreye girmesini sağlar.
Sorun Giderme
Kurulum veya yapılandırma sırasında karşılaşabileceğiniz bazı yaygın sorunlar ve çözümleri:
* psycopg2 Kurulum Hataları: psycopg2-binary yerine psycopg2 kurmaya çalışırken derleyici bağımlılıkları (örneğin pg_config bulunamadı) nedeniyle hatalar alabilirsiniz. postgresql-devel paketini yükleyerek bu bağımlılıkları çözebilirsiniz:
sudo yum install postgresql-devel
Ancak psycopg2-binary genellikle bu sorunları aşar.
* Bağlantı Hataları:
* FATAL: password authentication failed for user "django_user": settings.py dosyasındaki kullanıcı adı veya şifrenin doğru olduğundan emin olun.
* FATAL: Peer authentication failed for user "django_user": pg_hba.conf dosyasındaki kimlik doğrulama yöntemini kontrol edin. md5 yerine peer veya ident kullanılıyorsa, bu hatayı alırsınız.
* could not connect to server: Connection refused:
* PostgreSQL servisi çalışmıyor olabilir (sudo systemctl status postgresql ile kontrol edin).
* Firewall, 5432 portuna erişimi engelliyor olabilir (sudo firewall-cmd --list-all ile kontrol edin ve gerekirse kural ekleyin).
postgresql.conf dosyasındaki listen_addresses ayarı yanlış olabilir (uzak bağlantılar için '' veya doğru IP adresi olmalı).
* Veritabanı Bulunamadı/Kullanıcı Yetkisi Yok Hataları: settings.py dosyasındaki NAME ve USER değerlerinin PostgreSQL'de oluşturduğunuz veritabanı ve kullanıcı ile tam olarak eşleştiğinden emin olun. Kullanıcının veritabanı üzerinde gerekli yetkilere sahip olup olmadığını psql kabuğundan kontrol edin.
* CentOS 7'de SELinux Etkileşimi: Eğer uygulamanız veya PostgreSQL bir dosyaya veya dizine erişirken "Permission denied" hataları alıyorsa ve her şey doğru görünüyorsa, SELinux etkin olabilir. sudo getenforce ile durumunu kontrol edin. setenforce 0 ile geçici olarak kapatıp sorunun çözülüp çözülmediğini test edebilirsiniz. Ancak kalıcı çözüm için SELinux politikalarını doğru şekilde yapılandırmanız önerilir. Örneğin, Django uygulamanızın statik dosyaları veya medya dosyalarını sunarken sorun yaşarsanız, chcon veya semanage komutlarını kullanmanız gerekebilir.
Sonuç
Bu kapsamlı kılavuzda, CentOS 7 sunucunuzda PostgreSQL'i sıfırdan kurmayı, Django uygulamanız için özel bir kullanıcı ve veritabanı oluşturmayı, uzak bağlantıları yapılandırmayı ve Django projenizi bu veritabanına bağlamayı adım adım öğrendiniz. Ayrıca, üretim ortamlarında dikkate almanız gereken güvenlik, performans optimizasyonu, yedekleme ve sorun giderme gibi önemli konulara da değindik.
Django ve PostgreSQL kombinasyonu, modern web uygulamaları geliştirmek için son derece güçlü ve esnek bir platform sunar. CentOS 7'nin sağlam ve güvenilir altyapısı üzerinde bu iki teknolojiyi bir araya getirerek, yüksek performanslı, ölçeklenebilir ve veri bütünlüğüne sahip uygulamalar geliştirebilirsiniz. Unutmayın ki, her üretim ortamı kendine özgü gereksinimlere sahiptir; bu kılavuzdaki bilgileri kendi projenizin özel ihtiyaçlarına göre uyarlamaktan çekinmeyin. Güvenlik ve performans en iyi uygulamalarını sürekli göz önünde bulundurarak, uygulamanızın sorunsuz ve verimli bir şekilde çalışmasını sağlayabilirsiniz.