# Python Flask ya da Django uygulamasını Gunicorn ve systemd ile yayınlama

https://kervanhosting.com/bilgi-bankasi/makale/python-flask-django-uygulamasini-gunicorn-ve-systemd-ile-yayinlama

Geliştirme sırasında `flask run` ya da `python manage.py runserver` ile çalışan uygulamanızı gerçek bir sunucuda yayınlamak için üç parça gerekir: uygulamayı üretim kalitesinde çalıştıran bir **WSGI sunucusu** (Gunicorn), sunucu yeniden başladığında ve çöktüğünde onu ayağa kaldıran bir **servis yöneticisi** (systemd) ve internete açan bir **ters proxy** (Nginx). Bu rehber üçünü bağlar. Örnekte uygulamanın `/srv/uygulama` klasöründe, `uygulama.py` dosyasında `app` adında bir Flask nesnesi olduğu varsayılmıştır.

## 1. Sanal ortam ve Gunicorn

```
sudo apt install -y python3-venv
cd /srv/uygulama
python3 -m venv venv
venv/bin/pip install flask gunicorn
```

Sanal ortamın nedenini [venv makalesinde](https://kervanhosting.com/bilgi-bankasi/makale/pip-externally-managed-environment-hatasi-python-sanal-ortam-venv) anlattık. Gunicorn'u elle deneyin:

```
venv/bin/gunicorn --bind 127.0.0.1:8000 uygulama:app
```

`uygulama:app`, "uygulama.py dosyasındaki app nesnesi" demektir. Django için `proje.wsgi:application` yazılır (`proje`, `manage.py` ile aynı yerdeki klasör adıdır). Başka bir terminalde `curl -I http://127.0.0.1:8000` ile cevap geldiğini doğrulayın, sonra Gunicorn'u `Ctrl+C` ile durdurun.

## 2. systemd servisi

`/etc/systemd/system/uygulama.service` dosyasını oluşturun:

```
[Unit]
Description=Uygulama (Gunicorn)
After=network.target

[Service]
User=www-data
Group=www-data
WorkingDirectory=/srv/uygulama
Environment="PATH=/srv/uygulama/venv/bin"
ExecStart=/srv/uygulama/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 uygulama:app
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
```

Servisi çalıştıran kullanıcının (`www-data`) `/srv/uygulama` klasörünü okuyabildiğinden emin olun (`sudo chown -R www-data:www-data /srv/uygulama`). Etkinleştirin:

```
sudo systemctl daemon-reload
sudo systemctl enable --now uygulama
sudo systemctl status uygulama
```

`enable` açılışta başlatır, `--now` hemen başlatır. Çalışıyorsa durum "active (running)" gösterir. Dosyanın söz dizimini önceden denetlemek için: `systemd-analyze verify /etc/systemd/system/uygulama.service`.

## 3. Nginx'e bağlayın

Uygulama yalnızca yerelde (`127.0.0.1:8000`) dinler; dışarıya Nginx açar. Ayarı [Nginx ters proxy](https://kervanhosting.com/bilgi-bankasi/makale/nginx-reverse-proxy-node-js-uygulamasini-nginx-arkasinda-yayinlama) makalesindeki gibi yapın (`proxy_pass http://127.0.0.1:8000;`). https için Certbot: [ücretsiz SSL](https://kervanhosting.com/bilgi-bankasi/makale/siteme-ucretsiz-ssl-https-nasil-eklerim).

## Sık sorunlar

- **Servis başlamıyor:** `sudo journalctl -u uygulama -n 40 --no-pager` asıl hatayı yazar. En sık sebepler: yanlış yol, venv içinde eksik paket, dosya izinleri: [systemd servisi başlamıyor](https://kervanhosting.com/bilgi-bankasi/makale/systemd-servisi-baslamiyor-systemctl-status-ve-journalctl-ile-hata-bulma).
- **502 Bad Gateway:** Servis çalışmıyor ya da farklı bir porttadır: [502 hatası](https://kervanhosting.com/bilgi-bankasi/makale/nginx-502-bad-gateway-hatasi-nedenleri-ve-cozumu).
- **Kodu güncelleyince değişmiyor:** Servisi yeniden başlatın: `sudo systemctl restart uygulama`.
- **Django statik dosyalar gelmiyor:** Gunicorn statik dosya sunmaz; `collectstatic` sonrası Nginx'e `location /static/ { alias /srv/uygulama/static/; }` ekleyin.
- **Gizli anahtarlar:** Parolaları kodun içine yazmayın; `Environment=` satırıyla ya da `EnvironmentFile=/etc/uygulama.env` (izni 600) dosyasıyla verin.

Daha basit, panel destekli çalışma için [Bot ve Uygulama Hosting](https://kervanhosting.com/bot-hosting) da bir seçenektir.

## Sık sorulanlar

### Kaç worker kullanmalıyım?

Genel kural: işlemci çekirdeği sayısının iki katı artı bir. 2 vCPU'lu bir sunucuda 3 ya da 5. Bellek yetmiyorsa azaltın; her worker uygulamanın bir kopyasını bellekte tutar.

### Gunicorn yerine Uvicorn mu kullanmalıyım?

FastAPI gibi ASGI uygulamaları için Uvicorn (gerekirse Gunicorn'un Uvicorn worker'ıyla); Flask ve Django (WSGI) için Gunicorn yeterlidir.

### Uygulamayı root olarak çalıştırmalı mıyım?

Hayır; servis için yetkisiz bir kullanıcı (www-data ya da özel bir kullanıcı) kullanın. Bir açık olursa saldırganın yetkisi sınırlı kalır.

**İlgili makaleler**

- [Node.js veya Python uygulamamı sunucuda nasıl yayınlarım?](https://kervanhosting.com/bilgi-bankasi/makale/node-js-veya-python-uygulamami-sunucuda-nasil-yayinlarim)
- [Nginx ters proxy: Node.js ya da Python uygulamasını Nginx arkasında yayınlama](https://kervanhosting.com/bilgi-bankasi/makale/nginx-reverse-proxy-node-js-uygulamasini-nginx-arkasinda-yayinlama)
- [Bir programı arka planda sürekli çalıştırma (screen, systemd)](https://kervanhosting.com/bilgi-bankasi/makale/bir-programi-arka-planda-surekli-calistirma-screen)

*Sorununuz çözülmediyse [destek talebi açın](https://kervanhosting.com/destek-taleplerim). Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.*
