Takip et

Yerel Django Uygulamasını Bir VPS’e Dağıtma Rehberi

Yerel Django Uygulamasını Bir VPS’e Dağıtma Rehberi Django, Python ile hızlı ve verimli web uygulamaları geliştirmek için kullanılan popül

Yerel Django Uygulamasını Bir VPS’e Dağıtma Rehberi

Django, Python ile hızlı ve verimli web uygulamaları geliştirmek için kullanılan popüler bir web çatısıdır. Geliştirme ortamında her şey sorunsuz çalışırken, uygulamanızı canlı bir sunucuya taşımak, yani “dağıtmak” (deploy etmek), genellikle geliştiricilerin karşılaştığı en büyük zorluklardan biridir. Bu makalede, yerel olarak geliştirdiğiniz bir Django uygulamasını Sanal Özel Sunucu (VPS) üzerine nasıl dağıtacağınızı adım adım, detaylı bir şekilde ele alacağız. Bu süreç, uygulamanızın dünya genelindeki kullanıcılara erişilebilir olmasını sağlamanın temel adımıdır.

Giriş: Neden Bir VPS ve Neden Django Dağıtımı Önemli?

Django, güçlü ve esnek bir yapıya sahip olmasına rağmen, üretim ortamında doğru bir şekilde yapılandırılmadığında performans ve güvenlik sorunları yaşayabilir. Yerel geliştirme ortamınızda kullandığınız SQLite veritabanı veya python manage.py runserver komutu gibi araçlar, canlı bir web sitesinin gereksinimlerini karşılamaktan uzaktır.

Bir Sanal Özel Sunucu (VPS), uygulamanızı barındırmak için ideal bir çözümdür. Paylaşımlı hosting’e göre daha fazla kontrol, esneklik ve kaynak sunarken, Dedicated Sunucu’ya göre daha uygun maliyetlidir. Kendi sunucunuz üzerinde tam kök erişimine sahip olmanız, Django uygulamanızın ve bağımlılıklarının tam olarak istediğiniz gibi yapılandırılmasına olanak tanır.

Bu makale, aşağıdaki temel bileşenleri kullanarak bir Django uygulamasını dağıtma sürecini kapsayacaktır:

* Django: Web uygulamamız.
* Gunicorn: Django uygulamasını HTTP sunucusuyla iletişim kurabilen bir WSGI (Web Server Gateway Interface) sunucusuna dönüştüren bir uygulama sunucusu.
* Nginx: Gelen HTTP isteklerini işleyen, statik dosyaları sunan ve istekleri Gunicorn’a yönlendiren bir ters proxy (reverse proxy) web sunucusu.
* PostgreSQL: Üretim ortamında güvenilir ve ölçeklenebilir bir veritabanı.
* Certbot (Let’s Encrypt): Uygulamanız için ücretsiz SSL/TLS sertifikaları sağlayarak HTTPS’yi etkinleştirme.
* Ubuntu Server: VPS üzerinde çalışacak işletim sistemi.

Bu adımları takip ederek, uygulamanızı güvenli, performanslı ve erişilebilir bir şekilde canlıya alabileceksiniz.

Ön Koşullar

Dağıtım sürecine başlamadan önce aşağıdaki maddelerin hazır olduğundan emin olmalısınız:

1. Yerel Django Uygulaması: Dağıtılmaya hazır, çalışan bir Django projeniz olmalı. requirements.txt dosyanızın güncel olduğundan emin olun.
2. VPS Hesabı: DigitalOcean, Linode, AWS EC2, Google Cloud veya benzeri bir sağlayıcıdan alınmış, Ubuntu 20.04 veya 22.04 LTS yüklü bir VPS’iniz olmalı.
3. SSH Erişimi: VPS’inize SSH üzerinden bağlanabilmek için bir SSH istemcisi (Linux/macOS’ta terminal, Windows’ta PuTTY veya WSL) ve VPS IP adresiniz/root şifreniz veya SSH anahtarınız olmalı.
4. Alan Adı (Domain Name): İsteğe bağlı olsa da, uygulamanıza bir alan adı üzerinden erişmek için bir alan adınız ve DNS kayıtlarını (A kaydı) VPS IP adresinize yönlendirilmiş olmalı.
5. Temel Linux Bilgisi: Komut satırı (terminal) kullanımı hakkında temel bilgi sahibi olmak süreci kolaylaştıracaktır.
6. Git: Projenizi bir Git deposunda (GitHub, GitLab, Bitbucket) barındırmak, VPS’e kolayca aktarım yapmanızı sağlar.

Django Uygulamanızı Üretim Ortamına Hazırlama

Yerel uygulamanızı dağıtıma hazırlamak, güvenlik ve performans açısından kritik adımları içerir.

1. settings.py Dosyasını Düzenleme

Uygulamanızın settings.py dosyasında bazı değişiklikler yapmanız gerekecek:

* DEBUG = False: Üretim ortamında DEBUG modunu kesinlikle False olarak ayarlayın. Bu, hassas bilgilerin hata sayfalarında gösterilmesini engeller ve performansı artırır.
* ALLOWED_HOSTS: Uygulamanızın erişilebilir olacağı alan adlarını veya IP adreslerini bu listeye ekleyin. Örneğin: ALLOWED_HOSTS = ['your_domain.com', 'www.your_domain.com', 'your_vps_ip_address'].
* SECRET_KEY: Bu anahtarın güvende tutulması çok önemlidir. Üretim ortamında bu anahtarı bir ortam değişkeni olarak veya başka güvenli bir yöntemle yönetmelisiniz. django-environ kütüphanesi bu konuda yardımcı olabilir.

# settings.py
    import os
    from pathlib import Path
    
    # ...
    
    SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'your_insecure_local_key_for_dev')
    
    # ...

* Veritabanı Yapılandırması: Yerel olarak SQLite kullanıyor olabilirsiniz, ancak üretim ortamında PostgreSQL veya MySQL gibi daha güçlü bir veritabanı kullanmak önerilir.

# settings.py
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': 'your_db_name',
            'USER': 'your_db_user',
            'PASSWORD': 'your_db_password',
            'HOST': 'localhost', # veya veritabanı sunucunuzun adresi
            'PORT': '',
        }
    }

PostgreSQL kullanacaksanız, psycopg2-binary paketini requirements.txt dosyanıza eklemeyi unutmayın.
* Statik Dosyalar (Static Files): Django, statik dosyaları (CSS, JavaScript, resimler) geliştirme modunda otomatik olarak sunar, ancak üretimde Nginx gibi bir web sunucusunun bu dosyaları doğrudan sunması gerekir.

# settings.py
    STATIC_URL = '/static/'
    STATIC_ROOT = BASE_DIR / 'staticfiles' # Uygulamanızın kök dizininde 'staticfiles' adında bir klasör oluşturacak
    
    MEDIA_URL = '/media/'
    MEDIA_ROOT = BASE_DIR / 'mediafiles' # Kullanıcı tarafından yüklenen dosyalar için

2. Bağımlılıkları Yönetme

Uygulamanızın tüm Python bağımlılıklarını requirements.txt dosyasına kaydettiğinizden emin olun. Bu, sanal ortamınızda tüm bağımlılıkları tek bir komutla kurmanızı sağlayacaktır.

pip freeze > requirements.txt

3. Veritabanı Geçişleri (Migrations)

Veritabanı şemanızın güncel olduğundan emin olun.

python manage.py makemigrations
python manage.py migrate

4. Ortam Değişkenleri (Environment Variables)

Hassas bilgileri (SECRET_KEY, veritabanı şifreleri, API anahtarları vb.) doğrudan settings.py içinde tutmak yerine ortam değişkenleri olarak yönetmek en iyi uygulamadır. django-environ kütüphanesi bu konuda size yardımcı olabilir.

pip install django-environ

Ardından, projenizin kök dizinine .env adında bir dosya oluşturabilir ve hassas bilgileri buraya yazabilirsiniz:

DJANGO_SECRET_KEY=your_super_secret_key_here
DJANGO_DB_NAME=your_db_name
DJANGO_DB_USER=your_db_user
DJANGO_DB_PASSWORD=your_db_password

settings.py dosyanızda bunları okumak için:

# settings.py
import environ

env = environ.Env(
    # set casting and default values
    DEBUG=(bool, False)
)

reading .env file

environ.Env.read_env()

False if not in os.environ

DEBUG = env('DEBUG')

Raises django.core.exceptions.ImproperlyConfigured if SECRET_KEY not in os.environ

SECRET_KEY = env('DJANGO_SECRET_KEY') ALLOWED_HOSTS = env.list('DJANGO_ALLOWED_HOSTS', default=[]) # Örneğin .env'de DJANGO_ALLOWED_HOSTS=domain.com,www.domain.com DATABASES = { 'default': env.db(), # Reads DATABASE_URL from .env }

Bu yaklaşım, kodunuzu hassas bilgilerden arındırır ve güvenliği artırır.

VPS Kurulumu

Şimdi VPS’inize bağlanıp gerekli kurulumları yapma zamanı.

1. SSH ile VPS’e Bağlanma

Terminalinizi açın ve aşağıdaki komutu kullanarak VPS’inize bağlanın (kök kullanıcı olarak veya size verilen kullanıcı adı ile):

ssh root@your_vps_ip_address

Eğer SSH anahtarı kullanıyorsanız:

ssh -i /path/to/your/private_key.pem your_user@your_vps_ip_address

2. Sistemi Güncelleme

Bağlandıktan sonra, sistem paketlerini güncelleyin:

sudo apt update && sudo apt upgrade -y

3. Yeni Bir Kullanıcı Oluşturma ve Yetkilendirme (Önerilen)

root kullanıcısı olarak sürekli çalışmak güvenlik riski taşır. Yeni bir kullanıcı oluşturup ona sudo yetkisi vermek daha güvenlidir.

sudo adduser your_username
sudo usermod -aG sudo your_username

Şimdi yeni kullanıcınıza geçiş yapın:

su - your_username

Eğer SSH anahtarı kullanıyorsanız, anahtarınızı yeni kullanıcının ~/.ssh/authorized_keys dosyasına kopyalamayı unutmayın.

4. Güvenlik Duvarını Yapılandırma (UFW)

UFW (Uncomplicated Firewall), Ubuntu’da güvenlik duvarını yönetmek için kolay bir araçtır.

sudo apt install ufw -y
sudo ufw allow OpenSSH # SSH bağlantısının kesilmemesi için
sudo ufw allow 'Nginx HTTP' # Nginx için HTTP (80) portunu aç
sudo ufw allow 'Nginx HTTPS' # Nginx için HTTPS (443) portunu aç (ileride SSL için)
sudo ufw enable
sudo ufw status # Güvenlik duvarının durumunu kontrol edin

5. Gerekli Paketleri Kurma

Django uygulamamız ve yardımcı servisler için gerekli yazılımları kuralım:

* Python ve venv:

sudo apt install python3-pip python3-venv -y

* PostgreSQL Veritabanı:

sudo apt install postgresql postgresql-contrib -y

* Nginx Web Sunucusu:

sudo apt install nginx -y

* Git:

sudo apt install git -y

PostgreSQL Veritabanını Yapılandırma

Django uygulamamız için bir veritabanı ve kullanıcı oluşturmamız gerekiyor.

sudo -i -u postgres
psql

PostgreSQL komut istemine girdikten sonra:

CREATE DATABASE your_db_name;
CREATE USER your_db_user WITH PASSWORD 'your_db_password';
ALTER ROLE your_db_user SET client_encoding TO 'utf8';
ALTER ROLE your_db_user SET default_transaction_isolation TO 'read committed';
ALTER ROLE your_db_user SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE your_db_name TO your_db_user;
\q

Şimdi postgres kullanıcısından çıkın:

exit

Django Uygulamasını VPS’e Dağıtma

Artık VPS’imiz hazır olduğuna göre, Django projemizi sunucuya aktarabiliriz.

1. Projeyi Klonlama

Projenizi genellikle /var/www/ dizini altına dağıtmak iyi bir uygulamadır. Bu dizini oluşturun ve yetkilerini ayarlayın:

sudo mkdir -p /var/www/
sudo chown -R your_username:your_username /var/www/
cd /var/www/
git clone https://github.com/your_username/your_project.git your_project_name
cd your_project_name

2. Sanal Ortam Oluşturma ve Bağımlılıkları Yükleme

Proje dizininizde bir Python sanal ortamı oluşturun ve etkinleştirin:

python3 -m venv venv
source venv/bin/activate

Şimdi requirements.txt dosyasındaki tüm bağımlılıkları yükleyin:

pip install -r requirements.txt

psycopg2-binary (PostgreSQL için) ve gunicorn paketlerinin requirements.txt içinde olduğundan emin olun. Eğer yoksa, şimdi kurun:

pip install gunicorn psycopg2-binary

3. settings.py Ortam Değişkenlerini Ayarlama

Eğer .env dosyası kullanıyorsanız, projenizin kök dizininde bir .env dosyası oluşturun ve hassas bilgilerinizi buraya ekleyin:

nano .env

İçeriği aşağıdaki gibi doldurun (kendi bilgilerinizle):

DJANGO_SECRET_KEY=your_super_secret_key_here
DJANGO_DB_NAME=your_db_name
DJANGO_DB_USER=your_db_user
DJANGO_db_password=your_db_password
DJANGO_ALLOWED_HOSTS=your_domain.com,www.your_domain.com,your_vps_ip_address
DEBUG=False

Ctrl+X, Y, Enter ile kaydedip çıkın.

4. Django Veritabanı Geçişleri ve Süper Kullanıcı Oluşturma

Veritabanı bağlantı bilgilerinizin settings.py dosyanızda doğru olduğundan emin olduktan sonra, veritabanı geçişlerini çalıştırın ve bir yönetici (superuser) oluşturun:

python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser

5. Statik Dosyaları Toplama

Django’nun tüm statik dosyalarını (STATIC_ROOT olarak belirlediğiniz dizine) toplamasını sağlayın:

python manage.py collectstatic

Bu komut, Nginx’in sunacağı tüm statik dosyaları tek bir yerde toplayacaktır. Komut sizden onay isteyebilir, yes yazıp onaylayın.

Gunicorn Yapılandırması

Gunicorn, Django uygulamanız ile Nginx arasında bir arayüz görevi görür.

1. Gunicorn’u Test Etme

Sanal ortamınız hala etkin durumdayken, Gunicorn’u test etmek için aşağıdaki komutu çalıştırın:

gunicorn --bind 0.0.0.0:8000 your_project_name.wsgi:application

your_project_name yerine projenizin ana uygulama dizininin adını yazın (genellikle manage.py ile aynı dizinde olan klasör adı). Eğer her şey yolundaysa, tarayıcınızdan http://your_vps_ip_address:8000 adresine giderek Django uygulamanızın çalıştığını görmelisiniz. Testi bitirmek için Ctrl+C tuşlarına basın.

2. Gunicorn İçin Systemd Hizmeti Oluşturma

Uygulamanızın sunucu yeniden başlatıldığında otomatik olarak başlaması ve arka planda sürekli çalışması için bir Systemd hizmeti oluşturacağız.

Sanal ortamdan çıkın:

deactivate

Bir Systemd hizmet dosyası oluşturun:

sudo nano /etc/systemd/system/gunicorn.service

Aşağıdaki içeriği dosyaya yapıştırın. your_username, your_project_name ve /var/www/your_project_name kısımlarını kendi bilgilerinizle değiştirin:

[Unit]
Description=Gunicorn instance to serve your_project_name
After=network.target

[Service]
User=your_username
Group=www-data
WorkingDirectory=/var/www/your_project_name
ExecStart=/var/www/your_project_name/venv/bin/gunicorn --workers 3 --bind unix:/var/www/your_project_name/your_project_name.sock your_project_name.wsgi:application
Restart=always

[Install]
WantedBy=multi-user.target

* User: Django uygulamanızı çalıştıracak kullanıcı.
* Group: Nginx’in erişim sağlayacağı grup.
* WorkingDirectory: Projenizin kök dizini.
* ExecStart: Gunicorn’u çalıştıran komut. --workers 3 ile 3 adet Gunicorn worker’ı çalıştırıyoruz (CPU çekirdeği sayısının 2 katı + 1 genellikle iyi bir başlangıçtır). --bind unix:/path/to/socket ile Gunicorn’un bir Unix soketi üzerinden Nginx ile iletişim kurmasını sağlıyoruz.
* Restart=always: Gunicorn herhangi bir nedenle çökerse otomatik olarak yeniden başlatılır.

Dosyayı kaydedip çıkın (Ctrl+X, Y, Enter).

Şimdi Systemd’yi yeni hizmet dosyasını okuması için yeniden yükleyin, Gunicorn hizmetini başlatın ve sunucu açılışında otomatik başlaması için etkinleştirin:

sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn

Gunicorn hizmetinin durumunu kontrol edin:

sudo systemctl status gunicorn

Yeşil renkte “active (running)” görmelisiniz. Herhangi bir hata varsa, journalctl -u gunicorn komutu ile logları kontrol edebilirsiniz.

Nginx Yapılandırması

Nginx, gelen web isteklerini karşılayacak, statik dosyaları sunacak ve dinamik istekleri Gunicorn’a yönlendirecektir.

1. Nginx Yapılandırma Dosyası Oluşturma

Django projeniz için yeni bir Nginx sunucu bloğu dosyası oluşturalım:

sudo nano /etc/nginx/sites-available/your_project_name

Aşağıdaki içeriği dosyaya yapıştırın. your_domain.com, www.your_domain.com, /var/www/your_project_name ve your_project_name kısımlarını kendi bilgilerinizle değiştirin:

server {
    listen 80;
    server_name your_domain.com www.your_domain.com; # Alan adınızı veya IP adresinizi buraya yazın

    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {
        root /var/www/your_project_name; # STATIC_ROOT'un üst dizini
    }

    location /media/ {
        root /var/www/your_project_name; # MEDIA_ROOT'un üst dizini
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/your_project_name/your_project_name.sock; # Gunicorn soket yolunuz
    }
}

* listen 80: Nginx’in HTTP isteklerini 80 numaralı porttan dinlemesini sağlar.
* server_name: Uygulamanıza erişilecek alan adları.
* location /static/: Nginx’in STATIC_ROOT içindeki statik dosyaları doğrudan sunmasını sağlar.
* location /media/: Nginx’in MEDIA_ROOT içindeki kullanıcı tarafından yüklenen dosyaları doğrudan sunmasını sağlar.
* location /: Diğer tüm istekleri Gunicorn’a yönlendirir.

Dosyayı kaydedip çıkın.

2. Nginx Yapılandırmasını Etkinleştirme

Oluşturduğumuz yapılandırma dosyasını sites-enabled dizinine sembolik bir bağ (symlink) oluşturarak etkinleştirin:

sudo ln -s /etc/nginx/sites-available/your_project_name /etc/nginx/sites-enabled/

Varsayılan Nginx yapılandırmasını devre dışı bırakmak iyi bir fikirdir:

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

Nginx yapılandırmasında hata olup olmadığını kontrol edin:

sudo nginx -t

Eğer test is successful mesajını görürseniz, Nginx’i yeniden başlatın:

sudo systemctl restart nginx

Şimdi tarayıcınızdan alan adınıza (veya VPS IP adresinize) giderek Django uygulamanızın çalıştığını görmelisiniz!

Uygulamanızı Güvenli Hale Getirme (HTTPS ile)

Uygulamanızın güvenliğini artırmak ve SEO avantajlarından yararlanmak için HTTPS kullanmak şarttır. Let’s Encrypt ve Certbot ile ücretsiz SSL sertifikaları alabiliriz.

1. Certbot Kurulumu

sudo apt install certbot python3-certbot-nginx -y

2. SSL Sertifikası Alma

Nginx yapılandırmanız doğruysa, Certbot otomatik olarak sertifika alıp Nginx’i yapılandırabilir:

sudo certbot --nginx -d your_domain.com -d www.your_domain.com

Certbot size bazı sorular soracaktır (e-posta adresi, hizmet koşullarını kabul etme vb.). Genellikle tüm HTTP isteklerini HTTPS’e yönlendirmeyi seçmelisiniz.

Certbot, sertifikayı başarıyla aldıktan sonra Nginx yapılandırmanızı güncelleyecek ve Nginx’i yeniden başlatacaktır. Artık uygulamanıza https://your_domain.com üzerinden erişebilirsiniz.

3. Sertifika Yenilemeyi Otomatikleştirme

Let’s Encrypt sertifikaları 90 gün geçerlidir. Certbot, otomatik yenileme için bir cron işi veya Systemd zamanlayıcı kurar. Yenileme işleminin düzgün çalıştığını test edebilirsiniz:

sudo certbot renew --dry-run

Eğer bu komut hatasız çalışırsa, sertifikalarınız otomatik olarak yenilenecektir.

İzleme ve Bakım

Uygulamanız canlıya alındıktan sonra, düzenli olarak izlemek ve bakımını yapmak önemlidir.

* Logları Kontrol Etme:
* Gunicorn logları: sudo journalctl -u gunicorn
* Nginx logları: /var/log/nginx/access.log ve /var/log/nginx/error.log
* Django logları: settings.py içinde yapılandırdığınız yere göre değişir.
* Sistemi Güncel Tutma: Düzenli olarak sudo apt update && sudo apt upgrade -y komutlarını çalıştırarak sunucunuzu güncel tutun.
* Yedeklemeler: Veritabanınızın ve uygulama dosyalarınızın düzenli yedeklerini almayı unutmayın. PostgreSQL için pg_dumpall veya pg_dump komutlarını kullanabilirsiniz.
* Güvenlik: Django’nun güvenlik yamalarını takip edin ve uygulamanızı güncel tutun.

Sonuç

Yerel bir Django uygulamasını bir VPS’e dağıtmak, birden fazla bileşenin bir araya getirilmesini gerektiren kapsamlı bir süreçtir. Bu makalede, Django uygulamanızı üretim ortamına hazırlamaktan, bir VPS’i yapılandırmaya, Gunicorn ve Nginx’i kurmaya ve son olarak uygulamanızı HTTPS ile güvenli hale getirmeye kadar her adımı detaylı bir şekilde ele aldık.

Bu adımları dikkatlice takip ederek, Django uygulamanızı başarıyla canlıya alabilir ve dünya genelindeki kullanıcılara sunabilirsiniz. Dağıtım, bir kerelik bir işlem değildir; uygulamanızın ve sunucunuzun düzenli olarak izlenmesi, güncellenmesi ve bakımı yapılması, uzun vadeli başarı için kritik öneme sahiptir. Unutmayın, her projenin kendine özgü gereksinimleri olabilir, bu nedenle bu rehberi kendi özel ihtiyaçlarınıza göre uyarlamaktan çekinmeyin. Başarılar dileriz!

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorumları Göster (2)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.