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!

Hocam merhaba. Tavsiye ettiğiniz uygun fiyatlı VPS hizmeti alabileceğimiz bir yer var mı?
Merhaba, digital ocean tavsiye ederim