7/24 Türkçe destek:[email protected]Sistem durumuDestek talebi

VPS’te Python (Django, Flask) Uygulaması Kurma

Okuma süresi: 6 dk

Kısa yanıt: Paylaşımlı hosting paketlerimizde Python uygulama yöneticisi (Setup Python App) yoktur; Django ve Flask uygulamaları root erişimli bir VPS’te yayınlanır. Ubuntu 24.04 VPS’te python3 -m venv ile sanal ortam oluşturun, bağımlılıkları ve Gunicorn’u pip ile kurun, Gunicorn’u systemd servisi olarak çalıştırın ve Nginx’i ters vekil olarak önüne koyun.

Bu rehber kimin için: Python geliştiricileri · Gereken süre: 20 dakika · Seviye: İleri

Paylaşımlı hosting paketlerimizde Python uygulama yöneticisi, SSH ve cPanel Terminal bulunmaz; Django, Flask ya da FastAPI ile yazılmış uygulamalar bu yüzden paylaşımlı hostingte çalıştırılamaz. VPS’te uygulamanız Gunicorn gibi bir WSGI sunucusuyla sürekli çalışan bir süreç olur; Nginx gelen istekleri bu sürece iletir, CSS ve görselleri ise kendisi sunar. ASGI gerektiren asenkron uygulamalar ve Celery gibi arka plan işçileri de aynı VPS’te ayrı servisler olarak çalışabilir. Komutlar Ubuntu 24.04 LTS içindir.

VPS’i Python uygulaması için hazırlama

  1. VPS’e sudo yetkili kullanıcınızla SSH ile bağlanın; yeni bir sunucuysa önce Ubuntu VPS ilk kurulum adımlarını tamamlayın.
  2. Gerekli paketleri kurun: sudo apt update && sudo apt install -y python3-venv python3-pip nginx
  3. Python sürümünü kontrol edin: python3 --version (Ubuntu 24.04’te 3.12 serisi).
  4. Uygulamayı çalıştıracak, oturum açamayan bir sistem kullanıcısı oluşturun: sudo adduser --system --group uygulamam
  5. Uygulama klasörünü açın ve kurulum sırasında yazabilmek için geçici olarak kendinize verin: sudo mkdir -p /srv/uygulamam ve sudo chown $USER /srv/uygulamam

Uygulamayı root olarak çalıştırmayın; Gunicorn root yetkisiyle çalışırsa uygulama kodunuz da bu yetkiyle çalışır.

Uygulamayı yayınlama

  1. Uygulamayı oluşturun: Kodunuzu git clone, scp ya da SFTP ile /srv/uygulamam klasörüne aktarın, klasörde python3 -m venv .venv ile sanal ortam oluşturun ve source .venv/bin/activate ile etkinleştirin.
  2. Bağımlılık dosyasını ekleyin: Bağımlılıkları requirements.txt dosyasında tutun; dosyayı kendi bilgisayarınızda, projenin sanal ortamı etkinken pip freeze > requirements.txt komutuyla oluşturup kodla birlikte aktarabilirsiniz.
  3. Bağımlılıkları kurun: Sanal ortam etkinken pip install -r requirements.txt gunicorn komutuyla paketleri ve Gunicorn’u kurun. Ubuntu 24.04, sistem Python’una pip ile paket kurulmasını “externally-managed-environment” hatasıyla engeller; paketleri her zaman sanal ortama kurun.
  4. WSGI dosyasını düzenleyin: Django projelerinde proje/wsgi.py dosyası hazırdır; Flask’ta uygulama nesnesinin hangi modülde olduğunu belirleyin. Gunicorn’a bu nesneyi modül:değişken biçiminde verirsiniz: Django için proje.wsgi:application, Flask için app:app. Önce gunicorn --bind 127.0.0.1:8000 proje.wsgi:application ile elle deneyin ve Ctrl+C ile durdurun.
  5. Ayarları yapın: Django’da ALLOWED_HOSTS’a alan adınızı ekleyin, DEBUG’ı kapatın; gizli anahtarları ortam değişkeni olarak tanımlayın.
  6. Yeniden başlatın: Kodu ya da ayarları değiştirdikten sonra sudo systemctl restart uygulamam ile Gunicorn servisini yeniden başlatın; servis dosyası aşağıdaki bölümde.

Gunicorn’u servis olarak çalıştırma ve Nginx’e bağlama

  1. Gizli anahtarları ve veritabanı bilgilerini /srv/uygulamam/.env dosyasına ANAHTAR=deger biçiminde, satır satır yazın.
  2. Klasörü uygulama kullanıcısına devredin ve .env dosyasını kapatın: sudo chown -R uygulamam:www-data /srv/uygulamam ve sudo chmod 600 /srv/uygulamam/.env
  3. sudo nano /etc/systemd/system/uygulamam.service ile servis dosyasını oluşturun; içeriği aşağıdaki tabloda.
  4. Servisi başlatın: sudo systemctl daemon-reload ve sudo systemctl enable --now uygulamam; durumunu sudo systemctl status uygulamam ile görün.
  5. /etc/nginx/sites-available/uygulamam dosyasında server_name alanadiniz.com www.alanadiniz.com; satırının altına location /static/ { alias /srv/uygulamam/staticfiles/; } ve location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } bloklarını yazın.
  6. sudo ln -s /etc/nginx/sites-available/uygulamam /etc/nginx/sites-enabled/ ile etkinleştirip sudo nginx -t && sudo systemctl reload nginx ile yükleyin.
  7. Alan adının A kaydını VPS’e yönlendirin, sudo ufw allow "Nginx Full" ile web portlarını açın ve Certbot ile SSL kurun. Django’nun https bağlantıyı doğru algılaması için settings.py’ye SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") satırını ekleyin.
BölümSatır
[Unit]Description=uygulamam Gunicorn
[Unit]After=network.target
[Service]User=uygulamam
[Service]Group=www-data
[Service]WorkingDirectory=/srv/uygulamam
[Service]EnvironmentFile=/srv/uygulamam/.env
[Service]ExecStart=/srv/uygulamam/.venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 proje.wsgi:application
[Service]Restart=always
[Install]WantedBy=multi-user.target

Gunicorn belgeleri işçi (worker) sayısı için başlangıç değeri olarak işlemci çekirdeği sayısının iki katının bir fazlasını önerir. FastAPI gibi ASGI uygulamalarında ExecStart satırına sanal ortama kurduğunuz Uvicorn’u yazın (ör. /srv/uygulamam/.venv/bin/uvicorn main:app --host 127.0.0.1 --port 8000 --workers 2); Celery işçisi için aynı yapıda ikinci bir servis dosyası oluşturun. VPS yönetimsiz teslim edilir; Python, Nginx ve veritabanı gibi sunucu tarafı kurulumları ve güncellemeleri ekibimize bırakmak isterseniz sunucu yönetimi hizmetini ekleyebilirsiniz.

Statik dosyalar

VPS’te CSS, JavaScript ve görselleri Gunicorn değil Nginx sunar. Django’da settings.py içinde STATIC_ROOT ile STATIC_URL değerlerini belirleyin (ör. STATIC_ROOT için /srv/uygulamam/staticfiles, STATIC_URL için /static/), sanal ortam etkinken python manage.py collectstatic komutunu çalıştırın ve Nginx sunucu bloğundaki location /static/ yönergesinin bu klasörü gösterdiğinden emin olun. Böylece statik dosyalar Python süreci yerine doğrudan web sunucusundan sunulur.

Hâlâ çözülmediyse

Nginx “502 Bad Gateway” hatası, Gunicorn’un çalışmadığını ya da proxy_pass adresinin Gunicorn’un dinlediği adresle aynı olmadığını gösterir. sudo systemctl status uygulamam ve sudo journalctl -u uygulamam -n 50 ile servis kayıtlarına, /var/log/nginx/error.log dosyasına bakın. Veritabanı olarak SQLite yerine aynı VPS’e kuracağınız PostgreSQL ya da MySQL/MariaDB’yi kullanmanızı öneririz. Bu yapı için VPS sunucu gerekir; paylaşımlı hosting paketlerimizde Python uygulaması çalıştırılamaz.

Sık sorulan sorular

Terminal menüsü görünmüyor.

Paylaşımlı hosting paketlerimizde cPanel Terminal, SSH ve Python uygulama yöneticisi yoktur. VPS’te terminale SSH ile bağlanırsınız: Windows’ta PowerShell ya da Windows Terminal’de, macOS ve Linux’ta Terminal uygulamasında ssh [email protected] komutunu kullanın (IP adresi yerine kendi VPS adresinizi yazın).

Python sürümünü sonradan değiştirebilir miyim?

Evet. Ubuntu 24.04’te sistem Python’u 3.12’dir ve işletim sistemi araçları ona bağlı olduğu için değiştirilmemelidir. Farklı bir sürüm gerekiyorsa o sürümü sistem Python’una dokunmadan ayrıca kurun, onunla yeni bir sanal ortam oluşturup bağımlılıkları yeniden kurun ve systemd servisindeki ExecStart yolunu güncelleyin.

Paylaşımlı hostingte Django ya da Flask çalıştırabilir miyim?

Hayır. Paylaşımlı hosting paketlerimizde Python uygulama yöneticisi (Setup Python App) ve komut satırı yoktur; Python ile yazılmış web uygulamaları VPS sunucu üzerinde çalıştırılır. Python, Nginx ve veritabanı kurulumunu ekibimize bırakmak isterseniz sunucu yönetimi hizmetini ekleyebilirsiniz.

pip install komutu “externally-managed-environment” hatası veriyor.

Ubuntu 24.04, işletim sisteminin kullandığı Python paketlerini korumak için sistem genelinde pip ile kurulum yapılmasını engeller. Proje klasöründe python3 -m venv .venv ile sanal ortam oluşturun, source .venv/bin/activate ile etkinleştirin ve pip install komutunu orada çalıştırın. --break-system-packages seçeneğini kullanmayın; sistem araçlarının bağlı olduğu paketleri bozabilir.

İlgili rehberler