{"id":4992,"date":"2026-02-11T20:37:14","date_gmt":"2026-02-11T17:37:14","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/django-ve-flask-uygulamalari-icin-vps-hosting-rehberi-gunicorn-uvicorn-nginx-ve-ssl\/"},"modified":"2026-02-11T20:37:14","modified_gmt":"2026-02-11T17:37:14","slug":"django-ve-flask-uygulamalari-icin-vps-hosting-rehberi-gunicorn-uvicorn-nginx-ve-ssl","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/django-ve-flask-uygulamalari-icin-vps-hosting-rehberi-gunicorn-uvicorn-nginx-ve-ssl\/","title":{"rendered":"Django ve Flask Uygulamalar\u0131 \u0130\u00e7in VPS Hosting Rehberi: Gunicorn\/Uvicorn, Nginx ve SSL"},"content":{"rendered":"<div class=\"dchost-blog-content-wrapper\"><p>Django veya Flask ile geli\u015ftirdi\u011finiz bir projeyi ger\u00e7ek kullan\u0131c\u0131lar\u0131n g\u00f6rece\u011fi \u00fcretim ortam\u0131na ta\u015f\u0131rken, en \u00e7ok tak\u0131lan noktalardan biri genelde \u015furas\u0131 oluyor: &#8220;Bu uygulamay\u0131 VPS\u2019e nas\u0131l d\u00fczg\u00fcnce kurar\u0131m, Nginx, Gunicorn\/Uvicorn ve SSL ayarlar\u0131n\u0131 nereden tutmaya ba\u015flar\u0131m?&#8221; \u00d6zellikle geli\u015ftirme ortam\u0131nda <code>python manage.py runserver<\/code> ya da <code>flask run<\/code> ile her \u015fey yolunda giderken, \u00fcretim taraf\u0131nda performans, g\u00fcvenlik ve \u00f6l\u00e7eklenebilirlik bir anda masaya geliyor. DCHost ekibi olarak hem kendi altyap\u0131m\u0131zda hem de m\u00fc\u015fterilerimizin y\u00fczlerce Python tabanl\u0131 projesinde bu sorular\u0131 tekrar tekrar \u00e7\u00f6z\u00fcyoruz. Bu yaz\u0131da, Django ve Flask uygulamalar\u0131n\u0131z\u0131 VPS \u00fczerinde modern ve \u00fcretim\u2011haz\u0131r bir mimariyle (Gunicorn\/Uvicorn + Nginx + SSL) nas\u0131l aya\u011fa kald\u0131rabilece\u011finizi, ad\u0131m ad\u0131m ve ger\u00e7ek\u00e7i ayarlarla anlataca\u011f\u0131z. Hedefimiz; elinizdeki kodu, bak\u0131m\u0131 kolay, loglar\u0131 okunabilir, g\u00fcvenli ve gerekti\u011finde rahat\u00e7a \u00f6l\u00e7eklenebilir bir \u00fcretim ortam\u0131na d\u00f6n\u00fc\u015ft\u00fcrmeniz.<\/p>\n<div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">\u0130&ccedil;indekiler<\/p><ul class=\"toc_list\"><li><a href=\"#Django_ve_Flask_Icin_Neden_VPS_Tercih_Etmelisiniz\"><span class=\"toc_number toc_depth_1\">1<\/span> Django ve Flask \u0130\u00e7in Neden VPS Tercih Etmelisiniz?<\/a><\/li><li><a href=\"#Mimarinin_Buyuk_Resmi_DjangoFlask_GunicornUvicorn_Nginx\"><span class=\"toc_number toc_depth_1\">2<\/span> Mimarinin B\u00fcy\u00fck Resmi: Django\/Flask + Gunicorn\/Uvicorn + Nginx<\/a><\/li><li><a href=\"#Dogru_VPS_Kaynaklarini_ve_Linux_Dagitimini_Secmek\"><span class=\"toc_number toc_depth_1\">3<\/span> Do\u011fru VPS Kaynaklar\u0131n\u0131 ve Linux Da\u011f\u0131t\u0131m\u0131n\u0131 Se\u00e7mek<\/a><\/li><li><a href=\"#DjangoFlask_Uygulamasini_VPSte_Calistirmak_Gunicorn_ve_Uvicorn\"><span class=\"toc_number toc_depth_1\">4<\/span> Django\/Flask Uygulamas\u0131n\u0131 VPS\u2019te \u00c7al\u0131\u015ft\u0131rmak: Gunicorn ve Uvicorn<\/a><ul><li><a href=\"#Ornek_Django_Gunicorn_Kurulumu\"><span class=\"toc_number toc_depth_2\">4.1<\/span> \u00d6rnek Django + Gunicorn Kurulumu<\/a><\/li><li><a href=\"#Flask_Icin_Gunicorn_Kullanimi\"><span class=\"toc_number toc_depth_2\">4.2<\/span> Flask \u0130\u00e7in Gunicorn Kullan\u0131m\u0131<\/a><\/li><li><a href=\"#Django_ASGI_veya_Async_Uygulamalar_Icin_UvicornGunicorn_Kombinasyonu\"><span class=\"toc_number toc_depth_2\">4.3<\/span> Django ASGI veya Async Uygulamalar \u0130\u00e7in Uvicorn\/Gunicorn Kombinasyonu<\/a><\/li><\/ul><\/li><li><a href=\"#Nginx_Reverse_Proxy_ve_StatikMedia_Dosyalari\"><span class=\"toc_number toc_depth_1\">5<\/span> Nginx Reverse Proxy ve Statik\/Media Dosyalar\u0131<\/a><\/li><li><a href=\"#SSL_HTTPS_ve_Guvenlik_Basliklari\"><span class=\"toc_number toc_depth_1\">6<\/span> SSL, HTTPS ve G\u00fcvenlik Ba\u015fl\u0131klar\u0131<\/a><ul><li><a href=\"#Lets_Encrypt_ile_Temel_SSL_Kurulumu\"><span class=\"toc_number toc_depth_2\">6.1<\/span> Let\u2019s Encrypt ile Temel SSL Kurulumu<\/a><\/li><li><a href=\"#HTTPden_HTTPSye_Yonlendirme_ve_Guvenlik_Basliklari\"><span class=\"toc_number toc_depth_2\">6.2<\/span> HTTP\u2019den HTTPS\u2019ye Y\u00f6nlendirme ve G\u00fcvenlik Ba\u015fl\u0131klar\u0131<\/a><\/li><\/ul><\/li><li><a href=\"#Guvenlik_Loglama_ve_Otomatik_Deploy_Uretim_Ipuclari\"><span class=\"toc_number toc_depth_1\">7<\/span> G\u00fcvenlik, Loglama ve Otomatik Deploy: \u00dcretim \u0130pu\u00e7lar\u0131<\/a><ul><li><a href=\"#VPS_Guvenlik_Sertlestirme\"><span class=\"toc_number toc_depth_2\">7.1<\/span> VPS G\u00fcvenlik Sertle\u015ftirme<\/a><\/li><li><a href=\"#Loglama_logrotate_ve_Izlenebilirlik\"><span class=\"toc_number toc_depth_2\">7.2<\/span> Loglama, logrotate ve \u0130zlenebilirlik<\/a><\/li><li><a href=\"#CICD_ile_Otomatik_Deploy\"><span class=\"toc_number toc_depth_2\">7.3<\/span> CI\/CD ile Otomatik Deploy<\/a><\/li><\/ul><\/li><li><a href=\"#Sonuc_ve_DCHost_Uzerinde_Yol_Haritaniz\"><span class=\"toc_number toc_depth_1\">8<\/span> Sonu\u00e7 ve DCHost \u00dczerinde Yol Haritan\u0131z<\/a><\/li><\/ul><\/div>\n<h2><span id=\"Django_ve_Flask_Icin_Neden_VPS_Tercih_Etmelisiniz\">Django ve Flask \u0130\u00e7in Neden VPS Tercih Etmelisiniz?<\/span><\/h2>\n<p>Payla\u015f\u0131ml\u0131 hosting, basit PHP tabanl\u0131 siteler i\u00e7in h\u00e2l\u00e2 mant\u0131kl\u0131 bir se\u00e7enek olabilir; ancak Django ve Flask gibi framework\u2019ler s\u00f6z konusu oldu\u011funda \u00e7o\u011fu zaman h\u0131zla duvara toslars\u0131n\u0131z. Uzun s\u00fcren arka plan i\u015fler, WebSocket ba\u011flant\u0131lar\u0131, \u00f6zel k\u00fct\u00fcphaneler, sistem paketleri veya Python versiyonu gibi konularda kontrol ihtiyac\u0131 ortaya \u00e7\u0131kar. VPS (Sanal \u00d6zel Sunucu) tam burada devreye girer; root yetkisi, istedi\u011finiz Linux da\u011f\u0131t\u0131m\u0131, \u00f6zg\u00fcrce paket kurabilme ve servisleri diledi\u011finiz gibi y\u00f6netebilme imk\u00e2n\u0131 verir.<\/p>\n<p>VPS ile:<\/p>\n<ul>\n<li>\u0130stedi\u011finiz Python s\u00fcr\u00fcm\u00fcn\u00fc ve sanal ortam (virtualenv\/venv) yap\u0131s\u0131n\u0131 kullanabilirsiniz.<\/li>\n<li>Gunicorn veya Uvicorn i\u015f\u00e7i (worker) say\u0131s\u0131n\u0131 projeye g\u00f6re ayarlayarak CPU kullan\u0131m\u0131n\u0131 optimize edersiniz.<\/li>\n<li>Nginx \u00fczerinde cache, rate limiting, IP k\u0131s\u0131tlama gibi geli\u015fmi\u015f ayarlar yapabilirsiniz.<\/li>\n<li>Firewall, fail2ban gibi g\u00fcvenlik katmanlar\u0131n\u0131 kendiniz tasarlars\u0131n\u0131z.<\/li>\n<\/ul>\n<p>VPS\u2019in temel avantajlar\u0131n\u0131 ve <a href=\"https:\/\/www.dchost.com\/tr\/web-hosting\">payla\u015f\u0131ml\u0131 hosting<\/a>\u2019den ge\u00e7i\u015f s\u00fcre\u00e7lerini merak ediyorsan\u0131z, detayl\u0131 olarak anlatt\u0131\u011f\u0131m\u0131z <a href=\"https:\/\/www.dchost.com\/blog\/paylasimli-hostingden-vpse-nasil-gecersin-kesintisiz-tasima-icin-sicacik-bir-kontrol-listesi\/\">payla\u015f\u0131ml\u0131 hosting\u2019den VPS\u2019e ge\u00e7i\u015f rehberi<\/a> yaz\u0131m\u0131za da g\u00f6z atabilirsiniz.<\/p>\n<h2><span id=\"Mimarinin_Buyuk_Resmi_DjangoFlask_GunicornUvicorn_Nginx\">Mimarinin B\u00fcy\u00fck Resmi: Django\/Flask + Gunicorn\/Uvicorn + Nginx<\/span><\/h2>\n<p>Sa\u011flam bir kurulumun ilk ad\u0131m\u0131, bile\u015fenlerin g\u00f6revlerini netle\u015ftirmektir. Django veya Flask uygulaman\u0131z do\u011frudan d\u0131\u015f d\u00fcnyaya a\u00e7\u0131lmaz; araya bir uygulama sunucusu (Gunicorn veya Uvicorn) ve bir reverse proxy (Nginx) koyar\u0131z.<\/p>\n<ul>\n<li><strong>Django\/Flask:<\/strong> \u0130\u015f kurallar\u0131n\u0131z, view\/route\u2019lar, ORM, template\u2019ler.<\/li>\n<li><strong>Gunicorn:<\/strong> WSGI uygulama sunucusu; gelen HTTP isteklerini Django\/Flask\u2019a iletir. Klasik senaryo: Django ve Flask projeleri.<\/li>\n<li><strong>Uvicorn:<\/strong> ASGI sunucusu; async\/await tabanl\u0131, WebSocket ve y\u00fcksek e\u015fzamanl\u0131l\u0131k i\u00e7in ideal. Django (ASGI), Starlette, FastAPI gibi framework\u2019lerle \u00f6ne \u00e7\u0131kar.<\/li>\n<li><strong>Nginx:<\/strong> Reverse proxy ve statik dosya sunucusu. HTTP\/HTTPS terminasyonu, SSL, gzip\/Brotli s\u0131k\u0131\u015ft\u0131rma, HTTP\/2\/3 ve g\u00fcvenlik ba\u015fl\u0131klar\u0131n\u0131n evidir.<\/li>\n<\/ul>\n<p>Tipik bir production mimarisi \u015f\u00f6yle g\u00f6r\u00fcn\u00fcr:<\/p>\n<ol>\n<li>Kullan\u0131c\u0131 <code>https:\/\/\u00f6rnek.com<\/code> adresine istek g\u00f6nderir.<\/li>\n<li>\u0130stek 443 portundan Nginx\u2019e gelir, SSL burada sonlan\u0131r.<\/li>\n<li>Nginx, HTTP ya da Unix socket \u00fczerinden Gunicorn\/Uvicorn\u2019a proxy yapar.<\/li>\n<li>Gunicorn\/Uvicorn worker\u2019lar\u0131 uygulama kodunuzu \u00e7al\u0131\u015ft\u0131r\u0131r, sonucu Nginx\u2019e d\u00f6ner.<\/li>\n<li>Nginx yan\u0131t\u0131 kullan\u0131c\u0131ya iletir; statik dosyalar\u0131 m\u00fcmk\u00fcn oldu\u011funca do\u011frudan kendisi servis eder.<\/li>\n<\/ol>\n<p>Nginx\u2019in reverse proxy ve basit load balancer olarak kullan\u0131m\u0131n\u0131 daha derinlemesine anlamak istiyorsan\u0131z, k\u00fc\u00e7\u00fck projeler i\u00e7in haz\u0131rlad\u0131\u011f\u0131m\u0131z <a href=\"https:\/\/www.dchost.com\/blog\/nginx-reverse-proxy-ve-basit-load-balancer-kurulumu-kucuk-projeler-icin-uygulamali-rehber\/\">Nginx reverse proxy kurulum rehberi<\/a> ile bu yaz\u0131y\u0131 birlikte okuman\u0131z\u0131 \u00f6neririz.<\/p>\n<h2><span id=\"Dogru_VPS_Kaynaklarini_ve_Linux_Dagitimini_Secmek\">Do\u011fru VPS Kaynaklar\u0131n\u0131 ve Linux Da\u011f\u0131t\u0131m\u0131n\u0131 Se\u00e7mek<\/span><\/h2>\n<p>Altyap\u0131 kararlar\u0131n\u0131 sonradan de\u011fi\u015ftirmek m\u00fcmk\u00fcnd\u00fcr ama zahmetlidir. DCHost taraf\u0131nda Django\/Flask projeleri i\u00e7in en s\u0131k kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z soru, &#8220;Ka\u00e7 vCPU, ne kadar RAM almal\u0131y\u0131m?&#8221; oluyor. \u00c7ok kabaca:<\/p>\n<ul>\n<li><strong>K\u00fc\u00e7\u00fck projeler \/ dahili paneller:<\/strong> 1\u20132 vCPU, 2\u20134 GB RAM.<\/li>\n<li><strong>Orta trafik (g\u00fcnde birka\u00e7 on bin istek):<\/strong> 2\u20134 vCPU, 4\u20138 GB RAM.<\/li>\n<li><strong>Y\u00fcksek trafik, API veya ger\u00e7ek zamanl\u0131 bildirimler:<\/strong> 4+ vCPU, 8+ GB RAM, tercihen NVMe disk.<\/li>\n<\/ul>\n<p>Disk taraf\u0131nda, rastgele okuma\/yazma performans\u0131 Django\/Flask projelerinde veritaban\u0131 ve loglar nedeniyle \u00f6nemlidir. Bu nedenle DCHost \u00fczerindeki NVMe VPS paketlerimizde, klasik SATA SSD\u2019ye g\u00f6re \u00e7ok daha d\u00fc\u015f\u00fck I\/O gecikmesi ile daha y\u00fcksek TPS (transaction per second) elde edersiniz.<\/p>\n<p>Linux da\u011f\u0131t\u0131m\u0131 se\u00e7imi de i\u015fin omurgas\u0131d\u0131r. Ubuntu, Debian ve AlmaLinux \u00fc\u00e7l\u00fcs\u00fc Python projelerinde s\u0131k kullan\u0131lan, paket ekosistemi zengin se\u00e7eneklerdir. Hangi da\u011f\u0131t\u0131m\u0131n sizin senaryonuza uygun oldu\u011funu merak ediyorsan\u0131z, art\u0131 ve eksileri detayl\u0131 kar\u015f\u0131la\u015ft\u0131rd\u0131\u011f\u0131m\u0131z <a href=\"https:\/\/www.dchost.com\/blog\/ubuntu-mu-debian-mi-almalinux-mu-vps-uzerinde-web-hosting-icin-dogru-secim\/\">Ubuntu mu Debian m\u0131 AlmaLinux mu? VPS \u00fczerinde do\u011fru se\u00e7im rehberi<\/a> yaz\u0131s\u0131n\u0131 okuman\u0131z\u0131 tavsiye ederiz.<\/p>\n<h2><span id=\"DjangoFlask_Uygulamasini_VPSte_Calistirmak_Gunicorn_ve_Uvicorn\">Django\/Flask Uygulamas\u0131n\u0131 VPS\u2019te \u00c7al\u0131\u015ft\u0131rmak: Gunicorn ve Uvicorn<\/span><\/h2>\n<h3><span id=\"Ornek_Django_Gunicorn_Kurulumu\">\u00d6rnek Django + Gunicorn Kurulumu<\/span><\/h3>\n<p>Senaryomuz \u015fu olsun: Debian\/Ubuntu tabanl\u0131 bir DCHost VPS\u2019iniz var, Django projeniz <code>\/srv\/myproject<\/code> dizininde duruyor ve sanal ortam kullanmak istiyorsunuz.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">sudo apt update &amp;&amp; sudo apt install -y python3-venv python3-pip\n\nsudo mkdir -p \/srv\/myproject\nsudo chown $USER:$USER \/srv\/myproject\ncd \/srv\/myproject\n\npython3 -m venv venv\nsource venv\/bin\/activate\n\npip install --upgrade pip\npip install django gunicorn\n\n# Projeniz yoksa \u00f6rnek proje\ndjango-admin startproject config .<\/code><\/pre>\n<p>Gunicorn\u2019u elle test edelim:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">source \/srv\/myproject\/venv\/bin\/activate\ngunicorn config.wsgi:application --bind 127.0.0.1:8000<\/code><\/pre>\n<p>Taray\u0131c\u0131dan <code>http:\/\/sunucu-ip-adresi:8000<\/code> ile test edebilir veya sunucu \u00fczerinde <code>curl<\/code> ile yan\u0131t al\u0131p almad\u0131\u011f\u0131n\u0131z\u0131 kontrol edebilirsiniz. Her \u015fey yolundaysa, bir sonraki ad\u0131m Gunicorn\u2019u <strong>systemd servisi<\/strong> haline getirmek.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">sudo nano \/etc\/systemd\/system\/gunicorn-myproject.service<\/code><\/pre>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">[Unit]\nDescription=Gunicorn for Django project myproject\nAfter=network.target\n\n[Service]\nUser=www-data\nGroup=www-data\nWorkingDirectory=\/srv\/myproject\nEnvironment=&quot;PATH=\/srv\/myproject\/venv\/bin&quot;\nExecStart=\/srv\/myproject\/venv\/bin\/gunicorn \n  --workers 3 \n  --bind unix:\/run\/gunicorn-myproject.sock \n  config.wsgi:application\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>Dikkat edilmesi gerekenler:<\/p>\n<ul>\n<li><code>User<\/code> ve <code>Group<\/code> i\u00e7in genelde <code>www-data<\/code> (Debian\/Ubuntu) veya benzeri web kullan\u0131c\u0131s\u0131 tercih edilir.<\/li>\n<li>TCP port yerine Unix socket kullan\u0131yoruz: <code>\/run\/gunicorn-myproject.sock<\/code>. Nginx bu sokete ba\u011flanacak.<\/li>\n<li><code>--workers 3<\/code> de\u011feri, CPU \u00e7ekirde\u011fi say\u0131s\u0131 ve uygulaman\u0131z\u0131n IO\/CPU a\u011f\u0131rl\u0131\u011f\u0131na g\u00f6re ayarlanmal\u0131.<\/li>\n<\/ul>\n<p>Servisi etkinle\u015ftirelim:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">sudo systemctl daemon-reload\nsudo systemctl enable gunicorn-myproject\nsudo systemctl start gunicorn-myproject\nsudo systemctl status gunicorn-myproject<\/code><\/pre>\n<h3><span id=\"Flask_Icin_Gunicorn_Kullanimi\">Flask \u0130\u00e7in Gunicorn Kullan\u0131m\u0131<\/span><\/h3>\n<p>Flask uygulamas\u0131nda da mant\u0131k ayn\u0131d\u0131r. Uygulaman\u0131z <code>app.py<\/code> i\u00e7inde <code>app<\/code> isimli bir Flask instance\u2019\u0131 tan\u0131ml\u0131yorsa, Gunicorn komutu \u015f\u00f6yle olur:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">gunicorn &quot;app:app&quot; --bind unix:\/run\/gunicorn-flask.sock --workers 3<\/code><\/pre>\n<p>Systemd servis dosyas\u0131nda sadece <code>ExecStart<\/code> sat\u0131r\u0131n\u0131 Flask\u2019a g\u00f6re de\u011fi\u015ftirirsiniz. \u00d6rne\u011fin:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">ExecStart=\/srv\/flaskapp\/venv\/bin\/gunicorn \n  --workers 3 \n  --bind unix:\/run\/gunicorn-flask.sock \n  app:app<\/code><\/pre>\n<h3><span id=\"Django_ASGI_veya_Async_Uygulamalar_Icin_UvicornGunicorn_Kombinasyonu\">Django ASGI veya Async Uygulamalar \u0130\u00e7in Uvicorn\/Gunicorn Kombinasyonu<\/span><\/h3>\n<p>Django Channels, WebSocket veya yo\u011fun async IO kullan\u0131yorsan\u0131z, ASGI taraf\u0131na ge\u00e7mek mant\u0131kl\u0131d\u0131r. En yayg\u0131n \u00fcretim deseni, <code>gunicorn<\/code> + <code>uvicorn.workers.UvicornWorker<\/code> kombinasyonudur:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">pip install uvicorn[standard]\n\n# ASGI entry point genelde config.asgi:application olur\ngunicorn config.asgi:application \n  -k uvicorn.workers.UvicornWorker \n  --workers 4 \n  --bind unix:\/run\/uvicorn-myproject.sock<\/code><\/pre>\n<p>Systemd dosyas\u0131 da benzer \u015fekilde g\u00fcncellenir. Burada <code>-k<\/code> ile worker s\u0131n\u0131f\u0131n\u0131 Uvicorn olarak belirtiyorsunuz. Daha fazla e\u015fzamanl\u0131 ba\u011flant\u0131, WebSocket ve async i\u015flemler i\u00e7in bu yap\u0131 \u00f6nemli fark yarat\u0131r.<\/p>\n<h2><span id=\"Nginx_Reverse_Proxy_ve_StatikMedia_Dosyalari\">Nginx Reverse Proxy ve Statik\/Media Dosyalar\u0131<\/span><\/h2>\n<p>Gunicorn\/Uvicorn do\u011frudan internete a\u00e7\u0131lmaz; bunun yerine Nginx \u00fczerinden proxy yap\u0131l\u0131r. Ayn\u0131 zamanda <code>\/static\/<\/code> ve <code>\/media\/<\/code> alt\u0131ndaki dosyalar\u0131 Nginx do\u011frudan servis eder; b\u00f6ylece Python proseslerine gereksiz y\u00fck binmez.<\/p>\n<p>Basit bir Nginx server blo\u011fu \u015f\u00f6yle olabilir:<\/p>\n<pre class=\"language-nginx line-numbers\"><code class=\"language-nginx\">server {\n    listen 80;\n    server_name ornek.com www.ornek.com;\n\n    # HTTP'den HTTPS'ye y\u00f6nlendirme (SSL kurduktan sonra)\n    # return 301 https:\/\/$host$request_uri;\n\n    location \/static\/ {\n        alias \/srv\/myproject\/static\/;\n    }\n\n    location \/media\/ {\n        alias \/srv\/myproject\/media\/;\n    }\n\n    location \/ {\n        include proxy_params;\n        proxy_pass http:\/\/unix:\/run\/gunicorn-myproject.sock;\n    }\n}<\/code><\/pre>\n<p>Dikkat edilmesi gerekenler:<\/p>\n<ul>\n<li><code>alias<\/code> yolunun <code>collectstatic<\/code> veya kulland\u0131\u011f\u0131n\u0131z build s\u00fcrecine g\u00f6re do\u011fru dizini g\u00f6stermesi gerekir.<\/li>\n<li><code>proxy_params<\/code> dosyas\u0131nda X-Forwarded-* ba\u015fl\u0131klar\u0131n\u0131n do\u011fru ayarl\u0131 oldu\u011fundan emin olun.<\/li>\n<li>Unix socket yolunun, systemd servis dosyas\u0131ndaki yol ile birebir ayn\u0131 olmas\u0131 gerekir.<\/li>\n<\/ul>\n<p>Nginx taraf\u0131nda cache, rate limiting ve daha geli\u015fmi\u015f proxy senaryolar\u0131na ihtiyac\u0131n\u0131z varsa, <a href=\"https:\/\/www.dchost.com\/blog\/nginx-reverse-proxy-ve-basit-load-balancer-kurulumu-kucuk-projeler-icin-uygulamali-rehber\/\">Nginx reverse proxy ve load balancer rehberimizde<\/a> daha kapsaml\u0131 \u00f6rnekler ve mimari desenler bulabilirsiniz.<\/p>\n<h2><span id=\"SSL_HTTPS_ve_Guvenlik_Basliklari\">SSL, HTTPS ve G\u00fcvenlik Ba\u015fl\u0131klar\u0131<\/span><\/h2>\n<p>Modern bir Django\/Flask uygulamas\u0131n\u0131n HTTP \u00fczerinde kalmas\u0131 art\u0131k ger\u00e7ek\u00e7i de\u011fil. Kullan\u0131c\u0131 oturum \u00e7erezleri, giri\u015f formlar\u0131, API istekleri ve SEO a\u00e7\u0131s\u0131ndan HTTPS zorunlu hale geldi. DCHost \u00fczerinde bar\u0131nd\u0131rd\u0131\u011f\u0131n\u0131z VPS i\u00e7in Let\u2019s Encrypt veya \u00fccretli bir <a href=\"https:\/\/www.dchost.com\/tr\/ssl\">SSL sertifikas\u0131<\/a> kullanabilirsiniz; kurulum mant\u0131\u011f\u0131 benzer.<\/p>\n<h3><span id=\"Lets_Encrypt_ile_Temel_SSL_Kurulumu\">Let\u2019s Encrypt ile Temel SSL Kurulumu<\/span><\/h3>\n<p>\u00d6rnek olarak Debian\/Ubuntu \u00fczerinde <code>certbot<\/code> kullanal\u0131m:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">sudo apt install -y certbot python3-certbot-nginx\nsudo certbot --nginx -d ornek.com -d www.ornek.com<\/code><\/pre>\n<p>Certbot, Nginx konfig\u00fcrasyonunuzu tarar, uygun server bloklar\u0131n\u0131 bulur ve gerekli <code>ssl_certificate<\/code>, <code>ssl_certificate_key<\/code> sat\u0131rlar\u0131n\u0131 ekler. Ard\u0131ndan otomatik yenileme i\u00e7in cron\/systemd timer kurar.<\/p>\n<p>El ile Nginx i\u00e7ine eklemek isterseniz, SSL\u2019li bir blok a\u015fa\u011f\u0131 yukar\u0131 \u015f\u00f6yle g\u00f6r\u00fcn\u00fcr:<\/p>\n<pre class=\"language-nginx line-numbers\"><code class=\"language-nginx\">server {\n    listen 443 ssl http2;\n    server_name ornek.com www.ornek.com;\n\n    ssl_certificate \/etc\/letsencrypt\/live\/ornek.com\/fullchain.pem;\n    ssl_certificate_key \/etc\/letsencrypt\/live\/ornek.com\/privkey.pem;\n\n    # G\u00fcvenlik ba\u015fl\u0131klar\u0131 (\u00f6rnek)\n    add_header Strict-Transport-Security &quot;max-age=31536000; includeSubDomains&quot; always;\n    add_header X-Frame-Options &quot;SAMEORIGIN&quot; always;\n    add_header X-Content-Type-Options &quot;nosniff&quot; always;\n\n    location \/static\/ {\n        alias \/srv\/myproject\/static\/;\n    }\n\n    location \/media\/ {\n        alias \/srv\/myproject\/media\/;\n    }\n\n    location \/ {\n        include proxy_params;\n        proxy_pass http:\/\/unix:\/run\/gunicorn-myproject.sock;\n    }\n}<\/code><\/pre>\n<h3><span id=\"HTTPden_HTTPSye_Yonlendirme_ve_Guvenlik_Basliklari\">HTTP\u2019den HTTPS\u2019ye Y\u00f6nlendirme ve G\u00fcvenlik Ba\u015fl\u0131klar\u0131<\/span><\/h3>\n<p>SSL kurduktan sonra, 80 portundaki t\u00fcm trafi\u011fi 443\u2019e y\u00f6nlendirmek gerekir:<\/p>\n<pre class=\"language-nginx line-numbers\"><code class=\"language-nginx\">server {\n    listen 80;\n    server_name ornek.com www.ornek.com;\n    return 301 https:\/\/$host$request_uri;\n}<\/code><\/pre>\n<p>HSTS, CSP, X-Frame-Options gibi HTTP g\u00fcvenlik ba\u015fl\u0131klar\u0131 hem taray\u0131c\u0131 g\u00fcvenli\u011fi hem de uyumluluk a\u00e7\u0131s\u0131ndan \u00f6nemlidir. Bu ba\u015fl\u0131klar\u0131 detayl\u0131 a\u00e7\u0131klamalar, \u00f6rnek Nginx\/Apache konfig\u00fcrasyonlar\u0131 ve hangi senaryoda hangisini nas\u0131l ayarlaman\u0131z gerekti\u011fiyle birlikte g\u00f6rmek i\u00e7in <a href=\"https:\/\/www.dchost.com\/blog\/http-guvenlik-basliklari-rehberi-hsts-csp-x-frame-options-ve-referrer-policy-dogru-nasil-kurulur\/\">HTTP g\u00fcvenlik ba\u015fl\u0131klar\u0131 rehberimizi<\/a> mutlaka incelemenizi \u00f6neririz.<\/p>\n<h2><span id=\"Guvenlik_Loglama_ve_Otomatik_Deploy_Uretim_Ipuclari\">G\u00fcvenlik, Loglama ve Otomatik Deploy: \u00dcretim \u0130pu\u00e7lar\u0131<\/span><\/h2>\n<h3><span id=\"VPS_Guvenlik_Sertlestirme\">VPS G\u00fcvenlik Sertle\u015ftirme<\/span><\/h3>\n<p>Uygulaman\u0131z ne kadar g\u00fczel olursa olsun, SSH portu a\u00e7\u0131k, root \u015fifresi tahmin edilebilir ve firewall kapal\u0131 bir VPS uzun s\u00fcre ayakta kalmaz. DCHost taraf\u0131nda yeni bir Python projesi i\u00e7in VPS haz\u0131rlarken genelde \u015fu ad\u0131mlar\u0131 at\u0131yoruz:<\/p>\n<ul>\n<li>SSH i\u00e7in parola giri\u015fini kapat\u0131p sadece anahtar ile eri\u015fimi zorunlu k\u0131lmak.<\/li>\n<li><code>ufw<\/code> veya <code>firewalld<\/code> ile sadece gerekli portlar\u0131 (22, 80, 443 vb.) a\u00e7mak.<\/li>\n<li><code>fail2ban<\/code> ile SSH ve Nginx brute-force denemelerini k\u0131s\u0131tlamak.<\/li>\n<li>Root kullan\u0131c\u0131 ile do\u011frudan giri\u015f yerine sudo yetkili ayr\u0131 bir kullan\u0131c\u0131 kullanmak.<\/li>\n<\/ul>\n<p>Bu ba\u015fl\u0131klar\u0131 tek tek uygulamak i\u00e7in haz\u0131r bir kontrol listesine ihtiyac\u0131n\u0131z varsa, ad\u0131m ad\u0131m \u00f6rneklerle anlatt\u0131\u011f\u0131m\u0131z <a href=\"https:\/\/www.dchost.com\/blog\/vps-guvenlik-sertlestirme-kontrol-listesi-sshd_config-fail2ban-ve-root-erisimini-kapatmak\/\">VPS g\u00fcvenlik sertle\u015ftirme rehberimizi<\/a> referans alabilirsiniz.<\/p>\n<h3><span id=\"Loglama_logrotate_ve_Izlenebilirlik\">Loglama, logrotate ve \u0130zlenebilirlik<\/span><\/h3>\n<p>Django\/Flask + Gunicorn\/Uvicorn + Nginx \u00fc\u00e7l\u00fcs\u00fcnde tipik log kaynaklar\u0131:<\/p>\n<ul>\n<li>Nginx eri\u015fim ve hata loglar\u0131 (<code>\/var\/log\/nginx\/access.log<\/code>, <code>error.log<\/code>).<\/li>\n<li>Gunicorn\/Uvicorn stdout\/stderr loglar\u0131 (systemd journal veya ayr\u0131 dosyalar).<\/li>\n<li>Uygulama seviyesinde Django\/Flask log\u2019lar\u0131 (\u00f6rn. dosyaya veya syslog\u2019a).<\/li>\n<\/ul>\n<p>Loglar\u0131n disk doldurmamas\u0131 i\u00e7in <code>logrotate<\/code> yap\u0131land\u0131rmas\u0131 kritik. \u00d6zellikle <code>DEBUG<\/code> seviyesinde log yazan projelerde NVMe diskinizi gereksiz yere t\u00fcketmemek i\u00e7in rotasyon, s\u0131k\u0131\u015ft\u0131rma ve saklama s\u00fcrelerini planlay\u0131n. DCHost \u00fczerindeki izleme ve yedek altyap\u0131lar\u0131yla log stratejinizi birle\u015ftirerek hem KVKK\/GDPR uyumlulu\u011funu hem de performans\u0131 dengeleyebilirsiniz.<\/p>\n<h3><span id=\"CICD_ile_Otomatik_Deploy\">CI\/CD ile Otomatik Deploy<\/span><\/h3>\n<p>Production ortam\u0131nda SSH ile sunucuya girip manuel <code>git pull<\/code> komutlar\u0131 \u00e7al\u0131\u015ft\u0131rmak hem hata riski y\u00fcksek hem de s\u00fcrd\u00fcr\u00fclebilir de\u011fil. Django\/Flask projelerinizde tipik bir pratik, GitHub Actions veya benzeri CI\/CD ara\u00e7lar\u0131 ile:<\/p>\n<ul>\n<li>Testleri ko\u015fturmak,<\/li>\n<li>Build ad\u0131mlar\u0131n\u0131 (\u00f6r. frontend, collectstatic) \u00e7al\u0131\u015ft\u0131rmak,<\/li>\n<li>VPS\u2019e SSH veya rsync ile da\u011f\u0131t\u0131m yapmak,<\/li>\n<li>Son a\u015famada <code>systemctl restart gunicorn-myproject<\/code> gibi bir komutla yeni s\u00fcr\u00fcm\u00fc devreye almak.<\/li>\n<\/ul>\n<p>GitHub Actions ile VPS\u2019e g\u00fcvenli ve s\u0131f\u0131ra yak\u0131n kesintiyle deploy \u00f6rneklerini ad\u0131m ad\u0131m g\u00f6rmek isterseniz, haz\u0131r YAML \u00f6rnekleri ve <code>systemd<\/code> tabanl\u0131 s\u00fcr\u00fcmleme stratejileri payla\u015ft\u0131\u011f\u0131m\u0131z <a href=\"https:\/\/www.dchost.com\/blog\/github-actions-ile-vpse-otomatik-deploy-ve-zero-downtime-yayin\/\">GitHub Actions ile VPS\u2019e otomatik deploy rehberimize<\/a> g\u00f6z atabilirsiniz.<\/p>\n<h2><span id=\"Sonuc_ve_DCHost_Uzerinde_Yol_Haritaniz\">Sonu\u00e7 ve DCHost \u00dczerinde Yol Haritan\u0131z<\/span><\/h2>\n<p>Django ve Flask uygulamalar\u0131n\u0131 \u00fcretim ortam\u0131na ta\u015f\u0131rken as\u0131l zorluk genelde framework\u2019te de\u011fil, etraf\u0131ndaki ekosistemi do\u011fru kurmakta ortaya \u00e7\u0131k\u0131yor. Bir yanda Gunicorn veya Uvicorn worker say\u0131lar\u0131, di\u011fer yanda Nginx reverse proxy, SSL, HTTP\/2, g\u00fcvenlik ba\u015fl\u0131klar\u0131, firewall, loglama ve yedek stratejileri\u2026 DCHost olarak g\u00fcnl\u00fck operasyonlar\u0131m\u0131zda \u015funu g\u00f6r\u00fcyoruz: Temel mimariyi ba\u015ftan do\u011fru kuran ekipler, ileride \u00f6l\u00e7ekleme ve g\u00fcvenlik taraf\u0131nda \u00e7ok daha az s\u00fcrpriz ya\u015f\u0131yor.<\/p>\n<p>Bu rehberde, tek bir DCHost VPS \u00fczerinde Django\/Flask + Gunicorn\/Uvicorn + Nginx + SSL kombinasyonuyla:<\/p>\n<ul>\n<li>Do\u011fru kaynak planlamas\u0131 ve Linux da\u011f\u0131t\u0131m\u0131 se\u00e7imini,<\/li>\n<li>Gunicorn\/Uvicorn i\u00e7in systemd servisleri \u00fczerinden kal\u0131c\u0131 servis y\u00f6netimini,<\/li>\n<li>Nginx ile reverse proxy, statik\/media servis ve HTTPS terminasyonunu,<\/li>\n<li>G\u00fcvenlik sertle\u015ftirme, loglama ve otomatik deploy pratiklerini<\/li>\n<\/ul>\n<p>\u00f6zetlemeye \u00e7al\u0131\u015ft\u0131k. E\u011fer halen mimarinizden veya VPS se\u00e7iminizden emin de\u011filseniz, DCHost \u00fczerinde sundu\u011fumuz VPS, <a href=\"https:\/\/www.dchost.com\/tr\/fiziksel-sunucu\">dedicated sunucu<\/a> ve colocation altyap\u0131lar\u0131yla Python projelerinizi birlikte planlayabiliriz. \u0130ster ilk Django projenizi canl\u0131ya al\u0131yor olun, ister mevcut bir Flask API\u2019yi daha performansl\u0131 ve g\u00fcvenli bir ortama ta\u015f\u0131mak isteyin; bu yaz\u0131daki ad\u0131mlar\u0131 uygulayarak sa\u011flam bir temel olu\u015fturabilir, detayl\u0131 optimizasyon i\u00e7in de blogumuzdaki di\u011fer VPS, g\u00fcvenlik ve SSL rehberleriyle mimarinizi ad\u0131m ad\u0131m olgunla\u015ft\u0131rabilirsiniz.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Django veya Flask ile geli\u015ftirdi\u011finiz bir projeyi ger\u00e7ek kullan\u0131c\u0131lar\u0131n g\u00f6rece\u011fi \u00fcretim ortam\u0131na ta\u015f\u0131rken, en \u00e7ok tak\u0131lan noktalardan biri genelde \u015furas\u0131 oluyor: &#8220;Bu uygulamay\u0131 VPS\u2019e nas\u0131l d\u00fczg\u00fcnce kurar\u0131m, Nginx, Gunicorn\/Uvicorn ve SSL ayarlar\u0131n\u0131 nereden tutmaya ba\u015flar\u0131m?&#8221; \u00d6zellikle geli\u015ftirme ortam\u0131nda python manage.py runserver ya da flask run ile her \u015fey yolunda giderken, \u00fcretim taraf\u0131nda performans, g\u00fcvenlik ve [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4993,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-4992","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-teknoloji"],"_links":{"self":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/4992","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/comments?post=4992"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/4992\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/4993"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=4992"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=4992"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=4992"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}